chore: create new Playwright instance when launching server (#6820)

This commit is contained in:
Max Schmitt 2021-06-01 12:21:24 -07:00 committed by GitHub
parent 2951f4b065
commit d21a72e7d5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 15 deletions

View File

@ -15,7 +15,6 @@
*/
import { LaunchServerOptions, Logger } from './client/types';
import { BrowserType } from './server/browserType';
import { Browser } from './server/browser';
import { EventEmitter } from 'ws';
import { Dispatcher, DispatcherScope } from './dispatchers/dispatcher';
@ -28,7 +27,7 @@ import { SelectorsDispatcher } from './dispatchers/selectorsDispatcher';
import { Selectors } from './server/selectors';
import { ProtocolLogger } from './server/types';
import { CallMetadata, internalCallMetadata } from './server/instrumentation';
import { Playwright } from './server/playwright';
import { createPlaywright, Playwright } from './server/playwright';
import { PlaywrightDispatcher } from './dispatchers/playwrightDispatcher';
import { PlaywrightServer, PlaywrightServerDelegate } from './remote/playwrightServer';
import { BrowserContext } from './server/browserContext';
@ -40,18 +39,17 @@ import { SocksSocketDispatcher } from './dispatchers/socksSocketDispatcher';
import { SocksInterceptedSocketHandler } from './server/socksServer';
export class BrowserServerLauncherImpl implements BrowserServerLauncher {
private _playwright: Playwright;
private _browserType: BrowserType;
private _browserName: 'chromium' | 'firefox' | 'webkit';
constructor(playwright: Playwright, browserType: BrowserType) {
this._playwright = playwright;
this._browserType = browserType;
constructor(browserName: 'chromium' | 'firefox' | 'webkit') {
this._browserName = browserName;
}
async launchServer(options: LaunchServerOptions = {}): Promise<BrowserServer> {
const portForwardingServer = new BrowserServerPortForwardingServer(this._playwright, !!options._acceptForwardedPorts);
const playwright = createPlaywright();
const portForwardingServer = new BrowserServerPortForwardingServer(playwright, !!options._acceptForwardedPorts);
// 1. Pre-launch the browser
const browser = await this._browserType.launch(internalCallMetadata(), {
const browser = await playwright[this._browserName].launch(internalCallMetadata(), {
...options,
ignoreDefaultArgs: Array.isArray(options.ignoreDefaultArgs) ? options.ignoreDefaultArgs : undefined,
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
@ -66,7 +64,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
onClose: () => {
portForwardingServer.stop();
},
onConnect: this._onConnect.bind(this, browser, portForwardingServer),
onConnect: this._onConnect.bind(this, playwright, browser, portForwardingServer),
};
const server = new PlaywrightServer(delegate);
const wsEndpoint = await server.listen(options.port);
@ -85,7 +83,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
return browserServer;
}
private _onConnect(browser: Browser, portForwardingServer: BrowserServerPortForwardingServer, scope: DispatcherScope, forceDisconnect: () => void) {
private _onConnect(playwright: Playwright, browser: Browser, portForwardingServer: BrowserServerPortForwardingServer, scope: DispatcherScope, forceDisconnect: () => void) {
const selectors = new Selectors();
const selectorsDispatcher = new SelectorsDispatcher(scope, selectors);
const browserDispatcher = new ConnectedBrowserDispatcher(scope, browser, selectors);
@ -93,7 +91,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
// Underlying browser did close for some reason - force disconnect the client.
forceDisconnect();
});
const playwrightDispatcher = new PlaywrightDispatcher(scope, this._playwright, selectorsDispatcher, browserDispatcher, (ports: number[]) => {
const playwrightDispatcher = new PlaywrightDispatcher(scope, playwright, selectorsDispatcher, browserDispatcher, (ports: number[]) => {
portForwardingServer.enablePortForwarding(ports);
});
const incomingSocksSocketHandler = (socket: SocksInterceptedSocketHandler) => {

View File

@ -34,9 +34,9 @@ function setupInProcess(): PlaywrightAPI {
// Initialize Playwright channel.
new PlaywrightDispatcher(dispatcherConnection.rootDispatcher(), playwright);
const playwrightAPI = clientConnection.getObjectWithKnownName('Playwright') as PlaywrightAPI;
playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl(playwright, playwright.chromium);
playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl(playwright, playwright.firefox);
playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl(playwright, playwright.webkit);
playwrightAPI.chromium._serverLauncher = new BrowserServerLauncherImpl('chromium');
playwrightAPI.firefox._serverLauncher = new BrowserServerLauncherImpl('firefox');
playwrightAPI.webkit._serverLauncher = new BrowserServerLauncherImpl('webkit');
// Switch to async dispatch after we got Playwright object.
dispatcherConnection.onmessage = message => setImmediate(() => clientConnection.dispatch(message));