From 00187172f237f19e2bf2ae502f7c6c000d580032 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Thu, 11 May 2023 17:54:05 +0200 Subject: [PATCH] chore: introduce minimal viewport for WebKit/Windows/headed (#22956) Fixes https://github.com/microsoft/playwright/issues/22616 --- .../playwright-core/src/server/webkit/wkBrowser.ts | 8 ++++++++ .../playwright-core/src/server/webkit/wkPage.ts | 1 + tests/library/browsercontext-viewport.spec.ts | 13 +++++++++++++ tests/library/emulation-focus.spec.ts | 4 ++-- 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/server/webkit/wkBrowser.ts b/packages/playwright-core/src/server/webkit/wkBrowser.ts index 84ff6ac30f..8e97886efe 100644 --- a/packages/playwright-core/src/server/webkit/wkBrowser.ts +++ b/packages/playwright-core/src/server/webkit/wkBrowser.ts @@ -212,6 +212,7 @@ export class WKBrowserContext extends BrowserContext { constructor(browser: WKBrowser, browserContextId: string | undefined, options: channels.BrowserNewContextParams) { super(browser, options, browserContextId); + this._validateEmulatedViewport(options.viewport); this._authenticateProxyViaHeader(); } @@ -361,4 +362,11 @@ export class WKBrowserContext extends BrowserContext { async cancelDownload(uuid: string) { await this._browser._browserSession.send('Playwright.cancelDownload', { uuid }); } + + _validateEmulatedViewport(viewportSize?: types.Size | null) { + if (!viewportSize) + return; + if (process.platform === 'win32' && this._browser.options.headful && (viewportSize.width < 250 || viewportSize.height < 250)) + throw new Error(`WebKit on Windows has a minimal viewport of 250x250.`); + } } diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 6ab01b462e..e7934a4d29 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -681,6 +681,7 @@ export class WKPage implements PageDelegate { } async updateEmulatedViewportSize(): Promise { + this._browserContext._validateEmulatedViewport(this._page.viewportSize()); await this._updateViewport(); } diff --git a/tests/library/browsercontext-viewport.spec.ts b/tests/library/browsercontext-viewport.spec.ts index 9c1c6fd468..bb6f6567c2 100644 --- a/tests/library/browsercontext-viewport.spec.ts +++ b/tests/library/browsercontext-viewport.spec.ts @@ -150,3 +150,16 @@ browserTest('should drag with high dpi', async ({ browser, server }) => { expect(await page.$eval('#target', target => target.contains(document.querySelector('#source')))).toBe(true); // could not find source in target await page.close(); }); + +it('WebKit Windows headed should have a minimal viewport', async ({ contextFactory, browserName, headless, isWindows }) => { + it.skip(browserName !== 'webkit' || headless || !isWindows, 'Not relevant for this browser'); + + await expect(contextFactory({ + viewport: { 'width': 100, 'height': 100 }, + })).rejects.toThrow('WebKit on Windows has a minimal viewport of 250x250.'); + + const context = await contextFactory(); + const page = await context.newPage(); + await expect(page.setViewportSize({ width: 100, height: 100 })).rejects.toThrow('WebKit on Windows has a minimal viewport of 250x250.'); + await context.close(); +}); diff --git a/tests/library/emulation-focus.spec.ts b/tests/library/emulation-focus.spec.ts index 564c4d565c..caf06ac5dc 100644 --- a/tests/library/emulation-focus.spec.ts +++ b/tests/library/emulation-focus.spec.ts @@ -102,8 +102,8 @@ it('should change document.activeElement', async ({ page, server }) => { }); it('should not affect screenshots', async ({ page, server, browserName, headless, isWindows }) => { - it.fixme(browserName === 'webkit' && isWindows && !headless, 'https://github.com/microsoft/playwright/issues/22616'); - it.skip(browserName === 'firefox' && !headless, 'Firefox headede produces a different image'); + it.skip(browserName === 'webkit' && isWindows && !headless, 'WebKit/Windows/headed has a larger minimal viewport. See https://github.com/microsoft/playwright/issues/22616'); + it.skip(browserName === 'firefox' && !headless, 'Firefox headed produces a different image'); const page2 = await page.context().newPage(); await Promise.all([