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

View File

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