1 // Copyright 2021 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "printing/test_printing_context.h"
10 #include "base/check.h"
11 #include "base/containers/flat_map.h"
12 #include "base/notreached.h"
13 #include "base/strings/utf_string_conversions.h"
14 #include "build/build_config.h"
15 #include "printing/backend/print_backend.h"
16 #include "printing/buildflags/buildflags.h"
17 #include "printing/mojom/print.mojom.h"
18 #include "printing/print_settings.h"
19 #include "printing/printing_context.h"
20 #include "printing/units.h"
21 #include "ui/gfx/geometry/size.h"
24 #include "printing/printed_page_win.h"
29 TestPrintingContextDelegate::TestPrintingContextDelegate() = default;
31 TestPrintingContextDelegate::~TestPrintingContextDelegate() = default;
33 gfx::NativeView TestPrintingContextDelegate::GetParentView() {
37 std::string TestPrintingContextDelegate::GetAppLocale() {
41 TestPrintingContext::TestPrintingContext(Delegate* delegate,
42 bool skip_system_calls)
43 : PrintingContext(delegate) {
44 #if BUILDFLAG(ENABLE_OOP_PRINTING)
45 if (skip_system_calls)
46 set_skip_system_calls();
50 TestPrintingContext::~TestPrintingContext() = default;
52 void TestPrintingContext::SetDeviceSettings(
53 const std::string& device_name,
54 std::unique_ptr<PrintSettings> settings) {
55 device_settings_.emplace(device_name, std::move(settings));
58 void TestPrintingContext::AskUserForSettings(int max_pages,
61 PrintSettingsCallback callback) {
62 // Do not actually ask the user with a dialog, just pretend like user
63 // made some kind of interaction.
64 if (ask_user_for_settings_cancel_) {
65 // Pretend the user hit the Cancel button.
66 std::move(callback).Run(mojom::ResultCode::kCanceled);
70 // Pretend the user selected the default printer and used the default
72 scoped_refptr<PrintBackend> print_backend =
73 PrintBackend::CreateInstance(/*locale=*/std::string());
74 std::string printer_name;
75 if (print_backend->GetDefaultPrinterName(printer_name) !=
76 mojom::ResultCode::kSuccess) {
77 std::move(callback).Run(mojom::ResultCode::kFailed);
80 auto found = device_settings_.find(printer_name);
81 if (found == device_settings_.end()) {
82 std::move(callback).Run(mojom::ResultCode::kFailed);
85 settings_ = std::make_unique<PrintSettings>(*found->second);
86 std::move(callback).Run(mojom::ResultCode::kSuccess);
89 mojom::ResultCode TestPrintingContext::UseDefaultSettings() {
90 scoped_refptr<PrintBackend> print_backend =
91 PrintBackend::CreateInstance(/*locale=*/std::string());
92 if (use_default_settings_fails_)
93 return mojom::ResultCode::kFailed;
95 std::string printer_name;
96 mojom::ResultCode result = print_backend->GetDefaultPrinterName(printer_name);
97 if (result != mojom::ResultCode::kSuccess)
99 auto found = device_settings_.find(printer_name);
100 if (found == device_settings_.end())
101 return mojom::ResultCode::kFailed;
102 settings_ = std::make_unique<PrintSettings>(*found->second);
103 return mojom::ResultCode::kSuccess;
106 gfx::Size TestPrintingContext::GetPdfPaperSizeDeviceUnits() {
107 // Default to A4 paper size, which is an alternative to Letter size that is
108 // often used as the fallback size for some platform-specific
110 return gfx::Size(kA4WidthInch * settings_->device_units_per_inch(),
111 kA4HeightInch * settings_->device_units_per_inch());
114 mojom::ResultCode TestPrintingContext::UpdatePrinterSettings(
115 const PrinterSettings& printer_settings) {
116 DCHECK(!in_print_job_);
117 #if BUILDFLAG(IS_MAC)
118 DCHECK(!printer_settings.external_preview) << "Not implemented";
120 DCHECK(!printer_settings.show_system_dialog) << "Not implemented";
122 // The printer name is to be embedded in the printing context's existing
124 const std::string& device_name = base::UTF16ToUTF8(settings_->device_name());
125 auto found = device_settings_.find(device_name);
126 if (found == device_settings_.end()) {
127 DLOG(ERROR) << "No such device found in test printing context: `"
128 << device_name << "`";
129 return mojom::ResultCode::kFailed;
132 // Perform some initialization, akin to various platform-specific actions in
133 // `InitPrintSettings()`.
134 DVLOG(1) << "Updating context settings for device `" << device_name << "`";
135 std::unique_ptr<PrintSettings> existing_settings = std::move(settings_);
136 settings_ = std::make_unique<PrintSettings>(*found->second);
137 settings_->set_dpi(existing_settings->dpi());
138 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
139 for (const auto& item : existing_settings->advanced_settings())
140 settings_->advanced_settings().emplace(item.first, item.second.Clone());
143 return mojom::ResultCode::kSuccess;
146 mojom::ResultCode TestPrintingContext::NewDocument(
147 const std::u16string& document_name) {
148 DCHECK(!in_print_job_);
150 if (!new_document_called_.is_null())
151 new_document_called_.Run();
153 abort_printing_ = false;
154 in_print_job_ = true;
156 if (!skip_system_calls() && new_document_blocked_by_permissions_)
157 return mojom::ResultCode::kAccessDenied;
160 return mojom::ResultCode::kSuccess;
163 #if BUILDFLAG(IS_WIN)
164 mojom::ResultCode TestPrintingContext::RenderPage(const PrintedPage& page,
165 const PageSetup& page_setup) {
167 return mojom::ResultCode::kCanceled;
168 DCHECK(in_print_job_);
169 DVLOG(1) << "Render page " << page.page_number();
171 if (render_page_blocked_by_permissions_)
172 return mojom::ResultCode::kAccessDenied;
174 if (render_page_fail_for_page_number_.has_value() &&
175 *render_page_fail_for_page_number_ == page.page_number()) {
176 return mojom::ResultCode::kFailed;
180 return mojom::ResultCode::kSuccess;
182 #endif // BUILDFLAG(IS_WIN)
184 mojom::ResultCode TestPrintingContext::PrintDocument(
185 const MetafilePlayer& metafile,
186 const PrintSettings& settings,
187 uint32_t num_pages) {
189 return mojom::ResultCode::kCanceled;
190 DCHECK(in_print_job_);
191 DVLOG(1) << "Print document";
193 if (render_document_blocked_by_permissions_)
194 return mojom::ResultCode::kAccessDenied;
197 return mojom::ResultCode::kSuccess;
200 mojom::ResultCode TestPrintingContext::DocumentDone() {
201 DCHECK(in_print_job_);
202 DVLOG(1) << "Document done";
204 if (document_done_blocked_by_permissions_)
205 return mojom::ResultCode::kAccessDenied;
208 return mojom::ResultCode::kSuccess;
211 void TestPrintingContext::Cancel() {
212 abort_printing_ = true;
213 in_print_job_ = false;
214 DVLOG(1) << "Canceling print job";
216 void TestPrintingContext::ReleaseContext() {}
218 printing::NativeDrawingContext TestPrintingContext::context() const {
219 // No native context for test.
223 #if BUILDFLAG(IS_WIN)
224 mojom::ResultCode TestPrintingContext::InitWithSettingsForTest(
225 std::unique_ptr<PrintSettings> settings) {
227 return mojom::ResultCode::kFailed;
229 #endif // BUILDFLAG(IS_WIN)
231 } // namespace printing