diff --git a/src/inProcessFactory.ts b/src/inProcessFactory.ts new file mode 100644 index 0000000000..f5a50c1759 --- /dev/null +++ b/src/inProcessFactory.ts @@ -0,0 +1,49 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the 'License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DispatcherConnection, Root } from './dispatchers/dispatcher'; +import { createPlaywright } from './server/playwright'; +import type { Playwright as PlaywrightAPI } from './client/playwright'; +import { PlaywrightDispatcher } from './dispatchers/playwrightDispatcher'; +import { Connection } from './client/connection'; +import { BrowserServerLauncherImpl } from './browserServerImpl'; + +export function createInProcessPlaywright(): PlaywrightAPI { + const playwright = createPlaywright('javascript'); + + const clientConnection = new Connection(); + const dispatcherConnection = new DispatcherConnection(); + + // Dispatch synchronously at first. + dispatcherConnection.onmessage = message => clientConnection.dispatch(message); + clientConnection.onmessage = message => dispatcherConnection.dispatch(message); + + const rootScope = new Root(dispatcherConnection); + + // Initialize Playwright channel. + new PlaywrightDispatcher(rootScope, playwright); + const playwrightAPI = clientConnection.getObjectWithKnownName('Playwright') as PlaywrightAPI; + 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)); + clientConnection.onmessage = message => setImmediate(() => dispatcherConnection.dispatch(message)); + + (playwrightAPI as any)._toImpl = (x: any) => dispatcherConnection._dispatchers.get(x._guid)!._object; + return playwrightAPI; +} diff --git a/src/inprocess.ts b/src/inprocess.ts index ea1f6c7593..90b1bf499d 100644 --- a/src/inprocess.ts +++ b/src/inprocess.ts @@ -14,38 +14,6 @@ * limitations under the License. */ -import { DispatcherConnection, Root } from './dispatchers/dispatcher'; -import { createPlaywright } from './server/playwright'; -import type { Playwright as PlaywrightAPI } from './client/playwright'; -import { PlaywrightDispatcher } from './dispatchers/playwrightDispatcher'; -import { Connection } from './client/connection'; -import { BrowserServerLauncherImpl } from './browserServerImpl'; +import { createInProcessPlaywright } from './inProcessFactory'; -function setupInProcess(): PlaywrightAPI { - const playwright = createPlaywright('javascript'); - - const clientConnection = new Connection(); - const dispatcherConnection = new DispatcherConnection(); - - // Dispatch synchronously at first. - dispatcherConnection.onmessage = message => clientConnection.dispatch(message); - clientConnection.onmessage = message => dispatcherConnection.dispatch(message); - - const rootScope = new Root(dispatcherConnection); - - // Initialize Playwright channel. - new PlaywrightDispatcher(rootScope, playwright); - const playwrightAPI = clientConnection.getObjectWithKnownName('Playwright') as PlaywrightAPI; - 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)); - clientConnection.onmessage = message => setImmediate(() => dispatcherConnection.dispatch(message)); - - (playwrightAPI as any)._toImpl = (x: any) => dispatcherConnection._dispatchers.get(x._guid)!._object; - return playwrightAPI; -} - -module.exports = setupInProcess(); +module.exports = createInProcessPlaywright(); diff --git a/tests/inspector/inspectorTest.ts b/tests/inspector/inspectorTest.ts index 436906bb25..fdf1498c59 100644 --- a/tests/inspector/inspectorTest.ts +++ b/tests/inspector/inspectorTest.ts @@ -18,7 +18,6 @@ import { contextTest } from '../config/browserTest'; import type { Page } from '../../index'; import * as path from 'path'; import type { Source } from '../../src/server/supplements/recorder/recorderTypes'; -import { chromium } from '../../index'; import { CommonFixtures, TestChildProcess } from '../config/commonFixtures'; export { expect } from '../config/test-runner'; @@ -29,6 +28,8 @@ type CLITestArgs = { runCLI: (args: string[]) => CLIMock; }; +const playwrightToAutomateInspector = require('../../lib/inProcessFactory').createInProcessPlaywright(); + export const test = contextTest.extend({ recorderPageGetter: async ({ context, toImpl, mode }, run, testInfo) => { process.env.PWTEST_RECORDER_PORT = String(10907 + testInfo.workerIndex); @@ -37,7 +38,7 @@ export const test = contextTest.extend({ while (!toImpl(context).recorderAppForTest) await new Promise(f => setTimeout(f, 100)); const wsEndpoint = toImpl(context).recorderAppForTest.wsEndpoint; - const browser = await chromium.connectOverCDP({ wsEndpoint }); + const browser = await playwrightToAutomateInspector.chromium.connectOverCDP({ wsEndpoint }); const c = browser.contexts()[0]; return c.pages()[0] || await c.waitForEvent('page'); }); diff --git a/utils/check_deps.js b/utils/check_deps.js index 6359ea3308..d271296252 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -171,7 +171,7 @@ DEPS['src/server/electron/'] = [...DEPS['src/server/'], 'src/server/chromium/']; DEPS['src/server/playwright.ts'] = [...DEPS['src/server/'], 'src/server/chromium/', 'src/server/webkit/', 'src/server/firefox/', 'src/server/android/', 'src/server/electron/']; DEPS['src/server/browserContext.ts'] = [...DEPS['src/server/'], 'src/server/trace/recorder/tracing.ts']; -DEPS['src/cli/driver.ts'] = DEPS['src/inprocess.ts'] = DEPS['src/browserServerImpl.ts'] = ['src/**']; +DEPS['src/cli/driver.ts'] = DEPS['src/inProcessFactory.ts'] = DEPS['src/browserServerImpl.ts'] = ['src/**']; // Tracing is a client/server plugin, nothing should depend on it. DEPS['src/web/recorder/'] = ['src/common/', 'src/web/', 'src/web/components/', 'src/server/supplements/recorder/recorderTypes.ts'];