feat: support firefoxUserPrefs in launchPersistentContext (#27840)

Fixes #27773.
This commit is contained in:
Dmitry Gozman 2023-10-27 09:24:41 -07:00 committed by GitHub
parent d395a38a63
commit 88f30d1ce2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 36 additions and 10 deletions

View file

@ -337,6 +337,12 @@ use a temporary directory instead.
### option: BrowserType.launchPersistentContext.-inline- = %%-shared-context-params-list-v1.8-%% ### option: BrowserType.launchPersistentContext.-inline- = %%-shared-context-params-list-v1.8-%%
* since: v1.8 * since: v1.8
### option: BrowserType.launchPersistentContext.firefoxUserPrefs = %%-js-python-browser-option-firefoxuserprefs-%%
* since: v1.40
### option: BrowserType.launchPersistentContext.firefoxUserPrefs2 = %%-csharp-java-browser-option-firefoxuserprefs-%%
* since: v1.40
## async method: BrowserType.launchServer ## async method: BrowserType.launchServer
* since: v1.8 * since: v1.8
* langs: js * langs: js

View file

@ -76,14 +76,11 @@ type LaunchOverrides = {
ignoreDefaultArgs?: boolean | string[]; ignoreDefaultArgs?: boolean | string[];
env?: Env; env?: Env;
logger?: Logger; logger?: Logger;
firefoxUserPrefs?: { [key: string]: string | number | boolean };
}; };
type FirefoxUserPrefs = { export type LaunchOptions = Omit<channels.BrowserTypeLaunchOptions, 'ignoreAllDefaultArgs' | 'ignoreDefaultArgs' | 'env' | 'firefoxUserPrefs'> & LaunchOverrides;
firefoxUserPrefs?: { [key: string]: string | number | boolean }, export type LaunchPersistentContextOptions = Omit<LaunchOptions & BrowserContextOptions, 'storageState'>;
};
type LaunchOptionsBase = Omit<channels.BrowserTypeLaunchOptions, 'ignoreAllDefaultArgs' | 'ignoreDefaultArgs' | 'env' | 'firefoxUserPrefs'> & LaunchOverrides;
export type LaunchOptions = LaunchOptionsBase & FirefoxUserPrefs;
export type LaunchPersistentContextOptions = Omit<LaunchOptionsBase & BrowserContextOptions, 'storageState'>;
export type ConnectOptions = { export type ConnectOptions = {
wsEndpoint: string, wsEndpoint: string,
@ -117,7 +114,8 @@ export type LaunchServerOptions = {
port?: number, port?: number,
wsPath?: string, wsPath?: string,
logger?: Logger, logger?: Logger,
} & FirefoxUserPrefs; firefoxUserPrefs?: { [key: string]: string | number | boolean };
};
export type LaunchAndroidServerOptions = { export type LaunchAndroidServerOptions = {
deviceSerialNumber?: string, deviceSerialNumber?: string,

View file

@ -521,6 +521,7 @@ scheme.BrowserTypeLaunchPersistentContextParams = tObject({
downloadsPath: tOptional(tString), downloadsPath: tOptional(tString),
tracesDir: tOptional(tString), tracesDir: tOptional(tString),
chromiumSandbox: tOptional(tBoolean), chromiumSandbox: tOptional(tBoolean),
firefoxUserPrefs: tOptional(tAny),
noDefaultViewport: tOptional(tBoolean), noDefaultViewport: tOptional(tBoolean),
viewport: tOptional(tObject({ viewport: tOptional(tObject({
width: tNumber, width: tNumber,

View file

@ -43,7 +43,7 @@ export class FFBrowser extends Browser {
const browser = new FFBrowser(parent, connection, options); const browser = new FFBrowser(parent, connection, options);
if ((options as any).__testHookOnConnectToBrowser) if ((options as any).__testHookOnConnectToBrowser)
await (options as any).__testHookOnConnectToBrowser(); await (options as any).__testHookOnConnectToBrowser();
let firefoxUserPrefs = options.persistent ? {} : options.originalLaunchOptions.firefoxUserPrefs ?? {}; let firefoxUserPrefs = options.originalLaunchOptions.firefoxUserPrefs ?? {};
if (Object.keys(kBandaidFirefoxUserPrefs).length) if (Object.keys(kBandaidFirefoxUserPrefs).length)
firefoxUserPrefs = { ...kBandaidFirefoxUserPrefs, ...firefoxUserPrefs }; firefoxUserPrefs = { ...kBandaidFirefoxUserPrefs, ...firefoxUserPrefs };
const promises: Promise<any>[] = [ const promises: Promise<any>[] = [

View file

@ -12841,6 +12841,12 @@ export interface BrowserType<Unused = {}> {
*/ */
extraHTTPHeaders?: { [key: string]: string; }; extraHTTPHeaders?: { [key: string]: string; };
/**
* Firefox user preferences. Learn more about the Firefox user preferences at
* [`about:config`](https://support.mozilla.org/en-US/kb/about-config-editor-firefox).
*/
firefoxUserPrefs?: { [key: string]: string|number|boolean; };
/** /**
* Emulates `'forced-colors'` media feature, supported values are `'active'`, `'none'`. See * Emulates `'forced-colors'` media feature, supported values are `'active'`, `'none'`. See
* [page.emulateMedia([options])](https://playwright.dev/docs/api/class-page#page-emulate-media) for more details. * [page.emulateMedia([options])](https://playwright.dev/docs/api/class-page#page-emulate-media) for more details.

View file

@ -929,6 +929,7 @@ export type BrowserTypeLaunchPersistentContextParams = {
downloadsPath?: string, downloadsPath?: string,
tracesDir?: string, tracesDir?: string,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
firefoxUserPrefs?: any,
noDefaultViewport?: boolean, noDefaultViewport?: boolean,
viewport?: { viewport?: {
width: number, width: number,
@ -1000,6 +1001,7 @@ export type BrowserTypeLaunchPersistentContextOptions = {
downloadsPath?: string, downloadsPath?: string,
tracesDir?: string, tracesDir?: string,
chromiumSandbox?: boolean, chromiumSandbox?: boolean,
firefoxUserPrefs?: any,
noDefaultViewport?: boolean, noDefaultViewport?: boolean,
viewport?: { viewport?: {
width: number, width: number,

View file

@ -411,6 +411,7 @@ LaunchOptions:
downloadsPath: string? downloadsPath: string?
tracesDir: string? tracesDir: string?
chromiumSandbox: boolean? chromiumSandbox: boolean?
firefoxUserPrefs: json?
ContextOptions: ContextOptions:
@ -868,7 +869,6 @@ BrowserType:
launch: launch:
parameters: parameters:
$mixin: LaunchOptions $mixin: LaunchOptions
firefoxUserPrefs: json?
slowMo: number? slowMo: number?
returns: returns:
browser: Browser browser: Browser

View file

@ -52,7 +52,7 @@ export const LogTab: React.FunctionComponent<{
}); });
} }
return entries; return entries;
}, [action]); }, [action, isLive]);
if (!entries.length) if (!entries.length)
return <PlaceholderPanel text='No log entries' />; return <PlaceholderPanel text='No log entries' />;

View file

@ -30,3 +30,16 @@ it('should pass firefox user preferences', async ({ browserType, mode }) => {
expect(error.message).toContain('NS_ERROR_PROXY_CONNECTION_REFUSED'); expect(error.message).toContain('NS_ERROR_PROXY_CONNECTION_REFUSED');
await browser.close(); await browser.close();
}); });
it('should pass firefox user preferences in persistent', async ({ mode, launchPersistent }) => {
it.skip(mode.startsWith('service'));
const { page } = await launchPersistent({
firefoxUserPrefs: {
'network.proxy.type': 1,
'network.proxy.http': '127.0.0.1',
'network.proxy.http_port': 3333,
}
});
const error = await page.goto('http://example.com').catch(e => e);
expect(error.message).toContain('NS_ERROR_PROXY_CONNECTION_REFUSED');
});