Upload upstream chromium 73.0.3683.0
[platform/framework/web/chromium-efl.git] / printing / printing_context_linux.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "printing/printing_context_linux.h"
6
7 #include <memory>
8 #include <utility>
9
10 #include "base/logging.h"
11 #include "base/memory/ptr_util.h"
12 #include "base/values.h"
13 #include "printing/metafile.h"
14 #include "printing/print_dialog_gtk_interface.h"
15 #include "printing/print_job_constants.h"
16 #include "printing/units.h"
17
18 namespace printing {
19
20 namespace {
21
22 // Function pointer for creating print dialogs. |callback| is only used when
23 // |show_dialog| is true.
24 PrintDialogGtkInterface* (*create_dialog_func_)(PrintingContextLinux* context) =
25     nullptr;
26
27 // Function pointer for determining paper size.
28 gfx::Size (*get_pdf_paper_size_)(PrintingContextLinux* context) = nullptr;
29
30 }  // namespace
31
32 // static
33 std::unique_ptr<PrintingContext> PrintingContext::Create(Delegate* delegate) {
34   return base::WrapUnique(new PrintingContextLinux(delegate));
35 }
36
37 PrintingContextLinux::PrintingContextLinux(Delegate* delegate)
38     : PrintingContext(delegate), print_dialog_(nullptr) {}
39
40 PrintingContextLinux::~PrintingContextLinux() {
41   ReleaseContext();
42
43   if (print_dialog_)
44     print_dialog_->ReleaseDialog();
45 }
46
47 // static
48 void PrintingContextLinux::SetCreatePrintDialogFunction(
49     PrintDialogGtkInterface* (*create_dialog_func)(
50         PrintingContextLinux* context)) {
51   DCHECK(create_dialog_func);
52   DCHECK(!create_dialog_func_);
53   create_dialog_func_ = create_dialog_func;
54 }
55
56 // static
57 void PrintingContextLinux::SetPdfPaperSizeFunction(
58     gfx::Size (*get_pdf_paper_size)(PrintingContextLinux* context)) {
59   DCHECK(get_pdf_paper_size);
60   DCHECK(!get_pdf_paper_size_);
61   get_pdf_paper_size_ = get_pdf_paper_size;
62 }
63
64 void PrintingContextLinux::PrintDocument(const MetafilePlayer& metafile) {
65   DCHECK(print_dialog_);
66   print_dialog_->PrintDocument(metafile, document_name_);
67 }
68
69 void PrintingContextLinux::AskUserForSettings(int max_pages,
70                                               bool has_selection,
71                                               bool is_scripted,
72                                               PrintSettingsCallback callback) {
73   if (!print_dialog_) {
74     // Can only get here if the renderer is sending bad messages.
75     // http://crbug.com/341777
76     NOTREACHED();
77     std::move(callback).Run(FAILED);
78     return;
79   }
80
81   print_dialog_->ShowDialog(delegate_->GetParentView(), has_selection,
82                             std::move(callback));
83 }
84
85 PrintingContext::Result PrintingContextLinux::UseDefaultSettings() {
86   DCHECK(!in_print_job_);
87
88   ResetSettings();
89
90   if (!create_dialog_func_)
91     return OK;
92
93   if (!print_dialog_) {
94     print_dialog_ = create_dialog_func_(this);
95     print_dialog_->AddRefToDialog();
96   }
97   print_dialog_->UseDefaultSettings();
98
99   return OK;
100 }
101
102 gfx::Size PrintingContextLinux::GetPdfPaperSizeDeviceUnits() {
103   if (get_pdf_paper_size_)
104     return get_pdf_paper_size_(this);
105
106   return gfx::Size();
107 }
108
109 PrintingContext::Result PrintingContextLinux::UpdatePrinterSettings(
110     bool external_preview,
111     bool show_system_dialog,
112     int page_count) {
113   DCHECK(!show_system_dialog);
114   DCHECK(!in_print_job_);
115   DCHECK(!external_preview) << "Not implemented";
116
117   if (!create_dialog_func_)
118     return OK;
119
120   if (!print_dialog_) {
121     print_dialog_ = create_dialog_func_(this);
122     print_dialog_->AddRefToDialog();
123   }
124
125   print_dialog_->UpdateSettings(&settings_);
126   return OK;
127 }
128
129 void PrintingContextLinux::InitWithSettings(const PrintSettings& settings) {
130   DCHECK(!in_print_job_);
131
132   settings_ = settings;
133 }
134
135 PrintingContext::Result PrintingContextLinux::NewDocument(
136     const base::string16& document_name) {
137   DCHECK(!in_print_job_);
138   in_print_job_ = true;
139
140   document_name_ = document_name;
141
142   return OK;
143 }
144
145 PrintingContext::Result PrintingContextLinux::NewPage() {
146   if (abort_printing_)
147     return CANCEL;
148   DCHECK(in_print_job_);
149
150   // Intentional No-op.
151
152   return OK;
153 }
154
155 PrintingContext::Result PrintingContextLinux::PageDone() {
156   if (abort_printing_)
157     return CANCEL;
158   DCHECK(in_print_job_);
159
160   // Intentional No-op.
161
162   return OK;
163 }
164
165 PrintingContext::Result PrintingContextLinux::DocumentDone() {
166   if (abort_printing_)
167     return CANCEL;
168   DCHECK(in_print_job_);
169
170   ResetSettings();
171   return OK;
172 }
173
174 void PrintingContextLinux::Cancel() {
175   abort_printing_ = true;
176   in_print_job_ = false;
177 }
178
179 void PrintingContextLinux::ReleaseContext() {
180   // Intentional No-op.
181 }
182
183 printing::NativeDrawingContext PrintingContextLinux::context() const {
184   // Intentional No-op.
185   return nullptr;
186 }
187
188 }  // namespace printing