diff --git a/packages/playwright-core/src/browserServerImpl.ts b/packages/playwright-core/src/browserServerImpl.ts index ee20e3a102d01..9a8b295202e40 100644 --- a/packages/playwright-core/src/browserServerImpl.ts +++ b/packages/playwright-core/src/browserServerImpl.ts @@ -32,9 +32,9 @@ import type { WebSocketEventEmitter } from './utilsBundle'; import type { Browser } from './server/browser'; export class BrowserServerLauncherImpl implements BrowserServerLauncher { - private _browserName: 'chromium' | 'firefox' | 'webkit' | 'bidiFirefox' | 'bidiChromium'; + private _browserName: 'chromium' | 'firefox' | 'webkit' | '_bidiFirefox' | '_bidiChromium'; - constructor(browserName: 'chromium' | 'firefox' | 'webkit' | 'bidiFirefox' | 'bidiChromium') { + constructor(browserName: 'chromium' | 'firefox' | 'webkit' | '_bidiFirefox' | '_bidiChromium') { this._browserName = browserName; } diff --git a/packages/playwright-core/src/client/playwright.ts b/packages/playwright-core/src/client/playwright.ts index fac9a671ed172..48c6349080f15 100644 --- a/packages/playwright-core/src/client/playwright.ts +++ b/packages/playwright-core/src/client/playwright.ts @@ -58,9 +58,9 @@ export class Playwright extends ChannelOwner { this._android._playwright = this; this._electron = Electron.from(initializer.electron); this._electron._playwright = this; - this._bidiChromium = BrowserType.from(initializer.bidiChromium); + this._bidiChromium = BrowserType.from(initializer._bidiChromium); this._bidiChromium._playwright = this; - this._bidiFirefox = BrowserType.from(initializer.bidiFirefox); + this._bidiFirefox = BrowserType.from(initializer._bidiFirefox); this._bidiFirefox._playwright = this; this.devices = this._connection.localUtils()?.devices ?? {}; this.selectors = new Selectors(this._connection._platform); diff --git a/packages/playwright-core/src/inProcessFactory.ts b/packages/playwright-core/src/inProcessFactory.ts index 0bb1d89d4b7b6..0dac70918cb08 100644 --- a/packages/playwright-core/src/inProcessFactory.ts +++ b/packages/playwright-core/src/inProcessFactory.ts @@ -42,8 +42,8 @@ export function createInProcessPlaywright(): PlaywrightAPI { playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl('firefox'); playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl('webkit'); playwrightAPI._android._serverLauncher = new AndroidServerLauncherImpl(); - playwrightAPI._bidiChromium._serverLauncher = new BrowserServerLauncherImpl('bidiChromium'); - playwrightAPI._bidiFirefox._serverLauncher = new BrowserServerLauncherImpl('bidiFirefox'); + playwrightAPI._bidiChromium._serverLauncher = new BrowserServerLauncherImpl('_bidiChromium'); + playwrightAPI._bidiFirefox._serverLauncher = new BrowserServerLauncherImpl('_bidiFirefox'); // Switch to async dispatch after we got Playwright object. dispatcherConnection.onmessage = message => setImmediate(() => clientConnection.dispatch(message)); diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 7e9073a25166d..2475526a43eb5 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -376,8 +376,8 @@ scheme.PlaywrightInitializer = tObject({ chromium: tChannel(['BrowserType']), firefox: tChannel(['BrowserType']), webkit: tChannel(['BrowserType']), - bidiChromium: tChannel(['BrowserType']), - bidiFirefox: tChannel(['BrowserType']), + _bidiChromium: tChannel(['BrowserType']), + _bidiFirefox: tChannel(['BrowserType']), android: tChannel(['Android']), electron: tChannel(['Electron']), utils: tOptional(tChannel(['LocalUtils'])), diff --git a/packages/playwright-core/src/remote/playwrightConnection.ts b/packages/playwright-core/src/remote/playwrightConnection.ts index f96eded9149f7..1a3dcb2a32327 100644 --- a/packages/playwright-core/src/remote/playwrightConnection.ts +++ b/packages/playwright-core/src/remote/playwrightConnection.ts @@ -118,14 +118,7 @@ export class PlaywrightConnection { private async _initLaunchBrowserMode(scope: RootDispatcher, options: channels.RootInitializeParams) { debugLogger.log('server', `[${this._id}] engaged launch mode for "${this._options.browserName}"`); const ownedSocksProxy = await this._createOwnedSocksProxy(); - let browserName = this._options.browserName; - if ('bidi' === browserName) { - if (this._options.launchOptions?.channel?.toLocaleLowerCase().includes('firefox')) - browserName = 'bidiFirefox'; - else - browserName = 'bidiChromium'; - } - const browser = await this._playwright[browserName as 'chromium'].launch(serverSideCallMetadata(), this._options.launchOptions); + const browser = await this._playwright[this._options.browserName as 'chromium'].launch(serverSideCallMetadata(), this._options.launchOptions); browser.options.sdkLanguage = options.sdkLanguage; this._cleanups.push(() => browser.close({ reason: 'Connection terminated' })); diff --git a/packages/playwright-core/src/server/bidi/bidiChromium.ts b/packages/playwright-core/src/server/bidi/bidiChromium.ts index 4347d0bcd62a1..38a23580c4e40 100644 --- a/packages/playwright-core/src/server/bidi/bidiChromium.ts +++ b/packages/playwright-core/src/server/bidi/bidiChromium.ts @@ -34,7 +34,7 @@ import type * as types from '../types'; export class BidiChromium extends BrowserType { constructor(parent: SdkObject) { - super(parent, 'bidi'); + super(parent, '_bidiChromium'); } override async connectToTransport(transport: ConnectionTransport, options: BrowserOptions, browserLogsCollector: RecentLogsCollector): Promise { diff --git a/packages/playwright-core/src/server/bidi/bidiFirefox.ts b/packages/playwright-core/src/server/bidi/bidiFirefox.ts index 28c2af7c1db86..f10808a13dd36 100644 --- a/packages/playwright-core/src/server/bidi/bidiFirefox.ts +++ b/packages/playwright-core/src/server/bidi/bidiFirefox.ts @@ -35,7 +35,11 @@ import type { RecentLogsCollector } from '../utils/debugLogger'; export class BidiFirefox extends BrowserType { constructor(parent: SdkObject) { - super(parent, 'bidi'); + super(parent, '_bidiFirefox'); + } + + override executablePath(): string { + return ''; } override async connectToTransport(transport: ConnectionTransport, options: BrowserOptions): Promise { diff --git a/packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts b/packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts index 74ad4b4ab06f8..04bb144d1176a 100644 --- a/packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/playwrightDispatcher.ts @@ -52,15 +52,15 @@ export class PlaywrightDispatcher extends Dispatcher(); @@ -65,8 +65,8 @@ export class Playwright extends SdkObject { } }, null); this.chromium = new Chromium(this); - this.bidiChromium = new BidiChromium(this); - this.bidiFirefox = new BidiFirefox(this); + this._bidiChromium = new BidiChromium(this); + this._bidiFirefox = new BidiFirefox(this); this.firefox = new Firefox(this); this.webkit = new WebKit(this); this.electron = new Electron(this); diff --git a/packages/playwright-core/src/server/registry/index.ts b/packages/playwright-core/src/server/registry/index.ts index 1a6f5f2f2b177..4a0e7cb989be7 100644 --- a/packages/playwright-core/src/server/registry/index.ts +++ b/packages/playwright-core/src/server/registry/index.ts @@ -384,7 +384,9 @@ const DOWNLOAD_PATHS: Record = { 'win64': 'builds/android/%s/android.zip', }, // TODO(bidi): implement downloads. - 'bidi': { + '_bidiFirefox': { + } as DownloadPaths, + '_bidiChromium': { } as DownloadPaths, }; @@ -480,7 +482,7 @@ function readDescriptors(browsersJSON: BrowsersJSON): BrowsersJSONDescriptor[] { }); } -export type BrowserName = 'chromium' | 'firefox' | 'webkit' | 'bidi'; +export type BrowserName = 'chromium' | 'firefox' | 'webkit' | '_bidiFirefox' | '_bidiChromium'; type InternalTool = 'ffmpeg' | 'winldd' | 'firefox-beta' | 'chromium-tip-of-tree' | 'chromium-headless-shell' | 'chromium-tip-of-tree-headless-shell' | 'android'; type BidiChannel = 'moz-firefox' | 'moz-firefox-beta' | 'moz-firefox-nightly' | 'bidi-chrome-canary' | 'bidi-chrome-stable' | 'bidi-chromium'; type ChromiumChannel = 'chrome' | 'chrome-beta' | 'chrome-dev' | 'chrome-canary' | 'msedge' | 'msedge-beta' | 'msedge-dev' | 'msedge-canary'; @@ -717,8 +719,8 @@ export class Registry { })); this._executables.push({ type: 'browser', - name: 'bidi-chromium', - browserName: 'bidi', + name: '_bidiChromium', + browserName: '_bidiChromium', directory: chromium.dir, executablePath: () => chromiumExecutable, executablePathOrDie: (sdkLanguage: string) => executablePathOrDie('chromium', chromiumExecutable, chromium.installByDefault, sdkLanguage), @@ -842,21 +844,6 @@ export class Registry { _dependencyGroup: 'tools', _isHermeticInstallation: true, }); - - this._executables.push({ - type: 'browser', - name: 'bidi', - browserName: 'bidi', - directory: undefined, - executablePath: () => undefined, - executablePathOrDie: () => '', - installType: 'none', - _validateHostRequirements: () => Promise.resolve(), - downloadURLs: [], - _install: () => Promise.resolve(), - _dependencyGroup: 'tools', - _isHermeticInstallation: true, - }); } private _createChromiumChannel(name: ChromiumChannel, lookAt: Record<'linux' | 'darwin' | 'win32', string>, install?: () => Promise): ExecutableImpl { @@ -931,7 +918,7 @@ export class Registry { return { type: 'channel', name, - browserName: 'bidi', + browserName: '_bidiFirefox', directory: undefined, executablePath: (sdkLanguage: string) => executablePath(sdkLanguage, false), executablePathOrDie: (sdkLanguage: string) => executablePath(sdkLanguage, true)!, @@ -947,7 +934,7 @@ export class Registry { const suffix = lookAt[process.platform as 'linux' | 'darwin' | 'win32']; if (!suffix) { if (shouldThrow) - throw new Error(`Firefox distribution '${name}' is not supported on ${process.platform}`); + throw new Error(`Chromium distribution '${name}' is not supported on ${process.platform}`); return undefined; } const prefixes = (process.platform === 'win32' ? [ @@ -974,7 +961,7 @@ export class Registry { return { type: 'channel', name, - browserName: 'bidi', + browserName: '_bidiChromium', directory: undefined, executablePath: (sdkLanguage: string) => executablePath(sdkLanguage, false), executablePathOrDie: (sdkLanguage: string) => executablePath(sdkLanguage, true)!, diff --git a/packages/protocol/src/channels.d.ts b/packages/protocol/src/channels.d.ts index 1afeaeec8b835..3e052e3d5726e 100644 --- a/packages/protocol/src/channels.d.ts +++ b/packages/protocol/src/channels.d.ts @@ -624,8 +624,8 @@ export type PlaywrightInitializer = { chromium: BrowserTypeChannel, firefox: BrowserTypeChannel, webkit: BrowserTypeChannel, - bidiChromium: BrowserTypeChannel, - bidiFirefox: BrowserTypeChannel, + _bidiChromium: BrowserTypeChannel, + _bidiFirefox: BrowserTypeChannel, android: AndroidChannel, electron: ElectronChannel, utils?: LocalUtilsChannel, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index c33c381bdfdcc..e9c765d045421 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -791,8 +791,8 @@ Playwright: chromium: BrowserType firefox: BrowserType webkit: BrowserType - bidiChromium: BrowserType - bidiFirefox: BrowserType + _bidiChromium: BrowserType + _bidiFirefox: BrowserType android: Android electron: Electron utils: LocalUtils? diff --git a/tests/bidi/playwright.config.ts b/tests/bidi/playwright.config.ts index d650233e7ceb2..a26b72bd53e8b 100644 --- a/tests/bidi/playwright.config.ts +++ b/tests/bidi/playwright.config.ts @@ -106,7 +106,7 @@ for (const [key, channels] of Object.entries(browserToChannels)) { use: { browserName, headless: !headed, - channel, + channel: channel === 'bidi-chromium' ? undefined : channel, video: 'off', launchOptions: { executablePath, diff --git a/tests/config/remoteServer.ts b/tests/config/remoteServer.ts index 94b252a86c838..4c25934581abc 100644 --- a/tests/config/remoteServer.ts +++ b/tests/config/remoteServer.ts @@ -103,12 +103,6 @@ export class RemoteServer implements PlaywrightServer { launchOptions, ...remoteServerOptions, }; - if ('bidi' === browserType.name()) { - if (channel.toLocaleLowerCase().includes('firefox')) - options.browserTypeName = '_bidiFirefox'; - else - options.browserTypeName = '_bidiChromium'; - } this._process = childProcess({ command: ['node', path.join(__dirname, 'remote-server-impl.js'), JSON.stringify(options)], }); diff --git a/tests/library/browsertype-connect.spec.ts b/tests/library/browsertype-connect.spec.ts index 80653941e60b6..1eb1342e8d5b5 100644 --- a/tests/library/browsertype-connect.spec.ts +++ b/tests/library/browsertype-connect.spec.ts @@ -258,9 +258,7 @@ for (const kind of ['launchServer', 'run-server'] as const) { }).catch(() => {}) ]); expect(request.headers['user-agent']).toBe(getUserAgent()); - // _bidiFirefox and _bidiChromium are initialized with 'bidi' as browser name. - const bidiAwareBrowserName = browserName.startsWith('_bidi') ? 'bidi' : browserName; - expect(request.headers['x-playwright-browser']).toBe(bidiAwareBrowserName); + expect(request.headers['x-playwright-browser']).toBe(browserName); expect(request.headers['foo']).toBe('bar'); }); diff --git a/tests/library/har.spec.ts b/tests/library/har.spec.ts index 82c1148289ed1..db5b14a5d135e 100644 --- a/tests/library/har.spec.ts +++ b/tests/library/har.spec.ts @@ -56,9 +56,7 @@ it('should have browser', async ({ browserName, browser, contextFactory, server await page.goto(server.EMPTY_PAGE); const log = await getLog(); - // _bidiFirefox and _bidiChromium are initialized with 'bidi' as browser name. - const harBrowserName = browserName.startsWith('_bidi') ? 'bidi' : browserName; - expect(log.browser!.name.toLowerCase()).toBe(harBrowserName); + expect(log.browser!.name.toLowerCase()).toBe(browserName); expect(log.browser!.version).toBe(browser.version()); }); @@ -915,8 +913,6 @@ it('should not hang on slow chunked response', async ({ browserName, browser, co await page.evaluate(() => (window as any).receivedFirstData); const log = await getLog(); - // _bidiFirefox and _bidiChromium are initialized with 'bidi' as browser name. - const harBrowserName = browserName.startsWith('_bidi') ? 'bidi' : browserName; - expect(log.browser!.name.toLowerCase()).toBe(harBrowserName); + expect(log.browser!.name.toLowerCase()).toBe(browserName); expect(log.browser!.version).toBe(browser.version()); });