Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions packages/playwright-core/src/androidServerImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -29,7 +28,7 @@ export class AndroidServerLauncherImpl {
async launchServer(options: LaunchAndroidServerOptions = {}): Promise<BrowserServer> {
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,
Expand Down
5 changes: 2 additions & 3 deletions packages/playwright-core/src/browserServerImpl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -42,7 +41,7 @@ export class BrowserServerLauncherImpl implements BrowserServerLauncher {
async launchServer(options: LaunchServerOptions & { _sharedBrowser?: boolean, _userDataDir?: string } = {}): Promise<BrowserServer> {
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`);
Expand All @@ -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'];
Expand Down
4 changes: 0 additions & 4 deletions packages/playwright-core/src/client/channelOwner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,10 +207,6 @@ export abstract class ChannelOwner<T extends channels.Channel = channels.Channel
}
}

_toImpl(): any {
return this._connection.toImpl?.(this);
}

private toJSON() {
// Jest's expect library tries to print objects sometimes.
// RPC objects can contain links to lots of other objects,
Expand Down
2 changes: 1 addition & 1 deletion packages/playwright-core/src/client/connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ export class Connection extends EventEmitter {
private _localUtils?: LocalUtils;
private _rawBuffers = false;
// Some connections allow resolving in-process dispatchers.
toImpl: ((client: ChannelOwner) => any) | undefined;
toImpl: ((client: ChannelOwner | Connection) => any) | undefined;
private _tracingCount = 0;
readonly _instrumentation: ClientInstrumentation;
// Used from @playwright/test fixtures -> TODO remove?
Expand Down
2 changes: 1 addition & 1 deletion packages/playwright-core/src/client/electron.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ export class ElectronApplication extends ChannelOwner<channels.ElectronApplicati
}

process(): childProcess.ChildProcess {
return this._toImpl().process();
return this._connection.toImpl?.(this)?.process();
}

_onPage(page: Page) {
Expand Down
9 changes: 7 additions & 2 deletions packages/playwright-core/src/inProcessFactory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,12 @@ export function createInProcessPlaywright(): PlaywrightAPI {
dispatcherConnection.onmessage = message => 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;
}
7 changes: 3 additions & 4 deletions packages/playwright-core/src/remote/playwrightServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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 {
Expand Down
4 changes: 2 additions & 2 deletions packages/playwright-core/src/server/android/android.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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;
Expand Down
16 changes: 0 additions & 16 deletions packages/playwright-core/src/server/debugger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ export class Debugger extends EventEmitter implements InstrumentationListener {
PausedStateChanged: 'pausedstatechanged'
};
private _muted = false;
private _slowMo: number | undefined;

constructor(context: BrowserContext) {
super();
Expand All @@ -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) {
Expand All @@ -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<void> {
if (this._slowMo && shouldSlowMo(metadata))
await this._doSlowMo();
}

async onBeforeInputAction(sdkObject: SdkObject, metadata: CallMetadata): Promise<void> {
if (this._muted)
return;
Expand Down Expand Up @@ -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;
}
19 changes: 16 additions & 3 deletions packages/playwright-core/src/server/dispatchers/dispatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -101,7 +101,11 @@ export class Dispatcher<Type extends SdkObject, ChannelType, ParentScopeType ext
}

async _runCommand(callMetadata: CallMetadata, method: string, validParams: any) {
const controller = new ProgressController(callMetadata, this._object);
const controller = new ProgressController(callMetadata, message => {
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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<void> {
const slowMo = sdkObject.attribution.browser?.options.slowMo;
if (slowMo)
await new Promise(f => setTimeout(f, slowMo));
}
}

function closeReason(sdkObject: SdkObject): string | undefined {
Expand Down
4 changes: 2 additions & 2 deletions packages/playwright-core/src/server/frames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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),
Expand Down
1 change: 0 additions & 1 deletion packages/playwright-core/src/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
12 changes: 0 additions & 12 deletions packages/playwright-core/src/server/instrumentation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,15 +111,3 @@ export function createInstrumentation(): Instrumentation {
},
});
}

export function serverSideCallMetadata(): CallMetadata {
return {
id: '',
startTime: 0,
endTime: 0,
type: 'Internal',
method: '',
params: {},
log: [],
};
}
5 changes: 2 additions & 3 deletions packages/playwright-core/src/server/launchApp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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, '', {
Expand Down Expand Up @@ -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 });
Expand Down
5 changes: 0 additions & 5 deletions packages/playwright-core/src/server/playwright.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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 = {
Expand Down Expand Up @@ -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);
Expand Down
12 changes: 6 additions & 6 deletions packages/playwright-core/src/server/progress.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ 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';

export class ProgressController {
private _forceAbortPromise = new ManualPromise<any>();
private _donePromise = new ManualPromise<void>();
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.
}

Expand All @@ -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: <T>(promise: Promise<T> | Promise<T>[]) => {
Expand Down
3 changes: 1 addition & 2 deletions packages/playwright-core/src/server/recorder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -159,7 +158,7 @@ export class Recorder extends EventEmitter<RecorderEventMap> 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;
Expand Down
Loading
Loading