diff --git a/packages/playwright-core/src/server/browserType.ts b/packages/playwright-core/src/server/browserType.ts index 24a057ebf9..617824a489 100644 --- a/packages/playwright-core/src/server/browserType.ts +++ b/packages/playwright-core/src/server/browserType.ts @@ -133,7 +133,7 @@ export abstract class BrowserType extends SdkObject { if (persistent) validateBrowserContextOptions(persistent, browserOptions); copyTestHooks(options, browserOptions); - const browser = await this._connectToTransport(transport, browserOptions); + const browser = await this.connectToTransport(transport, browserOptions); (browser as any)._userDataDirForTest = userDataDir; // We assume no control when using custom arguments, and do not prepare the default context in that case. if (persistent && !options.ignoreAllDefaultArgs) @@ -173,9 +173,9 @@ export abstract class BrowserType extends SdkObject { if (ignoreAllDefaultArgs) browserArguments.push(...args); else if (ignoreDefaultArgs) - browserArguments.push(...this._defaultArgs(options, isPersistent, userDataDir).filter(arg => ignoreDefaultArgs.indexOf(arg) === -1)); + browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir).filter(arg => ignoreDefaultArgs.indexOf(arg) === -1)); else - browserArguments.push(...this._defaultArgs(options, isPersistent, userDataDir)); + browserArguments.push(...this.defaultArgs(options, isPersistent, userDataDir)); let executable: string; if (executablePath) { @@ -199,7 +199,7 @@ export abstract class BrowserType extends SdkObject { const { launchedProcess, gracefullyClose, kill } = await launchProcess({ command: executable, args: browserArguments, - env: this._amendEnvironment(env, userDataDir, executable, browserArguments), + env: this.amendEnvironment(env, userDataDir, executable, browserArguments), handleSIGINT, handleSIGTERM, handleSIGHUP, @@ -222,7 +222,7 @@ export abstract class BrowserType extends SdkObject { // We try to gracefully close to prevent crash reporting and core dumps. // Note that it's fine to reuse the pipe transport, since // our connection ignores kBrowserCloseMessageId. - this._attemptToGracefullyCloseBrowser(transport!); + this.attemptToGracefullyCloseBrowser(transport!); }, onExit: (exitCode, signal) => { // Unblock launch when browser prematurely exits. @@ -305,14 +305,14 @@ export abstract class BrowserType extends SdkObject { _rewriteStartupLog(error: Error): Error { if (!isProtocolError(error)) return error; - return this._doRewriteStartupLog(error); + return this.doRewriteStartupLog(error); } - abstract _defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[]; - abstract _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise; - abstract _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env; - abstract _doRewriteStartupLog(error: ProtocolError): ProtocolError; - abstract _attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void; + abstract defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[]; + abstract connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise; + abstract amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env; + abstract doRewriteStartupLog(error: ProtocolError): ProtocolError; + abstract attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void; } function copyTestHooks(from: object, to: object) { diff --git a/packages/playwright-core/src/server/chromium/chromium.ts b/packages/playwright-core/src/server/chromium/chromium.ts index e745cca214..f86e1f71d4 100644 --- a/packages/playwright-core/src/server/chromium/chromium.ts +++ b/packages/playwright-core/src/server/chromium/chromium.ts @@ -131,7 +131,7 @@ export class Chromium extends BrowserType { return directory ? new CRDevTools(path.join(directory, 'devtools-preferences.json')) : undefined; } - async _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { + override async connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { let devtools = this._devtools; if ((options as any).__testHookForDevTools) { devtools = this._createDevTools(); @@ -140,7 +140,7 @@ export class Chromium extends BrowserType { return CRBrowser.connect(this.attribution.playwright, transport, options, devtools); } - _doRewriteStartupLog(error: ProtocolError): ProtocolError { + override doRewriteStartupLog(error: ProtocolError): ProtocolError { if (!error.logs) return error; if (error.logs.includes('Missing X server')) @@ -161,11 +161,11 @@ export class Chromium extends BrowserType { return error; } - _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { + override amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { return env; } - _attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { + override attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { const message: ProtocolRequest = { method: 'Browser.close', id: kBrowserCloseMessageId, params: {} }; transport.send(message); } @@ -277,7 +277,7 @@ export class Chromium extends BrowserType { } } - _defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { + override defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { const chromeArguments = this._innerDefaultArgs(options); chromeArguments.push(`--user-data-dir=${userDataDir}`); if (options.useWebSocket) diff --git a/packages/playwright-core/src/server/firefox/firefox.ts b/packages/playwright-core/src/server/firefox/firefox.ts index 96d1edae4c..885291cf0b 100644 --- a/packages/playwright-core/src/server/firefox/firefox.ts +++ b/packages/playwright-core/src/server/firefox/firefox.ts @@ -33,11 +33,11 @@ export class Firefox extends BrowserType { super(parent, 'firefox'); } - _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { + override connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { return FFBrowser.connect(this.attribution.playwright, transport, options); } - _doRewriteStartupLog(error: ProtocolError): ProtocolError { + override doRewriteStartupLog(error: ProtocolError): ProtocolError { if (!error.logs) return error; // https://github.com/microsoft/playwright/issues/6500 @@ -48,7 +48,7 @@ export class Firefox extends BrowserType { return error; } - _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { + override amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { if (!path.isAbsolute(os.homedir())) throw new Error(`Cannot launch Firefox with relative home directory. Did you set ${os.platform() === 'win32' ? 'USERPROFILE' : 'HOME'} to a relative path?`); if (os.platform() === 'linux') { @@ -60,12 +60,12 @@ export class Firefox extends BrowserType { return env; } - _attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { + override attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { const message = { method: 'Browser.close', params: {}, id: kBrowserCloseMessageId }; transport.send(message); } - _defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { + override defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { const { args = [], headless } = options; const userDataDirArg = args.find(arg => arg.startsWith('-profile') || arg.startsWith('--profile')); if (userDataDirArg) diff --git a/packages/playwright-core/src/server/playwright.ts b/packages/playwright-core/src/server/playwright.ts index c4ffd518ce..3d524ad959 100644 --- a/packages/playwright-core/src/server/playwright.ts +++ b/packages/playwright-core/src/server/playwright.ts @@ -28,6 +28,7 @@ import { debugLogger } from '../utils/debugLogger'; import type { Page } from './page'; import { DebugController } from './debugController'; import type { Language } from '../utils/isomorphic/locatorGenerators'; +import type { BrowserType } from './browserType'; type PlaywrightOptions = { socksProxyPort?: number; @@ -38,11 +39,11 @@ type PlaywrightOptions = { export class Playwright extends SdkObject { readonly selectors: Selectors; - readonly chromium: Chromium; + readonly chromium: BrowserType; readonly android: Android; readonly electron: Electron; - readonly firefox: Firefox; - readonly webkit: WebKit; + readonly firefox: BrowserType; + readonly webkit: BrowserType; readonly options: PlaywrightOptions; readonly debugController: DebugController; private _allPages = new Set(); diff --git a/packages/playwright-core/src/server/webkit/webkit.ts b/packages/playwright-core/src/server/webkit/webkit.ts index 33f4a68c20..b25b62a421 100644 --- a/packages/playwright-core/src/server/webkit/webkit.ts +++ b/packages/playwright-core/src/server/webkit/webkit.ts @@ -32,15 +32,15 @@ export class WebKit extends BrowserType { super(parent, 'webkit'); } - _connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { + override connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { return WKBrowser.connect(this.attribution.playwright, transport, options); } - _amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { + override amendEnvironment(env: Env, userDataDir: string, executable: string, browserArguments: string[]): Env { return { ...env, CURL_COOKIE_JAR_PATH: path.join(userDataDir, 'cookiejar.db') }; } - _doRewriteStartupLog(error: ProtocolError): ProtocolError { + override doRewriteStartupLog(error: ProtocolError): ProtocolError { if (!error.logs) return error; if (error.logs.includes('cannot open display')) @@ -48,11 +48,11 @@ export class WebKit extends BrowserType { return error; } - _attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { + override attemptToGracefullyCloseBrowser(transport: ConnectionTransport): void { transport.send({ method: 'Playwright.close', params: {}, id: kBrowserCloseMessageId }); } - _defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { + override defaultArgs(options: types.LaunchOptions, isPersistent: boolean, userDataDir: string): string[] { const { args = [], proxy, headless } = options; const userDataDirArg = args.find(arg => arg.startsWith('--user-data-dir')); if (userDataDirArg) diff --git a/tests/library/defaultbrowsercontext-2.spec.ts b/tests/library/defaultbrowsercontext-2.spec.ts index 3552f94e97..a54f4ee15a 100644 --- a/tests/library/defaultbrowsercontext-2.spec.ts +++ b/tests/library/defaultbrowsercontext-2.spec.ts @@ -144,7 +144,7 @@ it('should have passed URL when launching with ignoreDefaultArgs: true', async ( it.skip(mode !== 'default'); const userDataDir = await createUserDataDir(); - const args = toImpl(browserType)._defaultArgs((browserType as any)._defaultLaunchOptions, 'persistent', userDataDir, 0).filter(a => a !== 'about:blank'); + const args = toImpl(browserType).defaultArgs((browserType as any)._defaultLaunchOptions, 'persistent', userDataDir, 0).filter(a => a !== 'about:blank'); const options = { args: browserName === 'firefox' ? [...args, '-new-tab', server.EMPTY_PAGE] : [...args, server.EMPTY_PAGE], ignoreDefaultArgs: true,