From f5e611c8a38f97c7e6a3b2df9cb58eb1add80423 Mon Sep 17 00:00:00 2001 From: Devin Rousso Date: Fri, 19 Jun 2026 16:02:18 -0600 Subject: [PATCH] feat(webview): support `setUserAgent` --- .../src/server/webkit/webview/wvBrowser.ts | 7 ++++++- .../playwright-core/src/server/webkit/webview/wvPage.ts | 8 ++++++++ packages/playwright-core/src/server/webkit/wkPage.ts | 4 ++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/playwright-core/src/server/webkit/webview/wvBrowser.ts b/packages/playwright-core/src/server/webkit/webview/wvBrowser.ts index 313f3ab0ae8a9..4bbdc1833b014 100644 --- a/packages/playwright-core/src/server/webkit/webview/wvBrowser.ts +++ b/packages/playwright-core/src/server/webkit/webview/wvBrowser.ts @@ -334,6 +334,12 @@ export class WVBrowserContext extends BrowserContext { await (page.delegate as WVPage).updateExtraHTTPHeaders(); } + async setUserAgent(userAgent: string | undefined): Promise { + this._options.userAgent = userAgent; + for (const page of this.pages()) + await (page.delegate as WVPage).updateUserAgent(); + } + async doAddInitScript(initScript: InitScript) { for (const page of this.pages()) await (page.delegate as WVPage)._updateBootstrapScript(); @@ -360,7 +366,6 @@ export class WVBrowserContext extends BrowserContext { override async clearCache(): Promise { throw new Error('Method not implemented.'); } override async doClose(reason: string | undefined): Promise { throw new Error('Method not implemented.'); } override async cancelDownload(uuid: string) { throw new Error('Method not implemented.'); } - override async setUserAgent(userAgent: string | undefined): Promise { throw new Error('Method not implemented.'); } protected override async doSetHTTPCredentials(httpCredentials?: types.Credentials): Promise { throw new Error('Method not implemented.'); } protected override async doUpdateOffline(): Promise { throw new Error('Method not implemented.'); } } diff --git a/packages/playwright-core/src/server/webkit/webview/wvPage.ts b/packages/playwright-core/src/server/webkit/webview/wvPage.ts index 1aec197f8f03d..e8519b9bac5e6 100644 --- a/packages/playwright-core/src/server/webkit/webview/wvPage.ts +++ b/packages/playwright-core/src/server/webkit/webview/wvPage.ts @@ -218,6 +218,9 @@ export class WVPage implements PageDelegate { const emulatedMedia = this._page.emulatedMedia(); if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.contrast) await WVPage._setEmulateMedia(session, emulatedMedia.media, emulatedMedia.colorScheme, emulatedMedia.reducedMotion, emulatedMedia.contrast); + const contextOptions = this._browserContext._options; + if (contextOptions.userAgent) + await session.sendMayFail('Page.overrideUserAgent', { value: contextOptions.userAgent }); if (this._page.needsRequestInterception()) { await Promise.all([ session.sendMayFail('Network.setInterceptionEnabled', { enabled: true }), @@ -601,6 +604,11 @@ export class WVPage implements PageDelegate { return headers; } + async updateUserAgent(): Promise { + const contextOptions = this._browserContext._options; + await this._updateState('Page.overrideUserAgent', { value: contextOptions.userAgent }); + } + async bringToFront(): Promise { } diff --git a/packages/playwright-core/src/server/webkit/wkPage.ts b/packages/playwright-core/src/server/webkit/wkPage.ts index 9396d5b20486c..f744f1cd634b8 100644 --- a/packages/playwright-core/src/server/webkit/wkPage.ts +++ b/packages/playwright-core/src/server/webkit/wkPage.ts @@ -188,7 +188,7 @@ export class WKPage implements PageDelegate { const contextOptions = this._browserContext._options; if (contextOptions.userAgent) - promises.push(this.updateUserAgent()); + promises.push(session.send('Page.overrideUserAgent', { value: contextOptions.userAgent })); const emulatedMedia = this._page.emulatedMedia(); if (emulatedMedia.media || emulatedMedia.colorScheme || emulatedMedia.reducedMotion || emulatedMedia.forcedColors || emulatedMedia.contrast) promises.push(WKPage._setEmulateMedia(session, emulatedMedia.media, emulatedMedia.colorScheme, emulatedMedia.reducedMotion, emulatedMedia.forcedColors, emulatedMedia.contrast)); @@ -694,7 +694,7 @@ export class WKPage implements PageDelegate { async updateUserAgent(): Promise { const contextOptions = this._browserContext._options; - this._updateState('Page.overrideUserAgent', { value: contextOptions.userAgent }); + await this._updateState('Page.overrideUserAgent', { value: contextOptions.userAgent }); } async bringToFront(): Promise {