diff --git a/packages/playwright-core/src/client/android.ts b/packages/playwright-core/src/client/android.ts index 4b3ca152ee..9833dd3024 100644 --- a/packages/playwright-core/src/client/android.ts +++ b/packages/playwright-core/src/client/android.ts @@ -51,9 +51,7 @@ export class Android extends ChannelOwner implements ap setDefaultTimeout(timeout: number) { this._timeoutSettings.setDefaultTimeout(timeout); - this._wrapApiCall(async () => { - await this._channel.setDefaultTimeoutNoReply({ timeout }); - }, true).catch(() => {}); + this._channel.setDefaultTimeoutNoReply({ timeout }).catch(() => {}); } async devices(options: { port?: number } = {}): Promise { @@ -135,9 +133,7 @@ export class AndroidDevice extends ChannelOwner i setDefaultTimeout(timeout: number) { this._timeoutSettings.setDefaultTimeout(timeout); - this._wrapApiCall(async () => { - await this._channel.setDefaultTimeoutNoReply({ timeout }); - }, true).catch(() => {}); + this._channel.setDefaultTimeoutNoReply({ timeout }).catch(() => {}); } serial(): string { diff --git a/packages/playwright-core/src/client/browser.ts b/packages/playwright-core/src/client/browser.ts index a12bf108a8..c56ec5dd41 100644 --- a/packages/playwright-core/src/client/browser.ts +++ b/packages/playwright-core/src/client/browser.ts @@ -71,9 +71,7 @@ export class Browser extends ChannelOwner implements ap } async _stopPendingOperations(reason: string) { - return await this._wrapApiCall(async () => { - await this._channel.stopPendingOperations({ reason }); - }, true); + await this._channel.stopPendingOperations({ reason }); } async _innerNewContext(options: BrowserContextOptions = {}, forReuse: boolean): Promise { diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index accee95288..50c61e1fab 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -219,7 +219,7 @@ export class BrowserContext extends ChannelOwner this._routes.splice(index, 1); const handled = await routeHandler.handle(route); if (!this._routes.length) - this._wrapApiCall(() => this._updateInterceptionPatterns(), true).catch(() => {}); + this._updateInterceptionPatterns().catch(() => {}); if (handled) return; } @@ -245,16 +245,12 @@ export class BrowserContext extends ChannelOwner setDefaultNavigationTimeout(timeout: number | undefined) { this._timeoutSettings.setDefaultNavigationTimeout(timeout); - this._wrapApiCall(async () => { - await this._channel.setDefaultNavigationTimeoutNoReply({ timeout }); - }, true).catch(() => {}); + this._channel.setDefaultNavigationTimeoutNoReply({ timeout }).catch(() => {}); } setDefaultTimeout(timeout: number | undefined) { this._timeoutSettings.setDefaultTimeout(timeout); - this._wrapApiCall(async () => { - await this._channel.setDefaultTimeoutNoReply({ timeout }); - }, true).catch(() => {}); + this._channel.setDefaultTimeoutNoReply({ timeout }).catch(() => {}); } browser(): Browser | null { @@ -476,9 +472,7 @@ export class BrowserContext extends ChannelOwner return; this._closeReason = options.reason; this._closeWasCalled = true; - await this._wrapApiCall(async () => { - await this.request.dispose(options); - }, true); + await this.request.dispose(options); await this._wrapApiCall(async () => { await this._browserType?._willCloseContext(this); for (const [harId, harParams] of this._harRecorders) { diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index aaf8c6beb2..bb12d92703 100644 --- a/packages/playwright-core/src/client/channelOwner.ts +++ b/packages/playwright-core/src/client/channelOwner.ts @@ -16,6 +16,7 @@ import { EventEmitter } from './eventEmitter'; import { ValidationError, maybeFindValidator } from '../protocol/validator'; +import { methodMetainfo } from '../protocol/debug'; import { captureLibraryStackTrace } from './clientStackTrace'; import { stringifyStackFrames } from '../utils/isomorphic/stackTrace'; @@ -40,7 +41,6 @@ export abstract class ChannelOwner = new Map(); - private _isInternalType = false; _wasCollected: boolean = false; constructor(parent: ChannelOwner | Connection, type: string, guid: string, initializer: channels.InitializerTraits) { @@ -63,21 +63,14 @@ export abstract class ChannelOwner) { this._eventToSubscriptionMapping = mapping; } private _updateSubscription(event: string | symbol, enabled: boolean) { const protocolEvent = this._eventToSubscriptionMapping.get(String(event)); - if (protocolEvent) { - this._wrapApiCall(async () => { - await (this._channel as any).updateSubscription({ event: protocolEvent, enabled }); - }, true).catch(() => {}); - } + if (protocolEvent) + (this._channel as any).updateSubscription({ event: protocolEvent, enabled }).catch(() => {}); } override on(event: string | symbol, listener: Listener): this { @@ -154,6 +147,7 @@ export abstract class ChannelOwner { if (typeof prop === 'string') { const validator = maybeFindValidator(this._type, prop, 'Params'); + const { internal } = methodMetainfo.get(this._type + '.' + prop) || {}; if (validator) { return async (params: any) => { return await this._wrapApiCall(async apiZone => { @@ -169,7 +163,7 @@ export abstract class ChannelOwner(func: (apiZone: ApiZone) => Promise, isInternal?: boolean): Promise { + async _wrapApiCall(func: (apiZone: ApiZone) => Promise, isInternal: boolean = false): Promise { const logger = this._logger; const existingApiZone = this._platform.zones.current().data(); if (existingApiZone) return await func(existingApiZone); - if (isInternal === undefined) - isInternal = this._isInternalType; const stackTrace = captureLibraryStackTrace(this._platform); const apiZone: ApiZone = { apiName: stackTrace.apiName, frames: stackTrace.frames, isInternal, reported: false, userData: undefined, stepId: undefined }; diff --git a/packages/playwright-core/src/client/localUtils.ts b/packages/playwright-core/src/client/localUtils.ts index 5ba982251f..79a035c0f6 100644 --- a/packages/playwright-core/src/client/localUtils.ts +++ b/packages/playwright-core/src/client/localUtils.ts @@ -34,7 +34,6 @@ export class LocalUtils extends ChannelOwner { constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.LocalUtilsInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); this.devices = {}; for (const { name, descriptor } of initializer.deviceDescriptors) this.devices[name] = descriptor; diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index 4670f6d059..7121659828 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -102,7 +102,6 @@ export class Request extends ChannelOwner implements ap constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.RequestInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); this._redirectedFrom = Request.fromNullable(initializer.redirectedFrom); if (this._redirectedFrom) this._redirectedFrom._redirectedTo = this; @@ -177,7 +176,7 @@ export class Request extends ChannelOwner implements ap if (!this._actualHeadersPromise) { this._actualHeadersPromise = this._wrapApiCall(async () => { return new RawHeaders((await this._channel.rawRequestHeaders()).headers); - }); + }, true); } return await this._actualHeadersPromise; } @@ -199,9 +198,7 @@ export class Request extends ChannelOwner implements ap } async _internalResponse(): Promise { - return await this._wrapApiCall(async () => { - return Response.fromNullable((await this._channel.response()).response); - }, true); + return Response.fromNullable((await this._channel.response()).response); } frame(): Frame { @@ -305,7 +302,6 @@ export class Route extends ChannelOwner implements api.Ro constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.RouteInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); } request(): Request { @@ -352,7 +348,7 @@ export class Route extends ChannelOwner implements api.Ro await this._handleRoute(async () => { await this._wrapApiCall(async () => { await this._innerFulfill(options); - }); + }, true); }); } @@ -468,7 +464,6 @@ export class WebSocketRoute extends ChannelOwner constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.WebSocketRouteInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); this._server = { onMessage: (handler: (message: string | Buffer) => any) => { @@ -651,7 +646,6 @@ export class Response extends ChannelOwner implements constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.ResponseInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); this._provisionalHeaders = new RawHeaders(initializer.headers); this._request = Request.from(this._initializer.request); Object.assign(this._request._timing, this._initializer.timing); diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 34d7b83980..bdc36d3a6a 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -846,7 +846,6 @@ export class BindingCall extends ChannelOwner { constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.BindingCallInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); } async call(func: (source: structs.BindingSource, ...args: any[]) => any) { diff --git a/packages/playwright-core/src/client/tracing.ts b/packages/playwright-core/src/client/tracing.ts index 5b80f30a0a..24c2157683 100644 --- a/packages/playwright-core/src/client/tracing.ts +++ b/packages/playwright-core/src/client/tracing.ts @@ -32,7 +32,6 @@ export class Tracing extends ChannelOwner implements ap constructor(parent: ChannelOwner, type: string, guid: string, initializer: channels.TracingInitializer) { super(parent, type, guid, initializer); - this.markAsInternalType(); } async start(options: { name?: string, title?: string, snapshots?: boolean, screenshots?: boolean, sources?: boolean, _live?: boolean } = {}) { @@ -53,15 +52,11 @@ export class Tracing extends ChannelOwner implements ap } async group(name: string, options: { location?: { file: string, line?: number, column?: number } } = {}) { - await this._wrapApiCall(async () => { - await this._channel.tracingGroup({ name, location: options.location }); - }, false); + await this._channel.tracingGroup({ name, location: options.location }); } async groupEnd() { - await this._wrapApiCall(async () => { - await this._channel.tracingGroupEnd(); - }, false); + await this._channel.tracingGroupEnd(); } private async _startCollectingStacks(traceName: string) { diff --git a/packages/playwright-core/src/client/webSocket.ts b/packages/playwright-core/src/client/webSocket.ts index 2d3541b4f6..39ce48892b 100644 --- a/packages/playwright-core/src/client/webSocket.ts +++ b/packages/playwright-core/src/client/webSocket.ts @@ -62,17 +62,13 @@ class JsonPipeTransport implements Transport { } async connect(params: channels.LocalUtilsConnectParams) { - const { pipe, headers: connectHeaders } = await this._owner._wrapApiCall(async () => { - return await this._owner._channel.connect(params); - }, /* isInternal */ true); + const { pipe, headers: connectHeaders } = await this._owner._channel.connect(params); this._pipe = pipe; return connectHeaders; } async send(message: object) { - await this._owner._wrapApiCall(async () => { - await this._pipe!.send({ message }); - }, /* isInternal */ true); + await this._pipe!.send({ message }); } onMessage(callback: (message: object) => void) { @@ -84,9 +80,7 @@ class JsonPipeTransport implements Transport { } async close() { - await this._owner._wrapApiCall(async () => { - await this._pipe!.close().catch(() => {}); - }, /* isInternal */ true); + await this._pipe!.close().catch(() => {}); } } diff --git a/packages/playwright-core/src/protocol/debug.ts b/packages/playwright-core/src/protocol/debug.ts index 032e64c516..5420e32796 100644 --- a/packages/playwright-core/src/protocol/debug.ts +++ b/packages/playwright-core/src/protocol/debug.ts @@ -16,186 +16,291 @@ // This file is generated by generate_channels.js, do not edit manually. -export const slowMoActions = new Set([ - 'Page.goBack', - 'Page.goForward', - 'Page.reload', - 'Page.keyboardDown', - 'Page.keyboardUp', - 'Page.keyboardInsertText', - 'Page.keyboardType', - 'Page.keyboardPress', - 'Page.mouseMove', - 'Page.mouseDown', - 'Page.mouseUp', - 'Page.mouseClick', - 'Page.mouseWheel', - 'Page.touchscreenTap', - 'Frame.blur', - 'Frame.check', - 'Frame.click', - 'Frame.dragAndDrop', - 'Frame.dblclick', - 'Frame.dispatchEvent', - 'Frame.fill', - 'Frame.focus', - 'Frame.goto', - 'Frame.hover', - 'Frame.press', - 'Frame.selectOption', - 'Frame.setInputFiles', - 'Frame.tap', - 'Frame.type', - 'Frame.uncheck', - 'ElementHandle.check', - 'ElementHandle.click', - 'ElementHandle.dblclick', - 'ElementHandle.dispatchEvent', - 'ElementHandle.fill', - 'ElementHandle.focus', - 'ElementHandle.hover', - 'ElementHandle.press', - 'ElementHandle.scrollIntoViewIfNeeded', - 'ElementHandle.selectOption', - 'ElementHandle.selectText', - 'ElementHandle.setInputFiles', - 'ElementHandle.tap', - 'ElementHandle.type', - 'ElementHandle.uncheck' -]); - -export const commandsWithTracingSnapshots = new Set([ - 'EventTarget.waitForEventInfo', - 'BrowserContext.waitForEventInfo', - 'Page.waitForEventInfo', - 'WebSocket.waitForEventInfo', - 'ElectronApplication.waitForEventInfo', - 'AndroidDevice.waitForEventInfo', - 'Page.emulateMedia', - 'Page.goBack', - 'Page.goForward', - 'Page.reload', - 'Page.expectScreenshot', - 'Page.screenshot', - 'Page.setViewportSize', - 'Page.keyboardDown', - 'Page.keyboardUp', - 'Page.keyboardInsertText', - 'Page.keyboardType', - 'Page.keyboardPress', - 'Page.mouseMove', - 'Page.mouseDown', - 'Page.mouseUp', - 'Page.mouseClick', - 'Page.mouseWheel', - 'Page.touchscreenTap', - 'Page.accessibilitySnapshot', - 'Page.snapshotForAI', - 'Frame.evalOnSelector', - 'Frame.evalOnSelectorAll', - 'Frame.addScriptTag', - 'Frame.addStyleTag', - 'Frame.ariaSnapshot', - 'Frame.blur', - 'Frame.check', - 'Frame.click', - 'Frame.content', - 'Frame.dragAndDrop', - 'Frame.dblclick', - 'Frame.dispatchEvent', - 'Frame.evaluateExpression', - 'Frame.evaluateExpressionHandle', - 'Frame.fill', - 'Frame.focus', - 'Frame.getAttribute', - 'Frame.goto', - 'Frame.hover', - 'Frame.innerHTML', - 'Frame.innerText', - 'Frame.inputValue', - 'Frame.isChecked', - 'Frame.isDisabled', - 'Frame.isEnabled', - 'Frame.isHidden', - 'Frame.isVisible', - 'Frame.isEditable', - 'Frame.press', - 'Frame.querySelector', - 'Frame.querySelectorAll', - 'Frame.queryCount', - 'Frame.selectOption', - 'Frame.setContent', - 'Frame.setInputFiles', - 'Frame.tap', - 'Frame.textContent', - 'Frame.type', - 'Frame.uncheck', - 'Frame.waitForTimeout', - 'Frame.waitForFunction', - 'Frame.waitForSelector', - 'Frame.expect', - 'JSHandle.evaluateExpression', - 'ElementHandle.evaluateExpression', - 'JSHandle.evaluateExpressionHandle', - 'ElementHandle.evaluateExpressionHandle', - 'ElementHandle.evalOnSelector', - 'ElementHandle.evalOnSelectorAll', - 'ElementHandle.boundingBox', - 'ElementHandle.check', - 'ElementHandle.click', - 'ElementHandle.contentFrame', - 'ElementHandle.dblclick', - 'ElementHandle.dispatchEvent', - 'ElementHandle.fill', - 'ElementHandle.focus', - 'ElementHandle.hover', - 'ElementHandle.innerHTML', - 'ElementHandle.innerText', - 'ElementHandle.inputValue', - 'ElementHandle.isChecked', - 'ElementHandle.isDisabled', - 'ElementHandle.isEditable', - 'ElementHandle.isEnabled', - 'ElementHandle.isHidden', - 'ElementHandle.isVisible', - 'ElementHandle.press', - 'ElementHandle.querySelector', - 'ElementHandle.querySelectorAll', - 'ElementHandle.screenshot', - 'ElementHandle.scrollIntoViewIfNeeded', - 'ElementHandle.selectOption', - 'ElementHandle.selectText', - 'ElementHandle.setInputFiles', - 'ElementHandle.tap', - 'ElementHandle.textContent', - 'ElementHandle.type', - 'ElementHandle.uncheck', - 'ElementHandle.waitForElementState', - 'ElementHandle.waitForSelector' -]); - -export const pausesBeforeInputActions = new Set([ - 'Frame.check', - 'Frame.click', - 'Frame.dragAndDrop', - 'Frame.dblclick', - 'Frame.fill', - 'Frame.hover', - 'Frame.press', - 'Frame.selectOption', - 'Frame.setInputFiles', - 'Frame.tap', - 'Frame.type', - 'Frame.uncheck', - 'ElementHandle.check', - 'ElementHandle.click', - 'ElementHandle.dblclick', - 'ElementHandle.fill', - 'ElementHandle.hover', - 'ElementHandle.press', - 'ElementHandle.selectOption', - 'ElementHandle.setInputFiles', - 'ElementHandle.tap', - 'ElementHandle.type', - 'ElementHandle.uncheck' +export const methodMetainfo = new Map([ + ['APIRequestContext.fetch', { title: 'Fetch', }], + ['APIRequestContext.fetchResponseBody', { internal: true, }], + ['APIRequestContext.fetchLog', { internal: true, }], + ['APIRequestContext.storageState', { internal: true, }], + ['APIRequestContext.disposeAPIResponse', { internal: true, }], + ['APIRequestContext.dispose', { internal: true, }], + ['LocalUtils.zip', { internal: true, }], + ['LocalUtils.harOpen', { internal: true, }], + ['LocalUtils.harLookup', { internal: true, }], + ['LocalUtils.harClose', { internal: true, }], + ['LocalUtils.harUnzip', { internal: true, }], + ['LocalUtils.connect', { internal: true, }], + ['LocalUtils.tracingStarted', { internal: true, }], + ['LocalUtils.addStackToTracingNoReply', { internal: true, }], + ['LocalUtils.traceDiscarded', { internal: true, }], + ['LocalUtils.globToRegex', { internal: true, }], + ['Root.initialize', { internal: true, }], + ['Playwright.newRequest', { title: 'Create request context', }], + ['DebugController.initialize', { internal: true, }], + ['DebugController.setReportStateChanged', { internal: true, }], + ['DebugController.resetForReuse', { internal: true, }], + ['DebugController.navigate', { internal: true, }], + ['DebugController.setRecorderMode', { internal: true, }], + ['DebugController.highlight', { internal: true, }], + ['DebugController.hideHighlight', { internal: true, }], + ['DebugController.resume', { internal: true, }], + ['DebugController.kill', { internal: true, }], + ['DebugController.closeAllBrowsers', { internal: true, }], + ['SocksSupport.socksConnected', { internal: true, }], + ['SocksSupport.socksFailed', { internal: true, }], + ['SocksSupport.socksData', { internal: true, }], + ['SocksSupport.socksError', { internal: true, }], + ['SocksSupport.socksEnd', { internal: true, }], + ['Selectors.register', { internal: true, }], + ['Selectors.setTestIdAttributeName', { internal: true, }], + ['BrowserType.launch', { title: 'Launch browser', }], + ['BrowserType.launchPersistentContext', { title: 'Launch persistent context', }], + ['BrowserType.connectOverCDP', { title: 'Connect over CDP', }], + ['Browser.close', { title: 'Close browser', }], + ['Browser.killForTests', { internal: true, }], + ['Browser.defaultUserAgentForTest', { internal: true, }], + ['Browser.newContext', { title: 'Create new context', }], + ['Browser.newContextForReuse', { internal: true, }], + ['Browser.stopPendingOperations', { internal: true, title: 'Stop pending operations', }], + ['Browser.newBrowserCDPSession', { internal: true, title: 'Create CDP session', }], + ['Browser.startTracing', { internal: true, }], + ['Browser.stopTracing', { internal: true, }], + ['EventTarget.waitForEventInfo', { internal: true, snapshot: true, }], + ['BrowserContext.addCookies', { title: 'Add cookies', }], + ['BrowserContext.addInitScript', { title: 'Add init script', }], + ['BrowserContext.clearCookies', { title: 'Clear cookies', }], + ['BrowserContext.clearPermissions', { title: 'Clear permissions', }], + ['BrowserContext.close', { title: 'Close context', }], + ['BrowserContext.cookies', { title: 'Get cookies', }], + ['BrowserContext.exposeBinding', { title: 'Expose binding', }], + ['BrowserContext.grantPermissions', { title: 'Grant permissions', }], + ['BrowserContext.newPage', { title: 'Create new page', }], + ['BrowserContext.setDefaultNavigationTimeoutNoReply', { internal: true, }], + ['BrowserContext.setDefaultTimeoutNoReply', { internal: true, }], + ['BrowserContext.setExtraHTTPHeaders', { title: 'Set extra HTTP headers', }], + ['BrowserContext.setGeolocation', { title: 'Set geolocation', }], + ['BrowserContext.setHTTPCredentials', { title: 'Set HTTP credentials', }], + ['BrowserContext.setNetworkInterceptionPatterns', { }], + ['BrowserContext.setWebSocketInterceptionPatterns', { title: 'Route web sockets', }], + ['BrowserContext.setOffline', { title: 'Set offline mode', }], + ['BrowserContext.storageState', { title: 'Get storage state', }], + ['BrowserContext.pause', { title: 'Pause', }], + ['BrowserContext.enableRecorder', { internal: true, }], + ['BrowserContext.newCDPSession', { internal: true, }], + ['BrowserContext.harStart', { internal: true, }], + ['BrowserContext.harExport', { internal: true, }], + ['BrowserContext.createTempFiles', { internal: true, }], + ['BrowserContext.updateSubscription', { internal: true, }], + ['BrowserContext.clockFastForward', { title: 'Fast forward clock', }], + ['BrowserContext.clockInstall', { title: 'Install clock', }], + ['BrowserContext.clockPauseAt', { title: 'Pause clock', }], + ['BrowserContext.clockResume', { title: 'Resume clock', }], + ['BrowserContext.clockRunFor', { title: 'Run clock', }], + ['BrowserContext.clockSetFixedTime', { title: 'Set fixed time', }], + ['BrowserContext.clockSetSystemTime', { title: 'Set system time', }], + ['Page.setDefaultNavigationTimeoutNoReply', { internal: true, }], + ['Page.setDefaultTimeoutNoReply', { internal: true, }], + ['Page.addInitScript', { }], + ['Page.close', { }], + ['Page.emulateMedia', { title: 'Emulate media', snapshot: true, }], + ['Page.exposeBinding', { title: 'Expose binding', }], + ['Page.goBack', { title: 'Go back', slowMo: true, snapshot: true, }], + ['Page.goForward', { title: 'Go forward', slowMo: true, snapshot: true, }], + ['Page.requestGC', { title: 'Request garbage collection', }], + ['Page.registerLocatorHandler', { title: 'Register locator handler', }], + ['Page.resolveLocatorHandlerNoReply', { internal: true, }], + ['Page.unregisterLocatorHandler', { title: 'Unregister locator handler', }], + ['Page.reload', { title: 'Reload', slowMo: true, snapshot: true, }], + ['Page.expectScreenshot', { title: 'Expect screenshot', snapshot: true, }], + ['Page.screenshot', { title: 'Screenshot', snapshot: true, }], + ['Page.setExtraHTTPHeaders', { title: 'Set extra HTTP headers', }], + ['Page.setNetworkInterceptionPatterns', { title: 'Route', }], + ['Page.setWebSocketInterceptionPatterns', { title: 'Route web sockets', }], + ['Page.setViewportSize', { title: 'Set viewport size', snapshot: true, }], + ['Page.keyboardDown', { title: 'Key down', slowMo: true, snapshot: true, }], + ['Page.keyboardUp', { title: 'Key up', slowMo: true, snapshot: true, }], + ['Page.keyboardInsertText', { title: 'Insert text', slowMo: true, snapshot: true, }], + ['Page.keyboardType', { title: 'Type', slowMo: true, snapshot: true, }], + ['Page.keyboardPress', { title: 'Press', slowMo: true, snapshot: true, }], + ['Page.mouseMove', { title: 'Move mouse', slowMo: true, snapshot: true, }], + ['Page.mouseDown', { title: 'Mouse down', slowMo: true, snapshot: true, }], + ['Page.mouseUp', { title: 'Mouse up', slowMo: true, snapshot: true, }], + ['Page.mouseClick', { title: 'Click', slowMo: true, snapshot: true, }], + ['Page.mouseWheel', { title: 'Mouse wheel', slowMo: true, snapshot: true, }], + ['Page.touchscreenTap', { title: 'Tap', slowMo: true, snapshot: true, }], + ['Page.accessibilitySnapshot', { internal: true, snapshot: true, }], + ['Page.pdf', { title: 'PDF', }], + ['Page.snapshotForAI', { internal: true, snapshot: true, }], + ['Page.startJSCoverage', { internal: true, }], + ['Page.stopJSCoverage', { internal: true, }], + ['Page.startCSSCoverage', { internal: true, }], + ['Page.stopCSSCoverage', { internal: true, }], + ['Page.bringToFront', { title: 'Bring to front', }], + ['Page.updateSubscription', { internal: true, }], + ['Frame.evalOnSelector', { title: 'Evaluate', snapshot: true, }], + ['Frame.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, }], + ['Frame.addScriptTag', { title: 'Add script tag', snapshot: true, }], + ['Frame.addStyleTag', { title: 'Add style tag', snapshot: true, }], + ['Frame.ariaSnapshot', { title: 'Aria snapshot', snapshot: true, }], + ['Frame.blur', { title: 'Blur', slowMo: true, snapshot: true, }], + ['Frame.check', { title: 'Check', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.click', { title: 'Click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.content', { title: 'Get content', snapshot: true, }], + ['Frame.dragAndDrop', { title: 'Drag and drop', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.dblclick', { title: 'Double click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.dispatchEvent', { title: 'Dispatch event', slowMo: true, snapshot: true, }], + ['Frame.evaluateExpression', { title: 'Evaluate', snapshot: true, }], + ['Frame.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, }], + ['Frame.fill', { title: 'Fill', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.focus', { title: 'Focus', slowMo: true, snapshot: true, }], + ['Frame.frameElement', { internal: true, }], + ['Frame.highlight', { internal: true, }], + ['Frame.getAttribute', { internal: true, snapshot: true, }], + ['Frame.goto', { title: 'Navigate', slowMo: true, snapshot: true, }], + ['Frame.hover', { title: 'Hover', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.innerHTML', { title: 'Get HTML', snapshot: true, }], + ['Frame.innerText', { title: 'Get inner text', snapshot: true, }], + ['Frame.inputValue', { title: 'Get input value', snapshot: true, }], + ['Frame.isChecked', { title: 'Is checked', snapshot: true, }], + ['Frame.isDisabled', { title: 'Is disabled', snapshot: true, }], + ['Frame.isEnabled', { title: 'Is enabled', snapshot: true, }], + ['Frame.isHidden', { title: 'Is hidden', snapshot: true, }], + ['Frame.isVisible', { title: 'Is visible', snapshot: true, }], + ['Frame.isEditable', { title: 'Is editable', snapshot: true, }], + ['Frame.press', { title: 'Press', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.querySelector', { title: 'Query selector', snapshot: true, }], + ['Frame.querySelectorAll', { title: 'Query selector all', snapshot: true, }], + ['Frame.queryCount', { title: 'Query count', snapshot: true, }], + ['Frame.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.setContent', { title: 'Set content', snapshot: true, }], + ['Frame.setInputFiles', { title: 'Set input files', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.tap', { title: 'Tap', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.textContent', { title: 'Get text content', snapshot: true, }], + ['Frame.title', { internal: true, }], + ['Frame.type', { title: 'Type', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.uncheck', { title: 'Uncheck', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.waitForTimeout', { title: 'Wait for timeout', snapshot: true, }], + ['Frame.waitForFunction', { title: 'Wait for function', snapshot: true, }], + ['Frame.waitForSelector', { title: 'Wait for selector', snapshot: true, }], + ['Frame.expect', { title: 'Expect', snapshot: true, }], + ['Worker.evaluateExpression', { title: 'Evaluate', }], + ['Worker.evaluateExpressionHandle', { title: 'Evaluate', }], + ['JSHandle.dispose', { }], + ['JSHandle.evaluateExpression', { title: 'Evaluate', snapshot: true, }], + ['JSHandle.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, }], + ['JSHandle.getPropertyList', { internal: true, }], + ['JSHandle.getProperty', { internal: true, }], + ['JSHandle.jsonValue', { internal: true, }], + ['ElementHandle.evalOnSelector', { title: 'Evaluate', snapshot: true, }], + ['ElementHandle.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, }], + ['ElementHandle.boundingBox', { title: 'Get bounding box', snapshot: true, }], + ['ElementHandle.check', { title: 'Check', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.click', { title: 'Click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.contentFrame', { internal: true, snapshot: true, }], + ['ElementHandle.dblclick', { title: 'Double click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.dispatchEvent', { title: 'Dispatch event', slowMo: true, snapshot: true, }], + ['ElementHandle.fill', { title: 'Fill', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.focus', { title: 'Focus', slowMo: true, snapshot: true, }], + ['ElementHandle.generateLocatorString', { internal: true, }], + ['ElementHandle.getAttribute', { internal: true, }], + ['ElementHandle.hover', { title: 'Hover', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.innerHTML', { title: 'Get HTML', snapshot: true, }], + ['ElementHandle.innerText', { title: 'Get inner text', snapshot: true, }], + ['ElementHandle.inputValue', { title: 'Get input value', snapshot: true, }], + ['ElementHandle.isChecked', { title: 'Is checked', snapshot: true, }], + ['ElementHandle.isDisabled', { title: 'Is disabled', snapshot: true, }], + ['ElementHandle.isEditable', { title: 'Is editable', snapshot: true, }], + ['ElementHandle.isEnabled', { title: 'Is enabled', snapshot: true, }], + ['ElementHandle.isHidden', { title: 'Is hidden', snapshot: true, }], + ['ElementHandle.isVisible', { title: 'Is visible', snapshot: true, }], + ['ElementHandle.ownerFrame', { title: 'Get owner frame', }], + ['ElementHandle.press', { title: 'Press', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.querySelector', { title: 'Query selector', snapshot: true, }], + ['ElementHandle.querySelectorAll', { title: 'Query selector all', snapshot: true, }], + ['ElementHandle.screenshot', { title: 'Screenshot', snapshot: true, }], + ['ElementHandle.scrollIntoViewIfNeeded', { title: 'Scroll into view', slowMo: true, snapshot: true, }], + ['ElementHandle.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.selectText', { title: 'Select text', slowMo: true, snapshot: true, }], + ['ElementHandle.setInputFiles', { title: 'Set input files', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.tap', { title: 'Tap', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.textContent', { title: 'Get text content', snapshot: true, }], + ['ElementHandle.type', { title: 'Type', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.uncheck', { title: 'Uncheck', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.waitForElementState', { title: 'Wait for state', snapshot: true, }], + ['ElementHandle.waitForSelector', { title: 'Wait for selector', snapshot: true, }], + ['Request.response', { internal: true, }], + ['Request.rawRequestHeaders', { internal: true, }], + ['Route.redirectNavigationRequest', { internal: true, }], + ['Route.abort', { }], + ['Route.continue', { internal: true, }], + ['Route.fulfill', { internal: true, }], + ['WebSocketRoute.connect', { internal: true, }], + ['WebSocketRoute.ensureOpened', { internal: true, }], + ['WebSocketRoute.sendToPage', { internal: true, }], + ['WebSocketRoute.sendToServer', { internal: true, }], + ['WebSocketRoute.closePage', { internal: true, }], + ['WebSocketRoute.closeServer', { internal: true, }], + ['Response.body', { internal: true, }], + ['Response.securityDetails', { internal: true, }], + ['Response.serverAddr', { internal: true, }], + ['Response.rawResponseHeaders', { internal: true, }], + ['Response.sizes', { internal: true, }], + ['BindingCall.reject', { internal: true, }], + ['BindingCall.resolve', { internal: true, }], + ['Dialog.accept', { title: 'Accept dialog', }], + ['Dialog.dismiss', { title: 'Dismiss dialog', }], + ['Tracing.tracingStart', { internal: true, }], + ['Tracing.tracingStartChunk', { internal: true, }], + ['Tracing.tracingGroup', { title: 'Group', }], + ['Tracing.tracingGroupEnd', { title: 'Group end', }], + ['Tracing.tracingStopChunk', { internal: true, }], + ['Tracing.tracingStop', { internal: true, }], + ['Artifact.pathAfterFinished', { internal: true, }], + ['Artifact.saveAs', { internal: true, }], + ['Artifact.saveAsStream', { internal: true, }], + ['Artifact.failure', { internal: true, }], + ['Artifact.stream', { internal: true, }], + ['Artifact.cancel', { internal: true, }], + ['Artifact.delete', { internal: true, }], + ['Stream.read', { internal: true, }], + ['Stream.close', { internal: true, }], + ['WritableStream.write', { internal: true, }], + ['WritableStream.close', { internal: true, }], + ['CDPSession.send', { internal: true, }], + ['CDPSession.detach', { internal: true, }], + ['Electron.launch', { title: 'Launch electron', }], + ['ElectronApplication.browserWindow', { internal: true, }], + ['ElectronApplication.evaluateExpression', { title: 'Evaluate', }], + ['ElectronApplication.evaluateExpressionHandle', { title: 'Evaluate', }], + ['ElectronApplication.updateSubscription', { internal: true, }], + ['Android.devices', { internal: true, }], + ['Android.setDefaultTimeoutNoReply', { internal: true, }], + ['AndroidSocket.write', { internal: true, }], + ['AndroidSocket.close', { internal: true, }], + ['AndroidDevice.wait', { }], + ['AndroidDevice.fill', { title: 'Fill', }], + ['AndroidDevice.tap', { title: 'Tap', }], + ['AndroidDevice.drag', { title: 'Drag', }], + ['AndroidDevice.fling', { title: 'Fling', }], + ['AndroidDevice.longTap', { title: 'Long tap', }], + ['AndroidDevice.pinchClose', { title: 'Pinch close', }], + ['AndroidDevice.pinchOpen', { title: 'Pinch open', }], + ['AndroidDevice.scroll', { title: 'Scroll', }], + ['AndroidDevice.swipe', { title: 'Swipe', }], + ['AndroidDevice.info', { internal: true, }], + ['AndroidDevice.screenshot', { title: 'Screenshot', }], + ['AndroidDevice.inputType', { title: 'Type', }], + ['AndroidDevice.inputPress', { title: 'Press', }], + ['AndroidDevice.inputTap', { title: 'Tap', }], + ['AndroidDevice.inputSwipe', { title: 'Swipe', }], + ['AndroidDevice.inputDrag', { title: 'Drag', }], + ['AndroidDevice.launchBrowser', { title: 'Launch browser', }], + ['AndroidDevice.open', { title: 'Open app', }], + ['AndroidDevice.shell', { internal: true, }], + ['AndroidDevice.installApk', { title: 'Install apk', }], + ['AndroidDevice.push', { title: 'Push', }], + ['AndroidDevice.setDefaultTimeoutNoReply', { internal: true, }], + ['AndroidDevice.connectToWebView', { internal: true, }], + ['AndroidDevice.close', { internal: true, }], + ['JsonPipe.send', { internal: true, }], + ['JsonPipe.close', { internal: true, }] ]); diff --git a/packages/playwright-core/src/server/debugger.ts b/packages/playwright-core/src/server/debugger.ts index 530a62843d..643714aaf8 100644 --- a/packages/playwright-core/src/server/debugger.ts +++ b/packages/playwright-core/src/server/debugger.ts @@ -18,7 +18,7 @@ import { EventEmitter } from 'events'; import { debugMode, isUnderTest, monotonicTime } from '../utils'; import { BrowserContext } from './browserContext'; -import { commandsWithTracingSnapshots, pausesBeforeInputActions, slowMoActions } from '../protocol/debug'; +import { methodMetainfo } from '../protocol/debug'; import type { CallMetadata, InstrumentationListener, SdkObject } from './instrumentation'; @@ -141,9 +141,11 @@ function shouldPauseBeforeStep(metadata: CallMetadata): boolean { const step = metadata.type + '.' + metadata.method; // Stop before everything that generates snapshot. But don't stop before those marked as pausesBeforeInputActions // since we stop in them on a separate instrumentation signal. - return commandsWithTracingSnapshots.has(step) && !pausesBeforeInputActions.has(metadata.type + '.' + metadata.method); + const metainfo = methodMetainfo.get(step); + return !!metainfo?.snapshot && !metainfo.pausesBeforeInput; } export function shouldSlowMo(metadata: CallMetadata): boolean { - return slowMoActions.has(metadata.type + '.' + metadata.method); + const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); + return !!metainfo?.slowMo; } diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index fd9a724726..d6eb0db758 100644 --- a/packages/playwright-core/src/server/trace/recorder/tracing.ts +++ b/packages/playwright-core/src/server/trace/recorder/tracing.ts @@ -19,7 +19,7 @@ import os from 'os'; import path from 'path'; import { Snapshotter } from './snapshotter'; -import { commandsWithTracingSnapshots } from '../../../protocol/debug'; +import { methodMetainfo } from '../../../protocol/debug'; import { assert } from '../../../utils/isomorphic/assert'; import { monotonicTime } from '../../../utils/isomorphic/time'; import { eventsHelper } from '../../utils/eventsHelper'; @@ -639,7 +639,8 @@ function visitTraceEvent(object: any, sha1s: Set): any { } export function shouldCaptureSnapshot(metadata: CallMetadata): boolean { - return commandsWithTracingSnapshots.has(metadata.type + '.' + metadata.method); + const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); + return !!metainfo?.snapshot; } function createBeforeActionTraceEvent(metadata: CallMetadata, parentId?: string): trace.BeforeActionTraceEvent | null { diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 2e83f20f94..03eaba7837 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -354,6 +354,7 @@ APIRequestContext: commands: fetch: + title: Fetch parameters: url: string encodedParams: string? @@ -381,12 +382,14 @@ APIRequestContext: response: APIResponse fetchResponseBody: + internal: true parameters: fetchUid: string returns: binary: binary? fetchLog: + internal: true parameters: fetchUid: string returns: @@ -395,6 +398,7 @@ APIRequestContext: items: string storageState: + internal: true parameters: indexedDB: boolean? returns: @@ -406,10 +410,12 @@ APIRequestContext: items: OriginStorage disposeAPIResponse: + internal: true parameters: fetchUid: string dispose: + internal: true parameters: reason: string? @@ -642,6 +648,7 @@ LocalUtils: commands: zip: + internal: true parameters: zipFile: string entries: @@ -656,6 +663,7 @@ LocalUtils: includeSources: boolean harOpen: + internal: true parameters: file: string returns: @@ -663,6 +671,7 @@ LocalUtils: error: string? harLookup: + internal: true parameters: harId: string url: string @@ -689,15 +698,18 @@ LocalUtils: body: binary? harClose: + internal: true parameters: harId: string harUnzip: + internal: true parameters: zipFile: string harFile: string connect: + internal: true parameters: wsEndpoint: string headers: json? @@ -712,6 +724,7 @@ LocalUtils: items: NameValue tracingStarted: + internal: true parameters: tracesDir: string? traceName: string @@ -719,14 +732,17 @@ LocalUtils: stacksId: string addStackToTracingNoReply: + internal: true parameters: callData: ClientSideCallMetadata traceDiscarded: + internal: true parameters: stacksId: string globToRegex: + internal: true parameters: glob: string baseURL: string? @@ -740,6 +756,7 @@ Root: commands: initialize: + internal: true parameters: sdkLanguage: type: enum @@ -773,6 +790,7 @@ Playwright: commands: newRequest: + title: Create request context parameters: baseURL: string? userAgent: string? @@ -848,6 +866,7 @@ DebugController: commands: initialize: + internal: true parameters: codegenId: string sdkLanguage: @@ -859,16 +878,20 @@ DebugController: - csharp setReportStateChanged: + internal: true parameters: enabled: boolean resetForReuse: + internal: true navigate: + internal: true parameters: url: string setRecorderMode: + internal: true parameters: mode: type: enum @@ -879,17 +902,22 @@ DebugController: testIdAttributeName: string? highlight: + internal: true parameters: selector: string? ariaTemplate: string? hideHighlight: + internal: true resume: + internal: true kill: + internal: true closeAllBrowsers: + internal: true events: inspectRequested: @@ -924,27 +952,32 @@ SocksSupport: commands: socksConnected: + internal: true parameters: uid: string host: string port: number socksFailed: + internal: true parameters: uid: string errorCode: string socksData: + internal: true parameters: uid: string data: binary socksError: + internal: true parameters: uid: string error: string socksEnd: + internal: true parameters: uid: string @@ -970,12 +1003,14 @@ Selectors: commands: register: + internal: true parameters: name: string source: string contentScript: boolean? setTestIdAttributeName: + internal: true parameters: testIdAttributeName: string @@ -989,6 +1024,7 @@ BrowserType: commands: launch: + title: Launch browser parameters: $mixin: LaunchOptions slowMo: number? @@ -996,6 +1032,7 @@ BrowserType: browser: Browser launchPersistentContext: + title: Launch persistent context parameters: $mixin1: LaunchOptions $mixin2: ContextOptions @@ -1005,6 +1042,7 @@ BrowserType: context: BrowserContext connectOverCDP: + title: Connect over CDP parameters: endpointURL: string headers: @@ -1026,16 +1064,20 @@ Browser: commands: close: + title: Close browser parameters: reason: string? killForTests: + internal: true defaultUserAgentForTest: + internal: true returns: userAgent: string newContext: + title: Create new context parameters: $mixin: ContextOptions proxy: @@ -1058,6 +1100,7 @@ Browser: context: BrowserContext newContextForReuse: + internal: true parameters: $mixin: ContextOptions proxy: @@ -1080,14 +1123,19 @@ Browser: context: BrowserContext stopPendingOperations: + internal: true + title: Stop pending operations parameters: reason: string newBrowserCDPSession: + title: Create CDP session + internal: true returns: session: CDPSession startTracing: + internal: true parameters: page: Page? screenshots: boolean? @@ -1096,10 +1144,10 @@ Browser: items: string stopTracing: + internal: true returns: artifact: Artifact - events: close: @@ -1125,6 +1173,7 @@ EventTarget: commands: waitForEventInfo: + internal: true parameters: info: type: object @@ -1155,16 +1204,19 @@ BrowserContext: commands: addCookies: + title: Add cookies parameters: cookies: type: array items: SetNetworkCookie addInitScript: + title: Add init script parameters: source: string clearCookies: + title: Clear cookies parameters: name: string? nameRegexSource: string? @@ -1177,12 +1229,15 @@ BrowserContext: pathRegexFlags: string? clearPermissions: + title: Clear permissions close: + title: Close context parameters: reason: string? cookies: + title: Get cookies parameters: urls: type: array @@ -1193,11 +1248,13 @@ BrowserContext: items: NetworkCookie exposeBinding: + title: Expose binding parameters: name: string needsHandle: boolean? grantPermissions: + title: Grant permissions parameters: permissions: type: array @@ -1205,24 +1262,29 @@ BrowserContext: origin: string? newPage: + title: Create new page returns: page: Page setDefaultNavigationTimeoutNoReply: + internal: true parameters: timeout: number? setDefaultTimeoutNoReply: + internal: true parameters: timeout: number? setExtraHTTPHeaders: + title: Set extra HTTP headers parameters: headers: type: array items: NameValue setGeolocation: + title: Set geolocation parameters: geolocation: type: object? @@ -1232,6 +1294,7 @@ BrowserContext: accuracy: number? setHTTPCredentials: + title: Set HTTP credentials parameters: httpCredentials: type: object? @@ -1241,6 +1304,7 @@ BrowserContext: origin: string? setNetworkInterceptionPatterns: + tite: Route parameters: patterns: type: array @@ -1252,6 +1316,7 @@ BrowserContext: regexFlags: string? setWebSocketInterceptionPatterns: + title: Route web sockets parameters: patterns: type: array @@ -1263,10 +1328,12 @@ BrowserContext: regexFlags: string? setOffline: + title: Set offline mode parameters: offline: boolean storageState: + title: Get storage state parameters: indexedDB: boolean? returns: @@ -1278,10 +1345,10 @@ BrowserContext: items: OriginStorage pause: - experimental: True + title: Pause enableRecorder: - experimental: True + internal: true parameters: language: string? mode: @@ -1300,6 +1367,7 @@ BrowserContext: omitCallTracking: boolean? newCDPSession: + internal: true parameters: page: Page? frame: Frame? @@ -1307,6 +1375,7 @@ BrowserContext: session: CDPSession harStart: + internal: true parameters: page: Page? options: RecordHarOptions @@ -1314,12 +1383,14 @@ BrowserContext: harId: string harExport: + internal: true parameters: harId: string? returns: artifact: Artifact createTempFiles: + internal: true parameters: rootDirName: string? items: @@ -1336,6 +1407,7 @@ BrowserContext: items: WritableStream updateSubscription: + internal: true parameters: event: type: enum @@ -1349,33 +1421,40 @@ BrowserContext: enabled: boolean clockFastForward: + title: Fast forward clock parameters: ticksNumber: number? ticksString: string? clockInstall: + title: Install clock parameters: timeNumber: number? timeString: string? clockPauseAt: + title: Pause clock parameters: timeNumber: number? timeString: string? clockResume: + title: Resume clock clockRunFor: + title: Run clock parameters: ticksNumber: number? ticksString: string? clockSetFixedTime: + title: Set fixed time parameters: timeNumber: number? timeString: string? clockSetSystemTime: + title: Set system time parameters: timeNumber: number? timeString: string? @@ -1468,10 +1547,12 @@ Page: commands: setDefaultNavigationTimeoutNoReply: + internal: true parameters: timeout: number? setDefaultTimeoutNoReply: + internal: true parameters: timeout: number? @@ -1485,6 +1566,7 @@ Page: reason: string? emulateMedia: + title: Emulate media parameters: media: type: enum? @@ -1521,11 +1603,13 @@ Page: snapshot: true exposeBinding: + title: Expose binding parameters: name: string needsHandle: boolean? goBack: + title: Go back parameters: timeout: number? waitUntil: LifecycleEvent? @@ -1536,6 +1620,7 @@ Page: snapshot: true goForward: + title: Go forward parameters: timeout: number? waitUntil: LifecycleEvent? @@ -1546,8 +1631,10 @@ Page: snapshot: true requestGC: + title: Request garbage collection registerLocatorHandler: + title: Register locator handler parameters: selector: string noWaitAfter: boolean? @@ -1555,15 +1642,18 @@ Page: uid: number resolveLocatorHandlerNoReply: + internal: true parameters: uid: number remove: boolean? unregisterLocatorHandler: + title: Unregister locator handler parameters: uid: number reload: + title: Reload parameters: timeout: number? waitUntil: LifecycleEvent? @@ -1574,6 +1664,7 @@ Page: snapshot: true expectScreenshot: + title: Expect screenshot parameters: expected: binary? timeout: number @@ -1603,6 +1694,7 @@ Page: snapshot: true screenshot: + title: Screenshot parameters: timeout: number? type: @@ -1620,12 +1712,14 @@ Page: snapshot: true setExtraHTTPHeaders: + title: Set extra HTTP headers parameters: headers: type: array items: NameValue setNetworkInterceptionPatterns: + title: Route parameters: patterns: type: array @@ -1637,6 +1731,7 @@ Page: regexFlags: string? setWebSocketInterceptionPatterns: + title: Route web sockets parameters: patterns: type: array @@ -1648,6 +1743,7 @@ Page: regexFlags: string? setViewportSize: + title: Set viewport size parameters: viewportSize: type: object @@ -1658,6 +1754,7 @@ Page: snapshot: true keyboardDown: + title: Key down parameters: key: string flags: @@ -1665,6 +1762,7 @@ Page: snapshot: true keyboardUp: + title: Key up parameters: key: string flags: @@ -1672,6 +1770,7 @@ Page: snapshot: true keyboardInsertText: + title: Insert text parameters: text: string flags: @@ -1679,6 +1778,7 @@ Page: snapshot: true keyboardType: + title: Type parameters: text: string delay: number? @@ -1687,6 +1787,7 @@ Page: snapshot: true keyboardPress: + title: Press parameters: key: string delay: number? @@ -1695,6 +1796,7 @@ Page: snapshot: true mouseMove: + title: Move mouse parameters: x: number y: number @@ -1704,6 +1806,7 @@ Page: snapshot: true mouseDown: + title: Mouse down parameters: button: type: enum? @@ -1717,6 +1820,7 @@ Page: snapshot: true mouseUp: + title: Mouse up parameters: button: type: enum? @@ -1730,6 +1834,7 @@ Page: snapshot: true mouseClick: + title: Click parameters: x: number y: number @@ -1746,6 +1851,7 @@ Page: snapshot: true mouseWheel: + title: Mouse wheel parameters: deltaX: number deltaY: number @@ -1754,6 +1860,7 @@ Page: snapshot: true touchscreenTap: + title: Tap parameters: x: number y: number @@ -1762,6 +1869,7 @@ Page: snapshot: true accessibilitySnapshot: + internal: true parameters: interestingOnly: boolean? root: ElementHandle? @@ -1771,6 +1879,7 @@ Page: snapshot: true pdf: + title: PDF parameters: scale: number? displayHeaderFooter: boolean? @@ -1796,17 +1905,20 @@ Page: pdf: binary snapshotForAI: + internal: true returns: snapshot: string flags: snapshot: true startJSCoverage: + internal: true parameters: resetOnNavigation: boolean? reportAnonymousScripts: boolean? stopJSCoverage: + internal: true returns: entries: type: array @@ -1833,10 +1945,12 @@ Page: count: number startCSSCoverage: + internal: true parameters: resetOnNavigation: boolean? stopCSSCoverage: + internal: true returns: entries: type: array @@ -1854,8 +1968,10 @@ Page: end: number bringToFront: + title: Bring to front updateSubscription: + internal: true parameters: event: type: enum @@ -1938,6 +2054,7 @@ Frame: commands: evalOnSelector: + title: Evaluate parameters: selector: string strict: boolean? @@ -1950,6 +2067,7 @@ Frame: snapshot: true evalOnSelectorAll: + title: Evaluate parameters: selector: string expression: string @@ -1961,6 +2079,7 @@ Frame: snapshot: true addScriptTag: + title: Add script tag parameters: url: string? content: string? @@ -1971,6 +2090,7 @@ Frame: snapshot: true addStyleTag: + title: Add style tag parameters: url: string? content: string? @@ -1980,6 +2100,7 @@ Frame: snapshot: true ariaSnapshot: + title: Aria snapshot parameters: selector: string forAI: boolean? @@ -1990,6 +2111,7 @@ Frame: snapshot: true blur: + title: Blur parameters: selector: string strict: boolean? @@ -1999,6 +2121,7 @@ Frame: snapshot: true check: + title: Check parameters: selector: string strict: boolean? @@ -2012,6 +2135,7 @@ Frame: pausesBeforeInput: true click: + title: Click parameters: selector: string strict: boolean? @@ -2044,12 +2168,14 @@ Frame: pausesBeforeInput: true content: + title: Get content returns: value: string flags: snapshot: true dragAndDrop: + title: Drag and drop parameters: source: string target: string @@ -2065,6 +2191,7 @@ Frame: pausesBeforeInput: true dblclick: + title: Double click parameters: selector: string strict: boolean? @@ -2095,6 +2222,7 @@ Frame: pausesBeforeInput: true dispatchEvent: + title: Dispatch event parameters: selector: string strict: boolean? @@ -2106,6 +2234,7 @@ Frame: snapshot: true evaluateExpression: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2116,6 +2245,7 @@ Frame: snapshot: true evaluateExpressionHandle: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2126,6 +2256,7 @@ Frame: snapshot: true fill: + title: Fill parameters: selector: string strict: boolean? @@ -2138,6 +2269,7 @@ Frame: pausesBeforeInput: true focus: + title: Focus parameters: selector: string strict: boolean? @@ -2147,14 +2279,17 @@ Frame: snapshot: true frameElement: + internal: true returns: element: ElementHandle highlight: + internal: true parameters: selector: string getAttribute: + internal: true parameters: selector: string strict: boolean? @@ -2166,6 +2301,7 @@ Frame: snapshot: true goto: + title: Navigate parameters: url: string timeout: number? @@ -2178,6 +2314,7 @@ Frame: snapshot: true hover: + title: Hover parameters: selector: string strict: boolean? @@ -2201,6 +2338,7 @@ Frame: pausesBeforeInput: true innerHTML: + title: Get HTML parameters: selector: string strict: boolean? @@ -2211,6 +2349,7 @@ Frame: snapshot: true innerText: + title: Get inner text parameters: selector: string strict: boolean? @@ -2221,6 +2360,7 @@ Frame: snapshot: true inputValue: + title: Get input value parameters: selector: string strict: boolean? @@ -2231,6 +2371,7 @@ Frame: snapshot: true isChecked: + title: Is checked parameters: selector: string strict: boolean? @@ -2241,6 +2382,7 @@ Frame: snapshot: true isDisabled: + title: Is disabled parameters: selector: string strict: boolean? @@ -2251,6 +2393,7 @@ Frame: snapshot: true isEnabled: + title: Is enabled parameters: selector: string strict: boolean? @@ -2261,6 +2404,7 @@ Frame: snapshot: true isHidden: + title: Is hidden parameters: selector: string strict: boolean? @@ -2270,6 +2414,7 @@ Frame: snapshot: true isVisible: + title: Is visible parameters: selector: string strict: boolean? @@ -2279,6 +2424,7 @@ Frame: snapshot: true isEditable: + title: Is editable parameters: selector: string strict: boolean? @@ -2289,6 +2435,7 @@ Frame: snapshot: true press: + title: Press parameters: selector: string strict: boolean? @@ -2302,6 +2449,7 @@ Frame: pausesBeforeInput: true querySelector: + title: Query selector parameters: selector: string strict: boolean? @@ -2311,6 +2459,7 @@ Frame: snapshot: true querySelectorAll: + title: Query selector all parameters: selector: string returns: @@ -2321,6 +2470,7 @@ Frame: snapshot: true queryCount: + title: Query count parameters: selector: string returns: @@ -2329,6 +2479,7 @@ Frame: snapshot: true selectOption: + title: Select option parameters: selector: string strict: boolean? @@ -2356,6 +2507,7 @@ Frame: pausesBeforeInput: true setContent: + title: Set content parameters: html: string timeout: number? @@ -2364,6 +2516,7 @@ Frame: snapshot: true setInputFiles: + title: Set input files parameters: selector: string strict: boolean? @@ -2391,6 +2544,7 @@ Frame: pausesBeforeInput: true tap: + title: Tap parameters: selector: string strict: boolean? @@ -2414,6 +2568,7 @@ Frame: pausesBeforeInput: true textContent: + title: Get text content parameters: selector: string strict: boolean? @@ -2424,10 +2579,12 @@ Frame: snapshot: true title: + internal: true returns: value: string type: + title: Type parameters: selector: string strict: boolean? @@ -2440,6 +2597,7 @@ Frame: pausesBeforeInput: true uncheck: + title: Uncheck parameters: selector: string strict: boolean? @@ -2453,12 +2611,14 @@ Frame: pausesBeforeInput: true waitForTimeout: + title: Wait for timeout parameters: timeout: number flags: snapshot: true waitForFunction: + title: Wait for function parameters: expression: string isFunction: boolean? @@ -2472,6 +2632,7 @@ Frame: snapshot: true waitForSelector: + title: Wait for selector parameters: selector: string strict: boolean? @@ -2490,6 +2651,7 @@ Frame: snapshot: true expect: + title: Expect parameters: selector: string expression: string @@ -2540,6 +2702,7 @@ Worker: commands: evaluateExpression: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2548,6 +2711,7 @@ Worker: value: SerializedValue evaluateExpressionHandle: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2571,6 +2735,7 @@ JSHandle: dispose: evaluateExpression: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2581,6 +2746,7 @@ JSHandle: snapshot: true evaluateExpressionHandle: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -2591,6 +2757,7 @@ JSHandle: snapshot: true getPropertyList: + internal: true returns: properties: type: array @@ -2601,12 +2768,14 @@ JSHandle: value: JSHandle getProperty: + internal: true parameters: name: string returns: handle: JSHandle jsonValue: + internal: true returns: value: SerializedValue @@ -2626,6 +2795,7 @@ ElementHandle: commands: evalOnSelector: + title: Evaluate parameters: selector: string strict: boolean? @@ -2638,6 +2808,7 @@ ElementHandle: snapshot: true evalOnSelectorAll: + title: Evaluate parameters: selector: string expression: string @@ -2649,12 +2820,14 @@ ElementHandle: snapshot: true boundingBox: + title: Get bounding box returns: value: Rect? flags: snapshot: true check: + title: Check parameters: force: boolean? position: Point? @@ -2666,6 +2839,7 @@ ElementHandle: pausesBeforeInput: true click: + title: Click parameters: force: boolean? noWaitAfter: boolean? @@ -2696,12 +2870,14 @@ ElementHandle: pausesBeforeInput: true contentFrame: + internal: true returns: frame: Frame? flags: snapshot: true dblclick: + title: Double click parameters: force: boolean? modifiers: @@ -2730,6 +2906,7 @@ ElementHandle: pausesBeforeInput: true dispatchEvent: + title: Dispatch event parameters: type: string eventInit: SerializedArgument @@ -2738,6 +2915,7 @@ ElementHandle: snapshot: true fill: + title: Fill parameters: value: string force: boolean? @@ -2748,21 +2926,25 @@ ElementHandle: pausesBeforeInput: true focus: + title: Focus flags: slowMo: true snapshot: true generateLocatorString: + internal: true returns: value: string? getAttribute: + internal: true parameters: name: string returns: value: string? hover: + title: Hover parameters: force: boolean? modifiers: @@ -2784,64 +2966,75 @@ ElementHandle: pausesBeforeInput: true innerHTML: + title: Get HTML returns: value: string flags: snapshot: true innerText: + title: Get inner text returns: value: string flags: snapshot: true inputValue: + title: Get input value returns: value: string flags: snapshot: true isChecked: + title: Is checked returns: value: boolean flags: snapshot: true isDisabled: + title: Is disabled returns: value: boolean flags: snapshot: true isEditable: + title: Is editable returns: value: boolean flags: snapshot: true isEnabled: + title: Is enabled returns: value: boolean flags: snapshot: true isHidden: + title: Is hidden returns: value: boolean flags: snapshot: true isVisible: + title: Is visible returns: value: boolean flags: snapshot: true ownerFrame: + title: Get owner frame returns: frame: Frame? press: + title: Press parameters: key: string delay: number? @@ -2853,6 +3046,7 @@ ElementHandle: pausesBeforeInput: true querySelector: + title: Query selector parameters: selector: string strict: boolean? @@ -2862,6 +3056,7 @@ ElementHandle: snapshot: true querySelectorAll: + title: Query selector all parameters: selector: string returns: @@ -2872,6 +3067,7 @@ ElementHandle: snapshot: true screenshot: + title: Screenshot parameters: timeout: number? type: @@ -2887,6 +3083,7 @@ ElementHandle: snapshot: true scrollIntoViewIfNeeded: + title: Scroll into view parameters: timeout: number? flags: @@ -2894,6 +3091,7 @@ ElementHandle: snapshot: true selectOption: + title: Select option parameters: elements: type: array? @@ -2919,6 +3117,7 @@ ElementHandle: pausesBeforeInput: true selectText: + title: Select text parameters: force: boolean? timeout: number? @@ -2927,6 +3126,7 @@ ElementHandle: snapshot: true setInputFiles: + title: Set input files parameters: # Only one of payloads, localPaths and streams should be present. payloads: @@ -2952,6 +3152,7 @@ ElementHandle: pausesBeforeInput: true tap: + title: Tap parameters: force: boolean? modifiers: @@ -2973,12 +3174,14 @@ ElementHandle: pausesBeforeInput: true textContent: + title: Get text content returns: value: string? flags: snapshot: true type: + title: Type parameters: text: string delay: number? @@ -2989,6 +3192,7 @@ ElementHandle: pausesBeforeInput: true uncheck: + title: Uncheck parameters: force: boolean? position: Point? @@ -3000,6 +3204,7 @@ ElementHandle: pausesBeforeInput: true waitForElementState: + title: Wait for state parameters: state: type: enum @@ -3015,6 +3220,7 @@ ElementHandle: snapshot: true waitForSelector: + title: Wait for selector parameters: selector: string strict: boolean? @@ -3051,10 +3257,12 @@ Request: commands: response: + internal: true returns: response: Response? rawRequestHeaders: + internal: true returns: headers: type: array @@ -3070,6 +3278,7 @@ Route: commands: redirectNavigationRequest: + internal: true parameters: url: string @@ -3078,6 +3287,7 @@ Route: errorCode: string? continue: + internal: true parameters: url: string? method: string? @@ -3088,6 +3298,7 @@ Route: isFallback: boolean fulfill: + internal: true parameters: # default is 200 status: number? @@ -3108,26 +3319,32 @@ WebSocketRoute: commands: connect: + internal: true ensureOpened: + internal: true sendToPage: + internal: true parameters: message: string isBase64: boolean sendToServer: + internal: true parameters: message: string isBase64: boolean closePage: + internal: true parameters: code: number? reason: string? wasClean: boolean closeServer: + internal: true parameters: code: number? reason: string? @@ -3188,24 +3405,29 @@ Response: commands: body: + internal: true returns: binary: binary securityDetails: + internal: true returns: value: SecurityDetails? serverAddr: + internal: true returns: value: RemoteAddr? rawResponseHeaders: + internal: true returns: headers: type: array items: NameValue sizes: + internal: true returns: sizes: RequestSizes @@ -3277,10 +3499,12 @@ BindingCall: commands: reject: + internal: true parameters: error: SerializedError resolve: + internal: true parameters: result: SerializedArgument @@ -3298,11 +3522,12 @@ Dialog: commands: accept: + title: Accept dialog parameters: promptText: string? dismiss: - + title: Dismiss dialog Tracing: type: interface @@ -3310,6 +3535,7 @@ Tracing: commands: tracingStart: + internal: true parameters: name: string? snapshots: boolean? @@ -3317,6 +3543,7 @@ Tracing: live: boolean? tracingStartChunk: + internal: true parameters: name: string? title: string? @@ -3324,6 +3551,7 @@ Tracing: traceName: string tracingGroup: + title: Group parameters: name: string location: @@ -3334,8 +3562,10 @@ Tracing: column: number? tracingGroupEnd: + title: Group end tracingStopChunk: + internal: true parameters: mode: type: enum @@ -3353,6 +3583,7 @@ Tracing: items: NameValue tracingStop: + internal: true Artifact: @@ -3364,30 +3595,37 @@ Artifact: commands: pathAfterFinished: + internal: true returns: value: string # Blocks path/failure/delete/context.close until saved to the local |path|. saveAs: + internal: true parameters: path: string # Blocks path/failure/delete/context.close until the stream is closed. saveAsStream: + internal: true returns: stream: Stream failure: + internal: true returns: error: string? stream: + internal: true returns: stream: Stream cancel: + internal: true delete: + internal: true Stream: @@ -3396,12 +3634,14 @@ Stream: commands: read: + internal: true parameters: size: number? returns: binary: binary close: + internal: true WritableStream: @@ -3410,10 +3650,12 @@ WritableStream: commands: write: + internal: true parameters: binary: binary close: + internal: true CDPSession: @@ -3422,6 +3664,7 @@ CDPSession: commands: send: + internal: true parameters: method: string params: json? @@ -3429,6 +3672,7 @@ CDPSession: result: json detach: + internal: true events: @@ -3444,6 +3688,7 @@ Electron: commands: launch: + title: Launch electron parameters: executablePath: string? args: @@ -3515,12 +3760,14 @@ ElectronApplication: commands: browserWindow: + internal: true parameters: page: Page returns: handle: JSHandle evaluateExpression: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -3529,6 +3776,7 @@ ElectronApplication: value: SerializedValue evaluateExpressionHandle: + title: Evaluate parameters: expression: string isFunction: boolean? @@ -3537,6 +3785,7 @@ ElectronApplication: handle: JSHandle updateSubscription: + internal: true parameters: event: type: enum @@ -3556,6 +3805,7 @@ Android: commands: devices: + internal: true parameters: host: string? port: number? @@ -3566,6 +3816,7 @@ Android: items: AndroidDevice setDefaultTimeoutNoReply: + internal: true parameters: timeout: number @@ -3574,10 +3825,12 @@ AndroidSocket: commands: write: + internal: true parameters: data: binary close: + internal: true events: data: @@ -3596,6 +3849,7 @@ AndroidDevice: commands: wait: + hidden: Wait parameters: selector: AndroidSelector state: @@ -3605,18 +3859,21 @@ AndroidDevice: timeout: number? fill: + title: Fill parameters: selector: AndroidSelector text: string timeout: number? tap: + title: Tap parameters: selector: AndroidSelector duration: number? timeout: number? drag: + title: Drag parameters: selector: AndroidSelector dest: Point @@ -3624,6 +3881,7 @@ AndroidDevice: timeout: number? fling: + title: Fling parameters: selector: AndroidSelector direction: @@ -3637,11 +3895,13 @@ AndroidDevice: timeout: number? longTap: + title: Long tap parameters: selector: AndroidSelector timeout: number? pinchClose: + title: Pinch close parameters: selector: AndroidSelector percent: number @@ -3649,6 +3909,7 @@ AndroidDevice: timeout: number? pinchOpen: + title: Pinch open parameters: selector: AndroidSelector percent: number @@ -3656,6 +3917,7 @@ AndroidDevice: timeout: number? scroll: + title: Scroll parameters: selector: AndroidSelector direction: @@ -3670,6 +3932,7 @@ AndroidDevice: timeout: number? swipe: + title: Swipe parameters: selector: AndroidSelector direction: @@ -3684,28 +3947,34 @@ AndroidDevice: timeout: number? info: + internal: true parameters: selector: AndroidSelector returns: info: AndroidElementInfo screenshot: + title: Screenshot returns: binary: binary inputType: + title: Type parameters: text: string inputPress: + title: Press parameters: key: string inputTap: + title: Tap parameters: point: Point inputSwipe: + title: Swipe parameters: segments: type: array @@ -3713,12 +3982,14 @@ AndroidDevice: steps: number inputDrag: + title: Drag parameters: from: Point to: Point steps: number launchBrowser: + title: Launch browser parameters: $mixin: ContextOptions pkg: string? @@ -3737,18 +4008,21 @@ AndroidDevice: context: BrowserContext open: + title: Open app parameters: command: string returns: socket: AndroidSocket shell: + internal: true parameters: command: string returns: result: binary installApk: + title: Install apk parameters: file: binary args: @@ -3756,22 +4030,26 @@ AndroidDevice: items: string push: + title: Push parameters: file: binary path: string mode: number? setDefaultTimeoutNoReply: + internal: true parameters: timeout: number connectToWebView: + internal: true parameters: socketName: string returns: context: BrowserContext close: + internal: true events: close: @@ -3850,10 +4128,12 @@ JsonPipe: commands: send: + internal: true parameters: message: json close: + internal: true events: diff --git a/tests/playwright-test/playwright.trace.spec.ts b/tests/playwright-test/playwright.trace.spec.ts index 2315edc8c8..697938b6a2 100644 --- a/tests/playwright-test/playwright.trace.spec.ts +++ b/tests/playwright-test/playwright.trace.spec.ts @@ -103,7 +103,6 @@ test('should record api trace', async ({ runInlineTest, server }, testInfo) => { ' fixture: page', ' fixture: context', ' fixture: request', - ' apiRequestContext.dispose', ]); const trace2 = await parseTrace(testInfo.outputPath('test-results', 'a-api-pass', 'trace.zip')); expect(trace2.actionTree).toEqual([ @@ -128,7 +127,6 @@ test('should record api trace', async ({ runInlineTest, server }, testInfo) => { ' fixture: page', ' fixture: context', ' fixture: request', - ' apiRequestContext.dispose', 'Worker Cleanup', ' fixture: browser', ]); @@ -332,7 +330,6 @@ test('should not override trace file in afterAll', async ({ runInlineTest, serve ' apiRequest.newContext', ' apiRequestContext.get', ' fixture: request', - ' apiRequestContext.dispose', 'Worker Cleanup', ' fixture: browser', ]); @@ -1264,6 +1261,7 @@ test('should not nest top level expect into unfinished api calls ', { ' browserContext.newPage', 'page.route', 'page.goto', + 'route.fetch', 'expect.toBeVisible', 'page.unrouteAll', 'After Hooks', diff --git a/tests/playwright-test/test-step.spec.ts b/tests/playwright-test/test-step.spec.ts index a5bad3a293..99ebf63cea 100644 --- a/tests/playwright-test/test-step.spec.ts +++ b/tests/playwright-test/test-step.spec.ts @@ -1224,7 +1224,6 @@ pw:api |apiRequestContext.get(${server.EMPTY_PAGE}) @ a.test.ts:11 pw:api |↪ error: hook |After Hooks fixture | fixture: request -pw:api | apiRequestContext.dispose fixture | fixture: page fixture | fixture: context `); @@ -1517,6 +1516,7 @@ pw:api | browserContext.newPage test.step |custom step @ a.test.ts:4 pw:api | page.route @ a.test.ts:5 pw:api | page.goto(${server.EMPTY_PAGE}) @ a.test.ts:12 +pw:api | route.fetch(${server.EMPTY_PAGE}) @ a.test.ts:6 expect | expect.toBe @ a.test.ts:8 hook |After Hooks fixture | fixture: page diff --git a/utils/generate_channels.js b/utils/generate_channels.js index 827250ad8c..144d4bce26 100755 --- a/utils/generate_channels.js +++ b/utils/generate_channels.js @@ -18,7 +18,6 @@ // @ts-check const fs = require('fs'); -const os = require('os'); const path = require('path'); const yaml = require('yaml'); @@ -178,9 +177,7 @@ const debug_ts = [ // This file is generated by ${path.basename(__filename).split(path.sep).join(path.posix.sep)}, do not edit manually. `]; -const slowMoActions = []; -const tracingSnapshots = []; -const pausesBeforeInputActions = []; +const methodMetainfo = []; const yml = fs.readFileSync(path.join(__dirname, '..', 'packages', 'protocol', 'src', 'protocol.yml'), 'utf-8'); const protocol = yaml.parse(yml); @@ -279,21 +276,14 @@ for (const [name, item] of Object.entries(protocol)) { for (let [methodName, method] of Object.entries(item.commands || {})) { if (method === null) method = {}; - if (method.flags?.slowMo) { - slowMoActions.push(name + '.' + methodName); - for (const derived of derivedClasses.get(name) || []) - slowMoActions.push(derived + '.' + methodName); - } - if (method.flags?.snapshot) { - tracingSnapshots.push(name + '.' + methodName); - for (const derived of derivedClasses.get(name) || []) - tracingSnapshots.push(derived + '.' + methodName); - } - if (method.flags?.pausesBeforeInput) { - pausesBeforeInputActions.push(name + '.' + methodName); - for (const derived of derivedClasses.get(name) || []) - pausesBeforeInputActions.push(derived + '.' + methodName); - } + + const internalProp = method.internal ? ` internal: ${method.internal},` : ''; + const titleProp = method.title ? ` title: '${method.title}',` : ''; + const slowMoProp = method.flags?.slowMo ? ` slowMo: ${method.flags.slowMo},` : ''; + const snapshotProp = method.flags?.snapshot ? ` snapshot: ${method.flags.snapshot},` : ''; + const pauseProp = method.flags?.pausesBeforeInput ? ` pausesBeforeInput: ${method.flags.pausesBeforeInput},` : ''; + methodMetainfo.push(`['${name + '.' + methodName}', {${internalProp}${titleProp}${slowMoProp}${snapshotProp}${pauseProp} }]`); + const parameters = objectType(method.parameters || {}, ''); const paramsName = `${channelName}${titleCase(methodName)}Params`; const optionsName = `${channelName}${titleCase(methodName)}Options`; @@ -335,16 +325,8 @@ for (const [name, item] of Object.entries(protocol)) { } } -debug_ts.push(`export const slowMoActions = new Set([ - '${slowMoActions.join(`',\n '`)}' -]);`); -debug_ts.push(''); -debug_ts.push(`export const commandsWithTracingSnapshots = new Set([ - '${tracingSnapshots.join(`',\n '`)}' -]);`); -debug_ts.push(''); -debug_ts.push(`export const pausesBeforeInputActions = new Set([ - '${pausesBeforeInputActions.join(`',\n '`)}' +debug_ts.push(`export const methodMetainfo = new Map([ + ${methodMetainfo.join(`,\n `)} ]);`); let hasChanges = false;