diff --git a/lib/browser/api/web-contents.ts b/lib/browser/api/web-contents.ts index a81dd7d5ae7..14879f3fdd7 100644 --- a/lib/browser/api/web-contents.ts +++ b/lib/browser/api/web-contents.ts @@ -263,8 +263,17 @@ WebContents.prototype.print = function (options: ElectronInternal.WebContentsPri throw new TypeError('webContents.print(): Invalid print settings specified.'); } - const pageSize = options.pageSize ?? 'A4'; - if (typeof pageSize === 'object') { + const { pageSize } = options; + if (typeof pageSize === 'string' && PDFPageSizes[pageSize]) { + const mediaSize = PDFPageSizes[pageSize]; + options.mediaSize = { + ...mediaSize, + imageable_area_left_microns: 0, + imageable_area_bottom_microns: 0, + imageable_area_right_microns: mediaSize.width_microns, + imageable_area_top_microns: mediaSize.height_microns + }; + } else if (typeof pageSize === 'object') { if (!pageSize.height || !pageSize.width) { throw new Error('height and width properties are required for pageSize'); } @@ -286,16 +295,7 @@ WebContents.prototype.print = function (options: ElectronInternal.WebContentsPri imageable_area_right_microns: width, imageable_area_top_microns: height }; - } else if (typeof pageSize === 'string' && PDFPageSizes[pageSize]) { - const mediaSize = PDFPageSizes[pageSize]; - options.mediaSize = { - ...mediaSize, - imageable_area_left_microns: 0, - imageable_area_bottom_microns: 0, - imageable_area_right_microns: mediaSize.width_microns, - imageable_area_top_microns: mediaSize.height_microns - }; - } else { + } else if (pageSize !== undefined) { throw new Error(`Unsupported pageSize: ${pageSize}`); } diff --git a/shell/browser/api/electron_api_web_contents.cc b/shell/browser/api/electron_api_web_contents.cc index 349eb5d1f7a..0779c4919b2 100644 --- a/shell/browser/api/electron_api_web_contents.cc +++ b/shell/browser/api/electron_api_web_contents.cc @@ -2944,9 +2944,8 @@ void OnGetDeviceNameToUse(base::WeakPtr web_contents, return; } - // If the user has passed a deviceName use it, otherwise use default printer. + // Use user-passed deviceName, otherwise default printer. print_settings.Set(printing::kSettingDeviceName, info.second); - if (!print_settings.FindInt(printing::kSettingDpiHorizontal)) { gfx::Size dpi = GetDefaultPrinterDPI(info.second); print_settings.Set(printing::kSettingDpiHorizontal, dpi.width()); @@ -3005,6 +3004,17 @@ void WebContents::Print(gin::Arguments* args) { return; } + if (options.IsEmptyObject()) { + auto* print_view_manager = + PrintViewManagerElectron::FromWebContents(web_contents()); + if (!print_view_manager) + return; + + content::RenderFrameHost* rfh = GetRenderFrameHostToUse(web_contents()); + print_view_manager->PrintNow(rfh, std::move(settings), std::move(callback)); + return; + } + // Set optional silent printing. bool silent = false; options.Get("silent", &silent); diff --git a/shell/common/gin_helper/dictionary.h b/shell/common/gin_helper/dictionary.h index e51ddd623a4..589c24d1f73 100644 --- a/shell/common/gin_helper/dictionary.h +++ b/shell/common/gin_helper/dictionary.h @@ -183,6 +183,16 @@ class Dictionary : public gin::Dictionary { bool IsEmpty() const { return isolate() == nullptr || GetHandle().IsEmpty(); } + bool IsEmptyObject() const { + if (IsEmpty()) + return true; + + v8::Local context = isolate()->GetCurrentContext(); + v8::Local props = + GetHandle()->GetOwnPropertyNames(context).ToLocalChecked(); + return props->Length() == 0; + } + v8::Local GetHandle() const { return gin::ConvertToV8(isolate(), *static_cast(this))