test_printing_context.cc 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. // Copyright 2021 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. #include "printing/test_printing_context.h"
  5. #include <memory>
  6. #include <utility>
  7. #include "base/check.h"
  8. #include "base/containers/flat_map.h"
  9. #include "base/notreached.h"
  10. #include "base/strings/utf_string_conversions.h"
  11. #include "build/build_config.h"
  12. #include "printing/backend/print_backend.h"
  13. #include "printing/buildflags/buildflags.h"
  14. #include "printing/mojom/print.mojom.h"
  15. #include "printing/print_settings.h"
  16. #include "printing/printing_context.h"
  17. #include "printing/units.h"
  18. #include "ui/gfx/geometry/size.h"
  19. #if BUILDFLAG(IS_WIN)
  20. #include "printing/printed_page_win.h"
  21. #endif
  22. namespace printing {
  23. TestPrintingContextDelegate::TestPrintingContextDelegate() = default;
  24. TestPrintingContextDelegate::~TestPrintingContextDelegate() = default;
  25. gfx::NativeView TestPrintingContextDelegate::GetParentView() {
  26. return nullptr;
  27. }
  28. std::string TestPrintingContextDelegate::GetAppLocale() {
  29. return std::string();
  30. }
  31. TestPrintingContext::TestPrintingContext(Delegate* delegate,
  32. bool skip_system_calls)
  33. : PrintingContext(delegate) {
  34. #if BUILDFLAG(ENABLE_OOP_PRINTING)
  35. if (skip_system_calls)
  36. set_skip_system_calls();
  37. #endif
  38. }
  39. TestPrintingContext::~TestPrintingContext() = default;
  40. void TestPrintingContext::SetDeviceSettings(
  41. const std::string& device_name,
  42. std::unique_ptr<PrintSettings> settings) {
  43. device_settings_.emplace(device_name, std::move(settings));
  44. }
  45. void TestPrintingContext::AskUserForSettings(int max_pages,
  46. bool has_selection,
  47. bool is_scripted,
  48. PrintSettingsCallback callback) {
  49. // Do not actually ask the user with a dialog, just pretend like user
  50. // made some kind of interaction.
  51. if (ask_user_for_settings_cancel_) {
  52. // Pretend the user hit the Cancel button.
  53. std::move(callback).Run(mojom::ResultCode::kCanceled);
  54. return;
  55. }
  56. // Pretend the user selected the default printer and used the default
  57. // settings for it.
  58. scoped_refptr<PrintBackend> print_backend =
  59. PrintBackend::CreateInstance(/*locale=*/std::string());
  60. std::string printer_name;
  61. if (print_backend->GetDefaultPrinterName(printer_name) !=
  62. mojom::ResultCode::kSuccess) {
  63. std::move(callback).Run(mojom::ResultCode::kFailed);
  64. return;
  65. }
  66. auto found = device_settings_.find(printer_name);
  67. if (found == device_settings_.end()) {
  68. std::move(callback).Run(mojom::ResultCode::kFailed);
  69. return;
  70. }
  71. settings_ = std::make_unique<PrintSettings>(*found->second);
  72. std::move(callback).Run(mojom::ResultCode::kSuccess);
  73. }
  74. mojom::ResultCode TestPrintingContext::UseDefaultSettings() {
  75. scoped_refptr<PrintBackend> print_backend =
  76. PrintBackend::CreateInstance(/*locale=*/std::string());
  77. if (use_default_settings_fails_)
  78. return mojom::ResultCode::kFailed;
  79. std::string printer_name;
  80. mojom::ResultCode result = print_backend->GetDefaultPrinterName(printer_name);
  81. if (result != mojom::ResultCode::kSuccess)
  82. return result;
  83. auto found = device_settings_.find(printer_name);
  84. if (found == device_settings_.end())
  85. return mojom::ResultCode::kFailed;
  86. settings_ = std::make_unique<PrintSettings>(*found->second);
  87. return mojom::ResultCode::kSuccess;
  88. }
  89. gfx::Size TestPrintingContext::GetPdfPaperSizeDeviceUnits() {
  90. // Default to A4 paper size, which is an alternative to Letter size that is
  91. // often used as the fallback size for some platform-specific
  92. // implementations.
  93. return gfx::Size(kA4WidthInch * settings_->device_units_per_inch(),
  94. kA4HeightInch * settings_->device_units_per_inch());
  95. }
  96. mojom::ResultCode TestPrintingContext::UpdatePrinterSettings(
  97. const PrinterSettings& printer_settings) {
  98. DCHECK(!in_print_job_);
  99. #if BUILDFLAG(IS_MAC)
  100. DCHECK(!printer_settings.external_preview) << "Not implemented";
  101. #endif
  102. DCHECK(!printer_settings.show_system_dialog) << "Not implemented";
  103. // The printer name is to be embedded in the printing context's existing
  104. // settings.
  105. const std::string& device_name = base::UTF16ToUTF8(settings_->device_name());
  106. auto found = device_settings_.find(device_name);
  107. if (found == device_settings_.end()) {
  108. DLOG(ERROR) << "No such device found in test printing context: `"
  109. << device_name << "`";
  110. return mojom::ResultCode::kFailed;
  111. }
  112. // Perform some initialization, akin to various platform-specific actions in
  113. // `InitPrintSettings()`.
  114. DVLOG(1) << "Updating context settings for device `" << device_name << "`";
  115. std::unique_ptr<PrintSettings> existing_settings = std::move(settings_);
  116. settings_ = std::make_unique<PrintSettings>(*found->second);
  117. settings_->set_dpi(existing_settings->dpi());
  118. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
  119. for (const auto& item : existing_settings->advanced_settings())
  120. settings_->advanced_settings().emplace(item.first, item.second.Clone());
  121. #endif
  122. return mojom::ResultCode::kSuccess;
  123. }
  124. mojom::ResultCode TestPrintingContext::NewDocument(
  125. const std::u16string& document_name) {
  126. DCHECK(!in_print_job_);
  127. abort_printing_ = false;
  128. in_print_job_ = true;
  129. if (!skip_system_calls() && new_document_blocked_by_permissions_)
  130. return mojom::ResultCode::kAccessDenied;
  131. // No-op.
  132. return mojom::ResultCode::kSuccess;
  133. }
  134. #if BUILDFLAG(IS_WIN)
  135. mojom::ResultCode TestPrintingContext::RenderPage(const PrintedPage& page,
  136. const PageSetup& page_setup) {
  137. if (abort_printing_)
  138. return mojom::ResultCode::kCanceled;
  139. DCHECK(in_print_job_);
  140. DVLOG(1) << "Render page " << page.page_number();
  141. if (render_page_blocked_by_permissions_)
  142. return mojom::ResultCode::kAccessDenied;
  143. // No-op.
  144. return mojom::ResultCode::kSuccess;
  145. }
  146. #endif // BUILDFLAG(IS_WIN)
  147. mojom::ResultCode TestPrintingContext::PrintDocument(
  148. const MetafilePlayer& metafile,
  149. const PrintSettings& settings,
  150. uint32_t num_pages) {
  151. if (abort_printing_)
  152. return mojom::ResultCode::kCanceled;
  153. DCHECK(in_print_job_);
  154. DVLOG(1) << "Print document";
  155. if (render_document_blocked_by_permissions_)
  156. return mojom::ResultCode::kAccessDenied;
  157. // No-op.
  158. return mojom::ResultCode::kSuccess;
  159. }
  160. mojom::ResultCode TestPrintingContext::DocumentDone() {
  161. DCHECK(in_print_job_);
  162. DVLOG(1) << "Document done";
  163. if (document_done_blocked_by_permissions_)
  164. return mojom::ResultCode::kAccessDenied;
  165. ResetSettings();
  166. return mojom::ResultCode::kSuccess;
  167. }
  168. void TestPrintingContext::Cancel() {
  169. abort_printing_ = true;
  170. in_print_job_ = false;
  171. DVLOG(1) << "Canceling print job";
  172. }
  173. void TestPrintingContext::ReleaseContext() {}
  174. printing::NativeDrawingContext TestPrintingContext::context() const {
  175. // No native context for test.
  176. return nullptr;
  177. }
  178. #if BUILDFLAG(IS_WIN)
  179. mojom::ResultCode TestPrintingContext::InitWithSettingsForTest(
  180. std::unique_ptr<PrintSettings> settings) {
  181. NOTIMPLEMENTED();
  182. return mojom::ResultCode::kFailed;
  183. }
  184. #endif // BUILDFLAG(IS_WIN)
  185. } // namespace printing