From df38422064b479c548dfc8d6fc5518469b8fd5b1 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 8 Aug 2025 11:04:10 +0100 Subject: [PATCH] chore: move slowmo and logging to dispatcher from server core For better code isolation. --- .../playwright-core/src/androidServerImpl.ts | 3 +-- .../playwright-core/src/browserServerImpl.ts | 5 ++--- .../src/client/channelOwner.ts | 4 ---- .../playwright-core/src/client/connection.ts | 2 +- .../playwright-core/src/client/electron.ts | 2 +- .../playwright-core/src/inProcessFactory.ts | 9 +++++++-- .../src/remote/playwrightServer.ts | 7 +++---- .../src/server/android/android.ts | 4 ++-- .../playwright-core/src/server/debugger.ts | 16 ---------------- .../src/server/dispatchers/dispatcher.ts | 19 ++++++++++++++++--- packages/playwright-core/src/server/frames.ts | 4 ++-- packages/playwright-core/src/server/index.ts | 1 - .../src/server/instrumentation.ts | 12 ------------ .../playwright-core/src/server/launchApp.ts | 5 ++--- .../playwright-core/src/server/playwright.ts | 5 ----- .../playwright-core/src/server/progress.ts | 12 ++++++------ .../playwright-core/src/server/recorder.ts | 3 +-- .../src/server/recorder/recorderApp.ts | 5 ++--- .../src/server/recorder/recorderRunner.ts | 4 +--- .../src/server/trace/viewer/traceViewer.ts | 3 +-- tests/config/testModeFixtures.ts | 2 +- tests/library/slowmo.spec.ts | 9 ++++----- 22 files changed, 53 insertions(+), 83 deletions(-) diff --git a/packages/playwright-core/src/androidServerImpl.ts b/packages/playwright-core/src/androidServerImpl.ts index dc044735114ae..a147cecea4d9a 100644 --- a/packages/playwright-core/src/androidServerImpl.ts +++ b/packages/playwright-core/src/androidServerImpl.ts @@ -19,7 +19,6 @@ import { createPlaywright } from './server/playwright'; import { createGuid } from './server/utils/crypto'; import { ws } from './utilsBundle'; import { ProgressController } from './server/progress'; -import { serverSideCallMetadata } from './server'; import type { BrowserServer } from './client/browserType'; import type { LaunchAndroidServerOptions } from './client/types'; @@ -29,7 +28,7 @@ export class AndroidServerLauncherImpl { async launchServer(options: LaunchAndroidServerOptions = {}): Promise { const playwright = createPlaywright({ sdkLanguage: 'javascript', isServer: true }); // 1. Pre-connect to the device - const controller = new ProgressController(serverSideCallMetadata(), playwright); + const controller = new ProgressController(); let devices = await controller.run(progress => playwright.android.devices(progress, { host: options.adbHost, port: options.adbPort, diff --git a/packages/playwright-core/src/browserServerImpl.ts b/packages/playwright-core/src/browserServerImpl.ts index d8c36f71747b0..7ecc0bfc6d1dd 100644 --- a/packages/playwright-core/src/browserServerImpl.ts +++ b/packages/playwright-core/src/browserServerImpl.ts @@ -16,7 +16,6 @@ import { PlaywrightServer } from './remote/playwrightServer'; import { helper } from './server/helper'; -import { serverSideCallMetadata } from './server/instrumentation'; import { createPlaywright } from './server/playwright'; import { createGuid } from './server/utils/crypto'; import { isUnderTest } from './server/utils/debug'; @@ -42,7 +41,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher { async launchServer(options: LaunchServerOptions & { _sharedBrowser?: boolean, _userDataDir?: string } = {}): Promise { const playwright = createPlaywright({ sdkLanguage: 'javascript', isServer: true }); // 1. Pre-launch the browser - const metadata = serverSideCallMetadata(); + const metadata = { id: '', startTime: 0, endTime: 0, type: 'Internal', method: '', params: {}, log: [], internal: true }; const validatorContext = { tChannelImpl: (names: '*' | string[], arg: any, path: string) => { throw new validatorPrimitives.ValidationError(`${path}: channels are not expected in launchServer`); @@ -60,7 +59,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher { let browser: Browser; try { - const controller = new ProgressController(metadata, playwright[this._browserName]); + const controller = new ProgressController(metadata); browser = await controller.run(async progress => { if (options._userDataDir !== undefined) { const validator = validatorPrimitives.scheme['BrowserTypeLaunchPersistentContextParams']; diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index e731143a9a27e..7bd097b3ff486 100644 --- a/packages/playwright-core/src/client/channelOwner.ts +++ b/packages/playwright-core/src/client/channelOwner.ts @@ -207,10 +207,6 @@ export abstract class ChannelOwner any) | undefined; + toImpl: ((client: ChannelOwner | Connection) => any) | undefined; private _tracingCount = 0; readonly _instrumentation: ClientInstrumentation; // Used from @playwright/test fixtures -> TODO remove? diff --git a/packages/playwright-core/src/client/electron.ts b/packages/playwright-core/src/client/electron.ts index 0f5361e045e65..fc33350d0750f 100644 --- a/packages/playwright-core/src/client/electron.ts +++ b/packages/playwright-core/src/client/electron.ts @@ -99,7 +99,7 @@ export class ElectronApplication extends ChannelOwner setImmediate(() => clientConnection.dispatch(message)); clientConnection.onmessage = message => setImmediate(() => dispatcherConnection.dispatch(message)); - clientConnection.toImpl = (x: any) => x ? dispatcherConnection._dispatcherByGuid.get(x._guid)!._object : dispatcherConnection._dispatcherByGuid.get(''); - (playwrightAPI as any)._toImpl = clientConnection.toImpl; + clientConnection.toImpl = x => { + if (x instanceof Connection) + return x === clientConnection ? dispatcherConnection : undefined; + if (!x) + return dispatcherConnection._dispatcherByGuid.get(''); + return dispatcherConnection._dispatcherByGuid.get(x._guid)!._object; + }; return playwrightAPI; } diff --git a/packages/playwright-core/src/remote/playwrightServer.ts b/packages/playwright-core/src/remote/playwrightServer.ts index e9309408e1185..a22ec51bd367e 100644 --- a/packages/playwright-core/src/remote/playwrightServer.ts +++ b/packages/playwright-core/src/remote/playwrightServer.ts @@ -22,7 +22,6 @@ import { WSServer } from '../server/utils/wsServer'; import { wrapInASCIIBox } from '../server/utils/ascii'; import { getPlaywrightVersion } from '../server/utils/userAgent'; import { debugLogger, isUnderTest } from '../utils'; -import { serverSideCallMetadata } from '../server'; import { SocksProxy } from '../server/utils/socksProxy'; import { Browser } from '../server/browser'; import { ProgressController } from '../server/progress'; @@ -204,7 +203,7 @@ export class PlaywrightServer { if (!browser) { const browserType = this._playwright[(browserName || 'chromium') as 'chromium']; - const controller = new ProgressController(serverSideCallMetadata(), browserType); + const controller = new ProgressController(); browser = await controller.run(progress => browserType.launch(progress, { ...launchOptions, headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS, @@ -234,7 +233,7 @@ export class PlaywrightServer { let browser = this._playwright.allBrowsers().find(b => b.options.name === browserName); if (!browser) { const browserType = this._playwright[browserName as 'chromium']; - const controller = new ProgressController(serverSideCallMetadata(), browserType); + const controller = new ProgressController(); browser = await controller.run(progress => browserType.launch(progress, launchOptions), launchOptions.timeout); this._dontReuse(browser); } @@ -286,7 +285,7 @@ export class PlaywrightServer { launchOptions.socksProxyPort = undefined; } const browserType = this._playwright[browserName as 'chromium']; - const controller = new ProgressController(serverSideCallMetadata(), browserType); + const controller = new ProgressController(); const browser = await controller.run(progress => browserType.launch(progress, launchOptions), launchOptions.timeout); this._dontReuseBrowsers.add(browser); return { diff --git a/packages/playwright-core/src/server/android/android.ts b/packages/playwright-core/src/server/android/android.ts index 7b171fd25a74f..077d0569bcb6c 100644 --- a/packages/playwright-core/src/server/android/android.ts +++ b/packages/playwright-core/src/server/android/android.ts @@ -32,7 +32,7 @@ import { chromiumSwitches } from '../chromium/chromiumSwitches'; import { CRBrowser } from '../chromium/crBrowser'; import { removeFolders } from '../utils/fileUtils'; import { helper } from '../helper'; -import { SdkObject, serverSideCallMetadata } from '../instrumentation'; +import { SdkObject } from '../instrumentation'; import { gracefullyCloseSet } from '../utils/processLauncher'; import { isAbortError, Progress, ProgressController, raceUncancellableOperationWithCleanup } from '../progress'; import { registry } from '../registry'; @@ -162,7 +162,7 @@ export class AndroidDevice extends SdkObject { if (this._isClosed) return; if (!this._driverPromise) { - const controller = new ProgressController(serverSideCallMetadata(), this); + const controller = new ProgressController(); this._driverPromise = controller.run(progress => this._installDriver(progress)); } return this._driverPromise; diff --git a/packages/playwright-core/src/server/debugger.ts b/packages/playwright-core/src/server/debugger.ts index 6931b43f4aed0..7ca2ed6e15827 100644 --- a/packages/playwright-core/src/server/debugger.ts +++ b/packages/playwright-core/src/server/debugger.ts @@ -34,7 +34,6 @@ export class Debugger extends EventEmitter implements InstrumentationListener { PausedStateChanged: 'pausedstatechanged' }; private _muted = false; - private _slowMo: number | undefined; constructor(context: BrowserContext) { super(); @@ -47,7 +46,6 @@ export class Debugger extends EventEmitter implements InstrumentationListener { this._context.once(BrowserContext.Events.Close, () => { this._context.instrumentation.removeListener(this); }); - this._slowMo = this._context._browser.options.slowMo; } async setMuted(muted: boolean) { @@ -61,15 +59,6 @@ export class Debugger extends EventEmitter implements InstrumentationListener { await this.pause(sdkObject, metadata); } - async _doSlowMo() { - await new Promise(f => setTimeout(f, this._slowMo)); - } - - async onAfterCall(sdkObject: SdkObject, metadata: CallMetadata): Promise { - if (this._slowMo && shouldSlowMo(metadata)) - await this._doSlowMo(); - } - async onBeforeInputAction(sdkObject: SdkObject, metadata: CallMetadata): Promise { if (this._muted) return; @@ -135,8 +124,3 @@ function shouldPauseBeforeStep(metadata: CallMetadata): boolean { const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); return !!metainfo?.pausesBeforeAction; } - -function shouldSlowMo(metadata: CallMetadata): boolean { - const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); - return !!metainfo?.slowMo; -} diff --git a/packages/playwright-core/src/server/dispatchers/dispatcher.ts b/packages/playwright-core/src/server/dispatchers/dispatcher.ts index a6fe1c828c1dc..8f725a5b893c6 100644 --- a/packages/playwright-core/src/server/dispatchers/dispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/dispatcher.ts @@ -18,7 +18,7 @@ import { EventEmitter } from 'events'; import { eventsHelper } from '../utils/eventsHelper'; import { ValidationError, createMetadataValidator, findValidator } from '../../protocol/validator'; -import { assert, monotonicTime, rewriteErrorMessage } from '../../utils'; +import { assert, monotonicTime, rewriteErrorMessage, debugLogger } from '../../utils'; import { isUnderTest } from '../utils/debug'; import { TargetClosedError, isTargetClosedError, serializeError } from '../errors'; import { createRootSdkObject, SdkObject } from '../instrumentation'; @@ -101,7 +101,11 @@ export class Dispatcher { + const logName = this._object.logName || 'api'; + debugLogger.log(logName, message); + this._object.instrumentation.onCallLog(this._object, callMetadata, logName, message); + }); this._activeProgressControllers.add(controller); try { return await controller.run(progress => (this as any)[method](validParams, progress), validParams?.timeout); @@ -318,7 +322,8 @@ export class DispatcherConnection { return; } - if (methodMetainfo.get(dispatcher._type + '.' + method)?.internal) { + const metainfo = methodMetainfo.get(dispatcher._type + '.' + method); + if (metainfo?.internal) { // For non-js ports, it is easier to detect internal calls here rather // than generate protocol metainfo for each language. validMetadata.internal = true; @@ -396,12 +401,20 @@ export class DispatcherConnection { } finally { callMetadata.endTime = monotonicTime(); await sdkObject.instrumentation.onAfterCall(sdkObject, callMetadata); + if (metainfo?.slowMo) + await this._doSlowMo(sdkObject); } if (response.error) response.log = compressCallLog(callMetadata.log); this.onmessage(response); } + + private async _doSlowMo(sdkObject: SdkObject): Promise { + const slowMo = sdkObject.attribution.browser?.options.slowMo; + if (slowMo) + await new Promise(f => setTimeout(f, slowMo)); + } } function closeReason(sdkObject: SdkObject): string | undefined { diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index b81a4dff1228b..1738fddcc71fe 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -21,7 +21,7 @@ import { TimeoutError } from './errors'; import { prepareFilesForUpload } from './fileUploadUtils'; import { FrameSelectors } from './frameSelectors'; import { helper } from './helper'; -import { SdkObject, serverSideCallMetadata } from './instrumentation'; +import { SdkObject } from './instrumentation'; import * as js from './javascript'; import * as network from './network'; import { Page } from './page'; @@ -603,7 +603,7 @@ export class Frame extends SdkObject { } redirectNavigation(url: string, documentId: string, referer: string | undefined) { - const controller = new ProgressController(serverSideCallMetadata(), this); + const controller = new ProgressController(); const data = { url, gotoPromise: controller.run(progress => this.gotoImpl(progress, url, { referer }), 0), diff --git a/packages/playwright-core/src/server/index.ts b/packages/playwright-core/src/server/index.ts index 4ff0804c30f73..c15944f0ae208 100644 --- a/packages/playwright-core/src/server/index.ts +++ b/packages/playwright-core/src/server/index.ts @@ -29,4 +29,3 @@ export { createPlaywright } from './playwright'; export type { DispatcherScope } from './dispatchers/dispatcher'; export type { Playwright } from './playwright'; export { installRootRedirect, openTraceInBrowser, openTraceViewerApp, runTraceViewerApp, startTraceViewerServer } from './trace/viewer/traceViewer'; -export { serverSideCallMetadata } from './instrumentation'; diff --git a/packages/playwright-core/src/server/instrumentation.ts b/packages/playwright-core/src/server/instrumentation.ts index 947c929390b66..a4e6c39a3170b 100644 --- a/packages/playwright-core/src/server/instrumentation.ts +++ b/packages/playwright-core/src/server/instrumentation.ts @@ -111,15 +111,3 @@ export function createInstrumentation(): Instrumentation { }, }); } - -export function serverSideCallMetadata(): CallMetadata { - return { - id: '', - startTime: 0, - endTime: 0, - type: 'Internal', - method: '', - params: {}, - log: [], - }; -} diff --git a/packages/playwright-core/src/server/launchApp.ts b/packages/playwright-core/src/server/launchApp.ts index 1dc29e983f54b..ee65f3ca27258 100644 --- a/packages/playwright-core/src/server/launchApp.ts +++ b/packages/playwright-core/src/server/launchApp.ts @@ -18,7 +18,6 @@ import fs from 'fs'; import path from 'path'; import { isUnderTest, rewriteErrorMessage, wrapInASCIIBox } from '../utils'; -import { serverSideCallMetadata } from './instrumentation'; import { buildPlaywrightCLICommand, findChromiumChannelBestEffort } from './registry'; import { registryDirectory } from './registry'; import { ProgressController } from './progress'; @@ -49,7 +48,7 @@ export async function launchApp(browserType: BrowserType, options: { channel = findChromiumChannelBestEffort(options.sdkLanguage); } - const controller = new ProgressController(serverSideCallMetadata(), browserType); + const controller = new ProgressController(); let context; try { context = await controller.run(progress => browserType.launchPersistentContext(progress, '', { @@ -101,7 +100,7 @@ export async function syncLocalStorageWithSettings(page: Page, appName: string) return; const settingsFile = path.join(registryDirectory, '.settings', `${appName}.json`); - const controller = new ProgressController(serverSideCallMetadata(), page); + const controller = new ProgressController(); await controller.run(async progress => { await page.exposeBinding(progress, '_saveSerializedSettings', false, (_, settings) => { fs.mkdirSync(path.dirname(settingsFile), { recursive: true }); diff --git a/packages/playwright-core/src/server/playwright.ts b/packages/playwright-core/src/server/playwright.ts index c30fb54ef89da..bdd98bd8af02c 100644 --- a/packages/playwright-core/src/server/playwright.ts +++ b/packages/playwright-core/src/server/playwright.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { debugLogger } from '../utils'; import { Android } from './android/android'; import { AdbBackend } from './android/backendAdb'; import { BidiChromium } from './bidi/bidiChromium'; @@ -29,7 +28,6 @@ import { WebKit } from './webkit/webkit'; import type { BrowserType } from './browserType'; import type { Language } from '../utils'; import type { Browser } from './browser'; -import type { CallMetadata } from './instrumentation'; import type { Page } from './page'; type PlaywrightOptions = { @@ -60,9 +58,6 @@ export class Playwright extends SdkObject { onBrowserClose: browser => this._allBrowsers.delete(browser), onPageOpen: page => this._allPages.add(page), onPageClose: page => this._allPages.delete(page), - onCallLog: (sdkObject: SdkObject, metadata: CallMetadata, logName: string, message: string) => { - debugLogger.log(logName as any, message); - } }, null); this.chromium = new Chromium(this); this._bidiChromium = new BidiChromium(this); diff --git a/packages/playwright-core/src/server/progress.ts b/packages/playwright-core/src/server/progress.ts index 7fde3f2557657..5e9ef3db00ca3 100644 --- a/packages/playwright-core/src/server/progress.ts +++ b/packages/playwright-core/src/server/progress.ts @@ -19,7 +19,7 @@ import { assert } from '../utils'; import { ManualPromise } from '../utils/isomorphic/manualPromise'; import type { Progress } from '@protocol/progress'; -import type { CallMetadata, SdkObject } from './instrumentation'; +import type { CallMetadata } from './instrumentation'; export type { Progress } from '@protocol/progress'; @@ -27,13 +27,13 @@ export class ProgressController { private _forceAbortPromise = new ManualPromise(); private _donePromise = new ManualPromise(); private _state: 'before' | 'running' | { error: Error } | 'finished' = 'before'; - private _sdkObject: SdkObject; + private _onCallLog?: (message: string) => void; readonly metadata: CallMetadata; - constructor(metadata: CallMetadata, sdkObject: SdkObject) { - this.metadata = metadata; - this._sdkObject = sdkObject; + constructor(metadata?: CallMetadata, onCallLog?: (message: string) => void) { + this.metadata = metadata || { id: '', startTime: 0, endTime: 0, type: 'Internal', method: '', params: {}, log: [], internal: true }; + this._onCallLog = onCallLog; this._forceAbortPromise.catch(e => null); // Prevent unhandled promise rejection. } @@ -55,7 +55,7 @@ export class ProgressController { if (this._state === 'running') this.metadata.log.push(message); // Note: we might be sending logs after progress has finished, for example browser logs. - this._sdkObject.instrumentation.onCallLog(this._sdkObject, this.metadata, this._sdkObject.logName || 'api', message); + this._onCallLog?.(message); }, metadata: this.metadata, race: (promise: Promise | Promise[]) => { diff --git a/packages/playwright-core/src/server/recorder.ts b/packages/playwright-core/src/server/recorder.ts index 5b4a0d6646cea..359583f071c62 100644 --- a/packages/playwright-core/src/server/recorder.ts +++ b/packages/playwright-core/src/server/recorder.ts @@ -24,7 +24,6 @@ import { buildFullSelector, generateFrameSelector, metadataToCallLog } from './r import { locatorOrSelectorAsSelector } from '../utils/isomorphic/locatorParser'; import { stringifySelector } from '../utils/isomorphic/selectorParser'; import { ProgressController } from './progress'; -import { serverSideCallMetadata } from './instrumentation'; import { RecorderSignalProcessor } from './recorder/recorderSignalProcessor'; import * as rawRecorderSource from './../generated/pollingRecorderSource'; import { eventsHelper, monotonicTime } from './../utils'; @@ -159,7 +158,7 @@ export class Recorder extends EventEmitter implements Instrume this.emit(RecorderEvent.ContextClosed); }); - const controller = new ProgressController(serverSideCallMetadata(), this._context); + const controller = new ProgressController(); await controller.run(async progress => { await this._context.exposeBinding(progress, '__pw_recorderState', false, async source => { let actionSelector: string | undefined; diff --git a/packages/playwright-core/src/server/recorder/recorderApp.ts b/packages/playwright-core/src/server/recorder/recorderApp.ts index 53b27991966e6..2bf3df8d0d127 100644 --- a/packages/playwright-core/src/server/recorder/recorderApp.ts +++ b/packages/playwright-core/src/server/recorder/recorderApp.ts @@ -19,7 +19,6 @@ import path from 'path'; import { isUnderTest } from '../utils/debug'; import { mime } from '../../utilsBundle'; -import { serverSideCallMetadata } from '../instrumentation'; import { syncLocalStorageWithSettings } from '../launchApp'; import { launchApp } from '../launchApp'; import { ProgressController } from '../progress'; @@ -77,7 +76,7 @@ export class RecorderApp { private async _init(inspectedContext: BrowserContext) { await syncLocalStorageWithSettings(this._page, 'recorder'); - const controller = new ProgressController(serverSideCallMetadata(), this._page); + const controller = new ProgressController(); await controller.run(async progress => { await this._page.addRequestInterceptor(progress, route => { if (!route.request().url().startsWith('https://playwright/')) { @@ -204,7 +203,7 @@ export class RecorderApp { channel: inspectedContext._browser.options.isChromium ? inspectedContext._browser.options.channel : undefined, } }); - const controller = new ProgressController(serverSideCallMetadata(), appContext._browser); + const controller = new ProgressController(); await controller.run(async progress => { await appContext._browser._defaultContext!._loadDefaultContextAsIs(progress); }); diff --git a/packages/playwright-core/src/server/recorder/recorderRunner.ts b/packages/playwright-core/src/server/recorder/recorderRunner.ts index 474350ca24169..6dfa3bbfa7acf 100644 --- a/packages/playwright-core/src/server/recorder/recorderRunner.ts +++ b/packages/playwright-core/src/server/recorder/recorderRunner.ts @@ -16,7 +16,6 @@ import { serializeExpectedTextValues } from '../../utils'; import { toKeyboardModifiers } from '../codegen/language'; -import { serverSideCallMetadata } from '../instrumentation'; import { buildFullSelector, mainFrameForAction } from './recorderUtils'; import { Progress, ProgressController } from '../progress'; @@ -26,9 +25,8 @@ import type * as actions from '@recorder/actions'; import type { Frame } from '../frames'; export async function performAction(pageAliases: Map, actionInContext: actions.ActionInContext) { - const callMetadata = serverSideCallMetadata(); const mainFrame = mainFrameForAction(pageAliases, actionInContext); - const controller = new ProgressController(callMetadata, mainFrame); + const controller = new ProgressController(); const kActionTimeout = 5000; return await controller.run(progress => performActionImpl(progress, mainFrame, actionInContext), kActionTimeout); } diff --git a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts index 793cc8305f652..d23789a99f541 100644 --- a/packages/playwright-core/src/server/trace/viewer/traceViewer.ts +++ b/packages/playwright-core/src/server/trace/viewer/traceViewer.ts @@ -21,7 +21,6 @@ import { gracefullyProcessExitDoNotHang } from '../../../utils'; import { isUnderTest } from '../../../utils'; import { HttpServer } from '../../utils/httpServer'; import { open } from '../../../utilsBundle'; -import { serverSideCallMetadata } from '../../instrumentation'; import { syncLocalStorageWithSettings } from '../../launchApp'; import { launchApp } from '../../launchApp'; import { createPlaywright } from '../../playwright'; @@ -179,7 +178,7 @@ export async function openTraceViewerApp(url: string, browserName: string, optio }, }); - const controller = new ProgressController(serverSideCallMetadata(), context._browser); + const controller = new ProgressController(); await controller.run(async progress => { await context._browser._defaultContext!._loadDefaultContextAsIs(progress); diff --git a/tests/config/testModeFixtures.ts b/tests/config/testModeFixtures.ts index 97544a3d07263..b247b562999a7 100644 --- a/tests/config/testModeFixtures.ts +++ b/tests/config/testModeFixtures.ts @@ -47,7 +47,7 @@ export const testModeTest = test.extend { - await use((playwright as any)._toImpl); + await use((playwright as any)._connection.toImpl); }, { scope: 'worker' }], toImpl: async ({ toImplInWorkerScope: toImplWorker, mode }, use, testInfo) => { diff --git a/tests/library/slowmo.spec.ts b/tests/library/slowmo.spec.ts index de25e6cdb1cf5..8a1872532b5f8 100644 --- a/tests/library/slowmo.spec.ts +++ b/tests/library/slowmo.spec.ts @@ -21,18 +21,17 @@ import type { TestServer } from '../config/testserver'; async function checkSlowMo(toImpl: (api: any) => any, page: Page, task: () => Promise) { let didSlowMo = false; - const contextDebugger = toImpl(page.context()).debugger(); - contextDebugger._slowMo = 100; - const orig = contextDebugger._doSlowMo; - contextDebugger._doSlowMo = async () => { + const dispatcherConnection = toImpl((page as any)._connection); + const orig = dispatcherConnection._doSlowMo; + dispatcherConnection._doSlowMo = async (sdkObject: any) => { if (didSlowMo) throw new Error('already did slowmo'); await new Promise(x => setTimeout(x, 100)); didSlowMo = true; - return orig.call(contextDebugger); }; await task(); expect(!!didSlowMo).toBe(true); + dispatcherConnection._doSlowMo = orig; } async function checkPageSlowMo(toImpl: (api: any) => any, page: Page, task: () => Promise) {