diff --git a/patches/chromium/printing.patch b/patches/chromium/printing.patch index ddeb29e89c584..c5f916ef5bfb7 100644 --- a/patches/chromium/printing.patch +++ b/patches/chromium/printing.patch @@ -600,24 +600,6 @@ index 71c0c15217b62cd7a6087c6d9ae50481f9041d5f..18d853d7f808aaf816de86e8c5b82317 #if BUILDFLAG(ENABLE_PRINT_PREVIEW) // Set options for print preset from source PDF document. -diff --git a/printing/print_settings_conversion.cc b/printing/print_settings_conversion.cc -index 17c363ff9aa2e2262cacd0c9baea3820334bf67b..5b02461c2e9afe254405ddacd904e4bdbddd0b8b 100644 ---- a/printing/print_settings_conversion.cc -+++ b/printing/print_settings_conversion.cc -@@ -184,11 +184,12 @@ bool PrintSettingsFromJobSettings(const base::Value& job_settings, - - settings->set_dpi_xy(dpi_horizontal.value(), dpi_vertical.value()); - #endif -+ if (!device_name->empty()) -+ settings->set_device_name(base::UTF8ToUTF16(*device_name)); - - settings->set_collate(collate.value()); - settings->set_copies(copies.value()); - settings->SetOrientation(landscape.value()); -- settings->set_device_name(base::UTF8ToUTF16(*device_name)); - settings->set_duplex_mode(static_cast(duplex_mode.value())); - settings->set_color(static_cast(color.value())); - settings->set_scale_factor(static_cast(scale_factor.value()) / 100.0); diff --git a/printing/printing_context.cc b/printing/printing_context.cc index cd5c27c87df175676504a06b4e1904f6b836dc90..c4f6acf66bc69f1e7db633aa5b3b03a913ffb666 100644 --- a/printing/printing_context.cc diff --git a/shell/browser/api/atom_api_web_contents.cc b/shell/browser/api/atom_api_web_contents.cc index d5404c9b68b2c..eeb869b0b9940 100644 --- a/shell/browser/api/atom_api_web_contents.cc +++ b/shell/browser/api/atom_api_web_contents.cc @@ -113,15 +113,6 @@ #include "ui/gfx/font_render_params.h" #endif -#if BUILDFLAG(ENABLE_PRINTING) -#include "chrome/browser/printing/print_view_manager_basic.h" -#include "components/printing/common/print_messages.h" - -#if defined(OS_WIN) -#include "printing/backend/win_helper.h" -#endif -#endif - #if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS) #include "shell/browser/extensions/atom_extension_web_contents_observer.h" #endif @@ -335,6 +326,16 @@ bool IsDeviceNameValid(const base::string16& device_name) { #endif return true; } + +base::string16 GetDefaultPrinterAsync() { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + + scoped_refptr backend = + printing::PrintBackend::CreateInstance(nullptr); + std::string printer_name = backend->GetDefaultPrinterName(); + return base::UTF8ToUTF16(printer_name); +} #endif } // namespace @@ -1670,6 +1671,30 @@ bool WebContents::IsCurrentlyAudible() { } #if BUILDFLAG(ENABLE_PRINTING) +void WebContents::OnGetDefaultPrinter( + base::DictionaryValue print_settings, + printing::CompletionCallback print_callback, + base::string16 device_name, + bool silent, + base::string16 default_printer) { + base::string16 printer_name = + device_name.empty() ? default_printer : device_name; + print_settings.SetStringKey(printing::kSettingDeviceName, printer_name); + + auto* print_view_manager = + printing::PrintViewManagerBasic::FromWebContents(web_contents()); + auto* focused_frame = web_contents()->GetFocusedFrame(); + auto* rfh = focused_frame && focused_frame->HasSelection() + ? focused_frame + : web_contents()->GetMainFrame(); + + print_view_manager->PrintNow( + rfh, + std::make_unique(rfh->GetRoutingID(), silent, + std::move(print_settings)), + std::move(print_callback)); +} + void WebContents::Print(mate::Arguments* args) { mate::Dictionary options = mate::Dictionary::CreateEmpty(args->isolate()); base::DictionaryValue settings; @@ -1733,15 +1758,15 @@ void WebContents::Print(mate::Arguments* args) { options.Get("landscape", &landscape); settings.SetBoolean(printing::kSettingLandscape, landscape); - // We set the default to empty string here and only update - // if at the Chromium level if it's non-empty + // We set the default to the system's default printer and only update + // if at the Chromium level if the user overrides. + // Printer device name as opened by the OS. base::string16 device_name; options.Get("deviceName", &device_name); if (!device_name.empty() && !IsDeviceNameValid(device_name)) { args->ThrowError("webContents.print(): Invalid deviceName provided."); return; } - settings.SetString(printing::kSettingDeviceName, device_name); int scale_factor = 100; options.Get("scaleFactor", &scale_factor); @@ -1808,16 +1833,13 @@ void WebContents::Print(mate::Arguments* args) { settings.SetInteger(printing::kSettingDpiVertical, dpi); } - auto* print_view_manager = - printing::PrintViewManagerBasic::FromWebContents(web_contents()); - auto* focused_frame = web_contents()->GetFocusedFrame(); - auto* rfh = focused_frame && focused_frame->HasSelection() - ? focused_frame - : web_contents()->GetMainFrame(); - print_view_manager->PrintNow(rfh, - std::make_unique( - rfh->GetRoutingID(), silent, settings), - std::move(callback)); + base::PostTaskAndReplyWithResult( + FROM_HERE, + {base::ThreadPool(), base::MayBlock(), base::TaskPriority::USER_BLOCKING}, + base::BindOnce(&GetDefaultPrinterAsync), + base::BindOnce(&WebContents::OnGetDefaultPrinter, + weak_factory_.GetWeakPtr(), std::move(settings), + std::move(callback), device_name, silent)); } std::vector WebContents::GetPrinterList() { diff --git a/shell/browser/api/atom_api_web_contents.h b/shell/browser/api/atom_api_web_contents.h index a8d3e8a043a8e..3cf4e1627c395 100644 --- a/shell/browser/api/atom_api_web_contents.h +++ b/shell/browser/api/atom_api_web_contents.h @@ -31,8 +31,14 @@ #include "ui/gfx/image/image.h" #if BUILDFLAG(ENABLE_PRINTING) +#include "chrome/browser/printing/print_view_manager_basic.h" +#include "components/printing/common/print_messages.h" #include "printing/backend/print_backend.h" #include "shell/browser/printing/print_preview_message_handler.h" + +#if defined(OS_WIN) +#include "printing/backend/win_helper.h" +#endif #endif namespace blink { @@ -181,6 +187,11 @@ class WebContents : public mate::TrackableObject, v8::Local GetNativeView() const; #if BUILDFLAG(ENABLE_PRINTING) + void OnGetDefaultPrinter(base::Value print_settings, + printing::CompletionCallback print_callback, + base::string16 device_name, + bool silent, + base::string16 default_printer); void Print(mate::Arguments* args); std::vector GetPrinterList(); // Print current page as PDF.