From 346ddd0c5de17e25d1b7f2d5d4db53cd78b710b7 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 5 Jun 2026 11:17:15 -0700 Subject: [PATCH] chore(webkit): encode jpeg screenshots natively via Page.snapshotRect Page.snapshotRect now accepts format and quality, so pass them through and let WebKit encode JPEG directly instead of fetching a PNG and re-encoding with jpeg-js in Node. Drops the unused pngjs/jpeg-js imports. --- packages/playwright-core/src/server/webkit/wkPage.ts | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 6a2540390e809..37813bcf70269 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -15,8 +15,6 @@ * limitations under the License. */ -import { PNG } from 'pngjs'; -import jpegjs from 'jpeg-js'; import { headersArrayToObject, headersObjectToArray } from '@isomorphic/headers'; import { splitErrorMessage } from '@isomorphic/stackTrace'; import { eventsHelper } from '@utils/eventsHelper'; @@ -874,12 +872,9 @@ export class WKPage implements PageDelegate { const omitDeviceScaleFactor = scale === 'css'; this.validateScreenshotDimension(rect.width, omitDeviceScaleFactor); this.validateScreenshotDimension(rect.height, omitDeviceScaleFactor); - const result = await progress.race(this._session.send('Page.snapshotRect', { ...rect, coordinateSystem: documentRect ? 'Page' : 'Viewport', omitDeviceScaleFactor })); - const prefix = 'data:image/png;base64,'; - let buffer: Buffer = Buffer.from(result.dataURL.substr(prefix.length), 'base64'); - if (format === 'jpeg') - buffer = jpegjs.encode(PNG.sync.read(buffer), quality).data; - return buffer; + const result = await progress.race(this._session.send('Page.snapshotRect', { ...rect, coordinateSystem: documentRect ? 'Page' : 'Viewport', omitDeviceScaleFactor, format: format as 'png' | 'jpeg', quality })); + // Strip the 'data:image/;base64,' prefix. + return Buffer.from(result.dataURL.substring(result.dataURL.indexOf(',') + 1), 'base64'); } async getContentFrame(handle: dom.ElementHandle): Promise {