fix(webkit): properly set user agent in persistent context (#22283)

Fixes https://github.com/microsoft/playwright/issues/22274
This commit is contained in:
Yury Semikhatsky 2023-04-07 19:50:49 -07:00 committed by GitHub
parent 635a2dac16
commit 5cd9f83c7b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 34 additions and 0 deletions

View file

@ -590,6 +590,10 @@ scheme.BrowserCloseParams = tOptional(tObject({}));
scheme.BrowserCloseResult = tOptional(tObject({}));
scheme.BrowserKillForTestsParams = tOptional(tObject({}));
scheme.BrowserKillForTestsResult = tOptional(tObject({}));
scheme.BrowserDefaultUserAgentForTestParams = tOptional(tObject({}));
scheme.BrowserDefaultUserAgentForTestResult = tObject({
userAgent: tString,
});
scheme.BrowserNewContextParams = tObject({
noDefaultViewport: tOptional(tBoolean),
viewport: tOptional(tObject({

View file

@ -59,6 +59,10 @@ export class BrowserDispatcher extends Dispatcher<Browser, channels.BrowserChann
await this._object.killForTests();
}
async defaultUserAgentForTest(): Promise<channels.BrowserDefaultUserAgentForTestResult> {
return { userAgent: this._object.userAgent() };
}
async newBrowserCDPSession(): Promise<channels.BrowserNewBrowserCDPSessionResult> {
if (!this._object.options.isChromium)
throw new Error(`CDP session is only available in Chromium`);
@ -116,6 +120,10 @@ export class ConnectedBrowserDispatcher extends Dispatcher<Browser, channels.Bro
// Client should not send us Browser.killForTests.
}
async defaultUserAgentForTest(): Promise<channels.BrowserDefaultUserAgentForTestResult> {
throw new Error('Client should not send us Browser.defaultUserAgentForTest');
}
async newBrowserCDPSession(): Promise<channels.BrowserNewBrowserCDPSessionResult> {
if (!this._object.options.isChromium)
throw new Error(`CDP session is only available in Chromium`);

View file

@ -50,6 +50,7 @@ export class WKBrowser extends Browser {
browser._browserSession.send('Playwright.enable'),
];
if (options.persistent) {
options.persistent.userAgent ||= DEFAULT_USER_AGENT;
browser._defaultContext = new WKBrowserContext(browser, undefined, options.persistent);
promises.push((browser._defaultContext as WKBrowserContext)._initialize());
}

View file

@ -1083,6 +1083,7 @@ export interface BrowserChannel extends BrowserEventTarget, Channel {
_type_Browser: boolean;
close(params?: BrowserCloseParams, metadata?: CallMetadata): Promise<BrowserCloseResult>;
killForTests(params?: BrowserKillForTestsParams, metadata?: CallMetadata): Promise<BrowserKillForTestsResult>;
defaultUserAgentForTest(params?: BrowserDefaultUserAgentForTestParams, metadata?: CallMetadata): Promise<BrowserDefaultUserAgentForTestResult>;
newContext(params: BrowserNewContextParams, metadata?: CallMetadata): Promise<BrowserNewContextResult>;
newContextForReuse(params: BrowserNewContextForReuseParams, metadata?: CallMetadata): Promise<BrowserNewContextForReuseResult>;
newBrowserCDPSession(params?: BrowserNewBrowserCDPSessionParams, metadata?: CallMetadata): Promise<BrowserNewBrowserCDPSessionResult>;
@ -1096,6 +1097,11 @@ export type BrowserCloseResult = void;
export type BrowserKillForTestsParams = {};
export type BrowserKillForTestsOptions = {};
export type BrowserKillForTestsResult = void;
export type BrowserDefaultUserAgentForTestParams = {};
export type BrowserDefaultUserAgentForTestOptions = {};
export type BrowserDefaultUserAgentForTestResult = {
userAgent: string,
};
export type BrowserNewContextParams = {
noDefaultViewport?: boolean,
viewport?: {

View file

@ -897,6 +897,10 @@ Browser:
killForTests:
defaultUserAgentForTest:
returns:
userAgent: string
newContext:
parameters:
$mixin: ContextOptions

View file

@ -288,3 +288,8 @@ it('should emulate media in cross-process iframe', async ({ browser, server }) =
expect(await frame.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches)).toBe(true);
await page.close();
});
it('default user agent', async ({ launchPersistent, browser, page }) => {
const { userAgent } = await (browser as any)._channel.defaultUserAgentForTest();
expect(await page.evaluate(() => navigator.userAgent)).toBe(userAgent);
});

View file

@ -233,3 +233,9 @@ it('should support har option', async ({ launchPersistent, asset }) => {
await expect(page.locator('body')).toHaveCSS('background-color', 'rgb(255, 0, 0)');
});
it('user agent is up to date', async ({ launchPersistent, browser }) => {
const { userAgent } = await (browser as any)._channel.defaultUserAgentForTest();
const { context, page } = await launchPersistent();
expect(await page.evaluate(() => navigator.userAgent)).toBe(userAgent);
await context.close();
});