From ace1230e41aad6168dc85b9bc1f7c04d9dce5527 Mon Sep 17 00:00:00 2001 From: jrandolf <101637635+jrandolf@users.noreply.github.com> Date: Mon, 25 Sep 2023 15:05:20 +0200 Subject: [PATCH] fix: set defaults in screenshot (#11021) --- docs/api/puppeteer.screenshotoptions.md | 2 +- packages/puppeteer-core/src/api/Page.ts | 22 ++++++-- packages/puppeteer-core/src/bidi/Page.ts | 67 +++++++++--------------- packages/puppeteer-core/src/cdp/Page.ts | 4 +- 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/docs/api/puppeteer.screenshotoptions.md b/docs/api/puppeteer.screenshotoptions.md index 568a9bf3..225b832c 100644 --- a/docs/api/puppeteer.screenshotoptions.md +++ b/docs/api/puppeteer.screenshotoptions.md @@ -17,7 +17,7 @@ export interface ScreenshotOptions | captureBeyondViewport | optional | boolean | Capture the screenshot beyond the viewport. | true | | clip | optional | [ScreenshotClip](./puppeteer.screenshotclip.md) | Specifies the region of the page to clip. | | | encoding | optional | 'base64' \| 'binary' | Encoding of the image. | 'binary' | -| fromSurface | optional | boolean | Capture the screenshot from the surface, rather than the view. | false | +| fromSurface | optional | boolean | Capture the screenshot from the surface, rather than the view. | true | | fullPage | optional | boolean | When true, takes a screenshot of the full page. | false | | omitBackground | optional | boolean | Hides default white background and allows capturing screenshots with transparency. | false | | optimizeForSpeed | optional | boolean | | false | diff --git a/packages/puppeteer-core/src/api/Page.ts b/packages/puppeteer-core/src/api/Page.ts index 1f1a8dd2..da7b75fa 100644 --- a/packages/puppeteer-core/src/api/Page.ts +++ b/packages/puppeteer-core/src/api/Page.ts @@ -242,7 +242,7 @@ export interface ScreenshotOptions { /** * Capture the screenshot from the surface, rather than the view. * - * @defaultValue `false` + * @defaultValue `true` */ fromSurface?: boolean; /** @@ -495,6 +495,20 @@ export interface NewDocumentScriptEvaluation { identifier: string; } +/** + * @internal + */ +export function setDefaultScreenshotOptions(options: ScreenshotOptions): void { + options.optimizeForSpeed ??= false; + options.type ??= 'png'; + options.fromSurface ??= true; + options.fullPage ??= false; + options.omitBackground ??= false; + options.encoding ??= 'binary'; + options.captureBeyondViewport ??= true; + options.allowViewportExpansion ??= options.captureBeyondViewport; +} + /** * Page provides methods to interact with a single tab or * {@link https://developer.chrome.com/extensions/background_pages | extension background page} @@ -2285,7 +2299,7 @@ export abstract class Page extends EventEmitter { ...userOptions.clip, } : undefined, - } as ScreenshotOptions; + }; if (options.type === undefined && options.path !== undefined) { const filePath = options.path; // Note we cannot use Node.js here due to browser compatability. @@ -2358,8 +2372,8 @@ export abstract class Page extends EventEmitter { ); } - options.captureBeyondViewport ??= true; - options.allowViewportExpansion ??= options.captureBeyondViewport; + setDefaultScreenshotOptions(options); + options.clip = options.clip && roundClip(normalizeClip(options.clip)); await using stack = new AsyncDisposableStack(); diff --git a/packages/puppeteer-core/src/bidi/Page.ts b/packages/puppeteer-core/src/bidi/Page.ts index b0f7ad36..c15b97d0 100644 --- a/packages/puppeteer-core/src/bidi/Page.ts +++ b/packages/puppeteer-core/src/bidi/Page.ts @@ -647,52 +647,33 @@ export class BidiPage extends Page { } } - override async screenshot( - options: Readonly & {encoding: 'base64'} - ): Promise; - override async screenshot( - options?: Readonly - ): Promise; - override async screenshot( - options: Readonly = {} - ): Promise { - const { - clip, - type, - captureBeyondViewport, - allowViewportExpansion = true, - } = options; - if (captureBeyondViewport) { - throw new Error(`BiDi does not support 'captureBeyondViewport'.`); - } - const invalidOption = Object.keys(options).find(option => { - return [ - 'fromSurface', - 'omitBackground', - 'optimizeForSpeed', - 'quality', - ].includes(option); - }); - if (invalidOption !== undefined) { - throw new Error(`BiDi does not support ${invalidOption}.`); - } - if ((type ?? 'png') !== 'png') { - throw new Error(`BiDi only supports 'png' type.`); - } - if (clip?.scale !== undefined) { - throw new Error(`BiDi does not support 'scale' in 'clip'.`); - } - return await super.screenshot({ - ...options, - captureBeyondViewport, - allowViewportExpansion: captureBeyondViewport ?? allowViewportExpansion, - }); - } - override async _screenshot( options: Readonly ): Promise { - const {clip} = options; + const {clip, type, captureBeyondViewport, allowViewportExpansion} = options; + if (captureBeyondViewport && !allowViewportExpansion) { + throw new Error( + `BiDi does not support 'captureBeyondViewport'. Use 'allowViewportExpansion'.` + ); + } + if (options.omitBackground !== undefined && options.omitBackground) { + throw new Error(`BiDi does not support 'omitBackground'.`); + } + if (options.optimizeForSpeed !== undefined && options.optimizeForSpeed) { + throw new Error(`BiDi does not support 'optimizeForSpeed'.`); + } + if (options.fromSurface !== undefined && !options.fromSurface) { + throw new Error(`BiDi does not support 'fromSurface'.`); + } + if (options.quality !== undefined) { + throw new Error(`BiDi does not support 'quality'.`); + } + if (type === 'webp' || type === 'jpeg') { + throw new Error(`BiDi only supports 'png' type.`); + } + if (clip !== undefined && clip.scale !== undefined && clip.scale !== 1) { + throw new Error(`BiDi does not support 'scale' in 'clip'.`); + } const { result: {data}, } = await this.#connection.send('browsingContext.captureScreenshot', { diff --git a/packages/puppeteer-core/src/cdp/Page.ts b/packages/puppeteer-core/src/cdp/Page.ts index 3a91186f..22886670 100644 --- a/packages/puppeteer-core/src/cdp/Page.ts +++ b/packages/puppeteer-core/src/cdp/Page.ts @@ -1039,7 +1039,9 @@ export class CdpPage extends Page { await this.#frameManager.networkManager.setCacheEnabled(enabled); } - async _screenshot(options: Readonly): Promise { + override async _screenshot( + options: Readonly + ): Promise { const { fromSurface, omitBackground,