From 460acf26f58e7efef244689dde3e5712cb2296a6 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Sat, 6 Jun 2026 17:31:14 +0100 Subject: [PATCH] feat(firefox): support mobile mode note: this requires Juggler's support for the mobile mode first. --- packages/playwright-core/src/cli/browserActions.ts | 3 --- packages/playwright-core/src/server/firefox/ffBrowser.ts | 4 ++-- packages/playwright-core/src/server/firefox/ffPage.ts | 7 +++++-- tests/library/browsercontext-viewport.spec.ts | 4 +--- tests/library/defaultbrowsercontext-2.spec.ts | 2 -- tests/library/video.spec.ts | 2 -- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/playwright-core/src/cli/browserActions.ts b/packages/playwright-core/src/cli/browserActions.ts index 930e04019316a..d6558c8bdaf36 100644 --- a/packages/playwright-core/src/cli/browserActions.ts +++ b/packages/playwright-core/src/cli/browserActions.ts @@ -85,9 +85,6 @@ async function launchContext(options: Options, extraOptions: LaunchOptions): Pro delete contextOptions.isMobile; } - if (contextOptions.isMobile && browserType.name() === 'firefox') - contextOptions.isMobile = undefined; - if (options.blockServiceWorkers) contextOptions.serviceWorkers = 'block'; diff --git a/packages/playwright-core/src/server/firefox/ffBrowser.ts b/packages/playwright-core/src/server/firefox/ffBrowser.ts index c3dc91c9e8ce6..59e8c0c716c22 100644 --- a/packages/playwright-core/src/server/firefox/ffBrowser.ts +++ b/packages/playwright-core/src/server/firefox/ffBrowser.ts @@ -90,8 +90,6 @@ export class FFBrowser extends Browser { } async doCreateNewContext(options: types.BrowserContextOptions): Promise { - if (options.isMobile) - throw new Error('options.isMobile is not supported in Firefox'); const { browserContextId } = await this.session.send('Browser.createBrowserContext', { removeOnDetach: true }); const context = new FFBrowserContext(this, browserContextId, options); await context.initialize(); @@ -359,7 +357,9 @@ export class FFBrowserContext extends BrowserContext { return; const viewport = { viewportSize: { width: this._options.viewport.width, height: this._options.viewport.height }, + screenSize: this._options.screen, deviceScaleFactor: this._options.deviceScaleFactor || 1, + isMobile: !!this._options.isMobile, }; await this._browser.session.send('Browser.setDefaultViewport', { browserContextId: this._browserContextId, viewport }); } diff --git a/packages/playwright-core/src/server/firefox/ffPage.ts b/packages/playwright-core/src/server/firefox/ffPage.ts index c269a97763069..7fe166d3f6e7c 100644 --- a/packages/playwright-core/src/server/firefox/ffPage.ts +++ b/packages/playwright-core/src/server/firefox/ffPage.ts @@ -380,8 +380,11 @@ export class FFPage implements PageDelegate { } async updateEmulatedViewportSize(): Promise { - const viewportSize = this._page.emulatedSize()?.viewport ?? null; - await this._session.send('Page.setViewportSize', { viewportSize }); + const emulatedSize = this._page.emulatedSize(); + const viewportSize = emulatedSize?.viewport ?? null; + const screenSize = emulatedSize?.screen ?? null; + const isMobile = !!this._browserContext._options.isMobile; + await this._session.send('Page.setViewportSize', { viewportSize, screenSize, isMobile }); } async bringToFront(): Promise { diff --git a/tests/library/browsercontext-viewport.spec.ts b/tests/library/browsercontext-viewport.spec.ts index a3e4fefb42311..787b19bb9b0b1 100644 --- a/tests/library/browsercontext-viewport.spec.ts +++ b/tests/library/browsercontext-viewport.spec.ts @@ -130,7 +130,6 @@ browserTest('should support touch with null viewport', async ({ browser, server }); it('should set both screen and viewport options', async ({ contextFactory, browserName, isBidi }) => { - it.fail(browserName === 'firefox' && !isBidi, 'Screen size is reset to viewport'); const context = await contextFactory({ screen: { 'width': 1280, 'height': 720 }, viewport: { 'width': 1000, 'height': 600 }, @@ -187,9 +186,8 @@ browserTest('should be able to get correct orientation angle on non-mobile devic await context.close(); }); -it('should set window.screen.orientation.type for mobile devices', async ({ contextFactory, browserName, server, isBidi }) => { +it('should set window.screen.orientation.type for mobile devices', async ({ contextFactory, server }) => { it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/31151' }); - it.skip(browserName === 'firefox' && !isBidi, 'Firefox does not support mobile emulation'); const context = await contextFactory(devices['iPhone 14']); const page = await context.newPage(); await page.goto(server.PREFIX + '/index.html'); diff --git a/tests/library/defaultbrowsercontext-2.spec.ts b/tests/library/defaultbrowsercontext-2.spec.ts index 9b95c4f91d445..516f114a8b141 100644 --- a/tests/library/defaultbrowsercontext-2.spec.ts +++ b/tests/library/defaultbrowsercontext-2.spec.ts @@ -28,8 +28,6 @@ it('should support hasTouch option', async ({ server, launchPersistent }) => { }); it('should work in persistent context', async ({ server, launchPersistent, browserName }) => { - it.skip(browserName === 'firefox', 'Firefox does not support mobile'); - const { page } = await launchPersistent({ viewport: { width: 320, height: 480 }, isMobile: true }); await page.goto(server.PREFIX + '/empty.html'); expect(await page.evaluate(() => window.innerWidth)).toBe(980); diff --git a/tests/library/video.spec.ts b/tests/library/video.spec.ts index 0bdd999cbf274..848e633297683 100644 --- a/tests/library/video.spec.ts +++ b/tests/library/video.spec.ts @@ -503,8 +503,6 @@ it.describe('screencast', () => { }); it('should emulate an iphone', async ({ contextFactory, playwright, browserName }, testInfo) => { - it.skip(browserName === 'firefox', 'isMobile is not supported in Firefox'); - const device = playwright.devices['iPhone 6']; const context = await contextFactory({ ...device,