From c8156c3c57ad8b6e19353725805843202977c1e7 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Thu, 28 Sep 2023 10:41:46 +0200 Subject: [PATCH] fix: failure on immutable `webContents.print(options)` (#39985) fix: failure on immutable webContents.print(options) --- lib/browser/api/web-contents.ts | 74 +++++++++++++++++---------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/lib/browser/api/web-contents.ts b/lib/browser/api/web-contents.ts index e97845d2ceec..b48624ea5958 100644 --- a/lib/browser/api/web-contents.ts +++ b/lib/browser/api/web-contents.ts @@ -345,49 +345,53 @@ WebContents.prototype.printToPDF = async function (options) { // TODO(codebytere): deduplicate argument sanitization by moving rest of // print param logic into new file shared between printToPDF and print WebContents.prototype.print = function (options: ElectronInternal.WebContentsPrintOptions, callback) { - if (typeof options === 'object') { - const pageSize = options.pageSize ?? 'A4'; - if (typeof pageSize === 'object') { - if (!pageSize.height || !pageSize.width) { - throw new Error('height and width properties are required for pageSize'); - } + if (typeof options !== 'object') { + throw new Error('webContents.print(): Invalid print settings specified.'); + } - // Dimensions in Microns - 1 meter = 10^6 microns - const height = Math.ceil(pageSize.height); - const width = Math.ceil(pageSize.width); - if (!isValidCustomPageSize(width, height)) { - throw new Error('height and width properties must be minimum 352 microns.'); - } + const printSettings: Record = { ...options }; - options.mediaSize = { - name: 'CUSTOM', - custom_display_name: 'Custom', - height_microns: height, - width_microns: width, - imageable_area_left_microns: 0, - imageable_area_bottom_microns: 0, - 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 { - throw new Error(`Unsupported pageSize: ${pageSize}`); + const pageSize = options.pageSize ?? 'A4'; + if (typeof pageSize === 'object') { + if (!pageSize.height || !pageSize.width) { + throw new Error('height and width properties are required for pageSize'); } + + // Dimensions in Microns - 1 meter = 10^6 microns + const height = Math.ceil(pageSize.height); + const width = Math.ceil(pageSize.width); + if (!isValidCustomPageSize(width, height)) { + throw new Error('height and width properties must be minimum 352 microns.'); + } + + printSettings.mediaSize = { + name: 'CUSTOM', + custom_display_name: 'Custom', + height_microns: height, + width_microns: width, + imageable_area_left_microns: 0, + imageable_area_bottom_microns: 0, + imageable_area_right_microns: width, + imageable_area_top_microns: height + }; + } else if (typeof pageSize === 'string' && PDFPageSizes[pageSize]) { + const mediaSize = PDFPageSizes[pageSize]; + printSettings.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 { + throw new Error(`Unsupported pageSize: ${pageSize}`); } if (this._print) { if (callback) { - this._print(options, callback); + this._print(printSettings, callback); } else { - this._print(options); + this._print(printSettings); } } else { console.error('Error: Printing feature is disabled.');