From d4d483c56e109db3f959fc7ecf2919131b864ee3 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Sat, 21 Mar 2026 09:17:35 -0700 Subject: [PATCH] chore: refactor protocol metainfo for debugger pause and snapshot phases --- .../src/client/channelOwner.ts | 2 +- .../playwright-core/src/server/debugger.ts | 30 +-- .../server/dispatchers/debuggerDispatcher.ts | 6 +- .../src/server/dispatchers/dispatcher.ts | 2 +- .../src/server/trace/recorder/tracing.ts | 28 ++- .../src/utils/isomorphic/protocolFormatter.ts | 7 +- .../src/utils/isomorphic/protocolMetainfo.ts | 194 +++++++-------- packages/protocol/src/protocol.yml | 230 +++++++++++------- packages/trace-viewer/src/ui/actionList.tsx | 3 +- utils/generate_channels.js | 23 +- 10 files changed, 287 insertions(+), 238 deletions(-) diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index 3957d0f8bfe7d..80e0247474103 100644 --- a/packages/playwright-core/src/client/channelOwner.ts +++ b/packages/playwright-core/src/client/channelOwner.ts @@ -16,7 +16,7 @@ import { EventEmitter } from './eventEmitter'; import { ValidationError, maybeFindValidator } from '../protocol/validator'; -import { getMetainfo } from '../utils/isomorphic/protocolFormatter'; +import { getMetainfo } from '../utils/isomorphic/protocolMetainfo'; import { captureLibraryStackTrace } from './clientStackTrace'; import { stringifyStackFrames } from '../utils/isomorphic/stackTrace'; diff --git a/packages/playwright-core/src/server/debugger.ts b/packages/playwright-core/src/server/debugger.ts index 2e14c64fa3c05..54d45fd3aa115 100644 --- a/packages/playwright-core/src/server/debugger.ts +++ b/packages/playwright-core/src/server/debugger.ts @@ -17,7 +17,7 @@ import { SdkObject } from './instrumentation'; import { monotonicTime } from '../utils'; import { BrowserContext } from './browserContext'; -import { getMetainfo } from '../utils/isomorphic/protocolFormatter'; +import { getMetainfo } from '../utils/isomorphic/protocolMetainfo'; import type { CallMetadata, InstrumentationListener } from './instrumentation'; @@ -29,7 +29,7 @@ export class Debugger extends SdkObject implements InstrumentationListener { private _pauseAt: PauseAt = {}; private _pausedCallsMetadata = new Map void, sdkObject: SdkObject }>(); private _enabled = false; - private _pauseBeforeInputActions = false; // instead of inside input actions + private _pauseBeforeWaitingActions = false; // instead of inside input actions private _context: BrowserContext; static Events = { @@ -52,24 +52,27 @@ export class Debugger extends SdkObject implements InstrumentationListener { } async onBeforeCall(sdkObject: SdkObject, metadata: CallMetadata): Promise { - if (this._muted) + if (this._muted || metadata.internal) return; + const metainfo = getMetainfo(metadata); const pauseOnPauseCall = this._enabled && metadata.type === 'BrowserContext' && metadata.method === 'pause'; - const pauseOnNextStep = !!this._pauseAt.next && shouldPauseBeforeStep(metadata, this._pauseBeforeInputActions); + const pauseBeforeAction = !!this._pauseAt.next && !!metainfo?.pause && (this._pauseBeforeWaitingActions || !metainfo?.isAutoWaiting); const pauseOnLocation = !!this._pauseAt.location && matchesLocation(metadata, this._pauseAt.location); - if (pauseOnPauseCall || pauseOnNextStep || pauseOnLocation) + if (pauseOnPauseCall || pauseBeforeAction || pauseOnLocation) await this._pause(sdkObject, metadata); } async onBeforeInputAction(sdkObject: SdkObject, metadata: CallMetadata): Promise { - if (this._muted) + if (this._muted || metadata.internal) return; - if (!!this._pauseAt.next && !this._pauseBeforeInputActions) + const metainfo = getMetainfo(metadata); + const pauseBeforeInput = !!this._pauseAt.next && !!metainfo?.pause && !!metainfo?.isAutoWaiting && !this._pauseBeforeWaitingActions; + if (pauseBeforeInput) await this._pause(sdkObject, metadata); } private async _pause(sdkObject: SdkObject, metadata: CallMetadata) { - if (this._muted) + if (this._muted || metadata.internal) return; this._pauseAt = {}; metadata.pauseStartTime = monotonicTime(); @@ -93,8 +96,8 @@ export class Debugger extends SdkObject implements InstrumentationListener { this.emit(Debugger.Events.PausedStateChanged); } - setPauseBeforeInputActions() { - this._pauseBeforeInputActions = true; + setPauseBeforeWaitingActions() { + this._pauseBeforeWaitingActions = true; } setPauseAt(at: { next?: boolean, location?: { file: string, line?: number, column?: number } } = {}) { @@ -121,10 +124,3 @@ function matchesLocation(metadata: CallMetadata, location: { file: string, line? (location.line === undefined || metadata.location.line === location.line) && (location.column === undefined || metadata.location.column === location.column); } - -function shouldPauseBeforeStep(metadata: CallMetadata, includeInputActions: boolean): boolean { - if (metadata.internal) - return false; - const metainfo = getMetainfo(metadata); - return !!metainfo?.pausesBeforeAction || (includeInputActions && !!metainfo?.pausesBeforeInput); -} diff --git a/packages/playwright-core/src/server/dispatchers/debuggerDispatcher.ts b/packages/playwright-core/src/server/dispatchers/debuggerDispatcher.ts index 43f69eb9154c4..b1c94999015e5 100644 --- a/packages/playwright-core/src/server/dispatchers/debuggerDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/debuggerDispatcher.ts @@ -53,7 +53,7 @@ export class DebuggerDispatcher extends Dispatcher { if (this._object.isPaused()) throw new Error('Debugger is already paused'); - this._object.setPauseBeforeInputActions(); + this._object.setPauseBeforeWaitingActions(); this._object.setPauseAt({ next: true }); } @@ -66,7 +66,7 @@ export class DebuggerDispatcher extends Dispatcher { if (!this._object.isPaused()) throw new Error('Debugger is not paused'); - this._object.setPauseBeforeInputActions(); + this._object.setPauseBeforeWaitingActions(); this._object.setPauseAt({ next: true }); this._object.resume(); } @@ -74,7 +74,7 @@ export class DebuggerDispatcher extends Dispatcher { if (!this._object.isPaused()) throw new Error('Debugger is not paused'); - this._object.setPauseBeforeInputActions(); + this._object.setPauseBeforeWaitingActions(); this._object.setPauseAt({ location: params.location }); this._object.resume(); } diff --git a/packages/playwright-core/src/server/dispatchers/dispatcher.ts b/packages/playwright-core/src/server/dispatchers/dispatcher.ts index 41b0479a8d6ab..4ba12386dd7ff 100644 --- a/packages/playwright-core/src/server/dispatchers/dispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/dispatcher.ts @@ -24,7 +24,7 @@ import { TargetClosedError, isTargetClosedError, serializeError } from '../error import { createRootSdkObject, SdkObject } from '../instrumentation'; import { isProtocolError } from '../protocolError'; import { compressCallLog } from '../callLog'; -import { getMetainfo } from '../../utils/isomorphic/protocolFormatter'; +import { getMetainfo } from '../../utils/isomorphic/protocolMetainfo'; import { Progress, ProgressController } from '../progress'; import type { CallMetadata } from '../instrumentation'; diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index 54caaf6ad96ed..aef9ebdf3e6f9 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 { getMetainfo } from '../../../utils/isomorphic/protocolFormatter'; +import { getMetainfo } from '../../../utils/isomorphic/protocolMetainfo'; import { assert } from '../../../utils/isomorphic/assert'; import { monotonicTime } from '../../../utils/isomorphic/time'; import { eventsHelper } from '../../utils/eventsHelper'; @@ -435,8 +435,19 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps await this._snapshotter?.captureSnapshot(sdkObject.attribution.page, metadata.id, snapshotName).catch(() => {}); } - private _shouldCaptureSnapshot(sdkObject: SdkObject, metadata: CallMetadata) { - return !!this._snapshotter?.started() && shouldCaptureSnapshot(metadata) && !!sdkObject.attribution.page; + private _shouldCaptureSnapshot(sdkObject: SdkObject, metadata: CallMetadata, phase: 'before' | 'after' | 'input') { + if (!sdkObject.attribution.page || !this._snapshotter?.started()) + return; + + const metainfo = getMetainfo(metadata); + if (!metainfo?.snapshot) + return false; + + switch (phase) { + case 'before': return !metainfo.input || !!metainfo.isAutoWaiting; + case 'input': return !!metainfo.input; + case 'after': return true; + } } onBeforeCall(sdkObject: SdkObject, metadata: CallMetadata, parentId?: string) { @@ -445,7 +456,7 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps if (!event) return Promise.resolve(); sdkObject.attribution.page?.screencast.temporarilyDisableThrottling(); - if (this._shouldCaptureSnapshot(sdkObject, metadata)) + if (this._shouldCaptureSnapshot(sdkObject, metadata, 'before')) event.beforeSnapshot = `before@${metadata.id}`; this._state?.callIds.add(metadata.id); this._appendTraceEvent(event); @@ -460,7 +471,7 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps if (!event) return Promise.resolve(); sdkObject.attribution.page?.screencast.temporarilyDisableThrottling(); - if (this._shouldCaptureSnapshot(sdkObject, metadata)) + if (this._shouldCaptureSnapshot(sdkObject, metadata, 'input')) event.inputSnapshot = `input@${metadata.id}`; this._appendTraceEvent(event); return this._captureSnapshot(event.inputSnapshot, sdkObject, metadata); @@ -487,7 +498,7 @@ export class Tracing extends SdkObject implements InstrumentationListener, Snaps if (!event) return Promise.resolve(); sdkObject.attribution.page?.screencast.temporarilyDisableThrottling(); - if (this._shouldCaptureSnapshot(sdkObject, metadata)) + if (this._shouldCaptureSnapshot(sdkObject, metadata, 'after')) event.afterSnapshot = `after@${metadata.id}`; this._appendTraceEvent(event); return this._captureSnapshot(event.afterSnapshot, sdkObject, metadata); @@ -659,11 +670,6 @@ function visitTraceEvent(object: any, sha1s: Set): any { return object; } -function shouldCaptureSnapshot(metadata: CallMetadata): boolean { - const metainfo = getMetainfo(metadata); - return !!metainfo?.snapshot; -} - function createBeforeActionTraceEvent(metadata: CallMetadata, parentId?: string): trace.BeforeActionTraceEvent | null { if (metadata.internal || metadata.method.startsWith('tracing')) return null; diff --git a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts index eb23d0393e9a2..ab2731b24c83d 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { methodMetainfo } from './protocolMetainfo'; -import type { MethodMetainfo } from './protocolMetainfo'; +import { getMetainfo } from './protocolMetainfo'; export function formatProtocolParam(params: Record | undefined, alternatives: string): string | undefined { return _formatProtocolParam(params, alternatives)?.replaceAll('\n', '\\n'); @@ -70,10 +69,6 @@ export function renderTitleForCall(metadata: { title?: string, type: string, met }); } -export function getMetainfo(metadata: { type: string, method: string }): MethodMetainfo | undefined { - return methodMetainfo.get(metadata.type + '.' + metadata.method); -} - export type ActionGroup = 'configuration' | 'route' | 'getter'; export function getActionGroup(metadata: { type: string, method: string }) { diff --git a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts index 0abc085356e83..0622a444175be 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts @@ -16,7 +16,7 @@ // This file is generated by generate_channels.js, do not edit manually. -export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pausesBeforeInput?: boolean, pausesBeforeAction?: boolean, group?: string }; +export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pause?: boolean, isAutoWaiting?: boolean, input?: boolean, group?: string }; export const methodMetainfo = new Map([ ['APIRequestContext.fetch', { title: '{method} "{url}"', }], @@ -55,7 +55,7 @@ export const methodMetainfo = new Map([ ['BrowserType.connectOverCDPTransport', { title: 'Connect over CDP transport', }], ['Browser.startServer', { title: 'Start server', }], ['Browser.stopServer', { title: 'Stop server', }], - ['Browser.close', { title: 'Close browser', pausesBeforeAction: true, }], + ['Browser.close', { title: 'Close browser', pause: true, }], ['Browser.killForTests', { internal: true, }], ['Browser.defaultUserAgentForTest', { internal: true, }], ['Browser.newContext', { title: 'Create context', }], @@ -76,7 +76,7 @@ export const methodMetainfo = new Map([ ['BrowserContext.addInitScript', { title: 'Add init script', group: 'configuration', }], ['BrowserContext.clearCookies', { title: 'Clear cookies', group: 'configuration', }], ['BrowserContext.clearPermissions', { title: 'Clear permissions', group: 'configuration', }], - ['BrowserContext.close', { title: 'Close context', pausesBeforeAction: true, }], + ['BrowserContext.close', { title: 'Close context', pause: true, }], ['BrowserContext.cookies', { title: 'Get cookies', group: 'getter', }], ['BrowserContext.exposeBinding', { title: 'Expose binding', group: 'configuration', }], ['BrowserContext.grantPermissions', { title: 'Grant permissions', group: 'configuration', }], @@ -108,35 +108,35 @@ export const methodMetainfo = new Map([ ['BrowserContext.clockSetFixedTime', { title: 'Set fixed time "{timeNumber|timeString}"', }], ['BrowserContext.clockSetSystemTime', { title: 'Set system time "{timeNumber|timeString}"', }], ['Page.addInitScript', { title: 'Add init script', group: 'configuration', }], - ['Page.close', { title: 'Close page', pausesBeforeAction: true, }], + ['Page.close', { title: 'Close page', pause: true, }], ['Page.clearConsoleMessages', { title: 'Clear console messages', }], ['Page.consoleMessages', { title: 'Get console messages', group: 'getter', }], - ['Page.emulateMedia', { title: 'Emulate media', snapshot: true, pausesBeforeAction: true, }], + ['Page.emulateMedia', { title: 'Emulate media', snapshot: true, pause: true, }], ['Page.exposeBinding', { title: 'Expose binding', group: 'configuration', }], - ['Page.goBack', { title: 'Go back', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.goForward', { title: 'Go forward', slowMo: true, snapshot: true, pausesBeforeAction: true, }], + ['Page.goBack', { title: 'Go back', slowMo: true, snapshot: true, pause: true, }], + ['Page.goForward', { title: 'Go forward', slowMo: true, snapshot: true, pause: true, }], ['Page.requestGC', { title: 'Request garbage collection', group: 'configuration', }], ['Page.registerLocatorHandler', { title: 'Register locator handler', }], ['Page.resolveLocatorHandlerNoReply', { internal: true, }], ['Page.unregisterLocatorHandler', { title: 'Unregister locator handler', }], - ['Page.reload', { title: 'Reload', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.expectScreenshot', { title: 'Expect screenshot', snapshot: true, pausesBeforeAction: true, }], - ['Page.screenshot', { title: 'Screenshot', snapshot: true, pausesBeforeAction: true, }], + ['Page.reload', { title: 'Reload', slowMo: true, snapshot: true, pause: true, }], + ['Page.expectScreenshot', { title: 'Expect screenshot', snapshot: true, pause: true, }], + ['Page.screenshot', { title: 'Screenshot', snapshot: true, pause: true, }], ['Page.setExtraHTTPHeaders', { title: 'Set extra HTTP headers', group: 'configuration', }], ['Page.setNetworkInterceptionPatterns', { title: 'Route requests', group: 'route', }], ['Page.setWebSocketInterceptionPatterns', { title: 'Route WebSockets', group: 'route', }], - ['Page.setViewportSize', { title: 'Set viewport size', snapshot: true, pausesBeforeAction: true, }], - ['Page.keyboardDown', { title: 'Key down "{key}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.keyboardUp', { title: 'Key up "{key}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.keyboardInsertText', { title: 'Insert "{text}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.keyboardType', { title: 'Type "{text}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.keyboardPress', { title: 'Press "{key}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.mouseMove', { title: 'Mouse move', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.mouseDown', { title: 'Mouse down', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.mouseUp', { title: 'Mouse up', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.mouseClick', { title: 'Click', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.mouseWheel', { title: 'Mouse wheel', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Page.touchscreenTap', { title: 'Tap', slowMo: true, snapshot: true, pausesBeforeAction: true, }], + ['Page.setViewportSize', { title: 'Set viewport size', snapshot: true, pause: true, }], + ['Page.keyboardDown', { title: 'Key down "{key}"', slowMo: true, snapshot: true, pause: true, }], + ['Page.keyboardUp', { title: 'Key up "{key}"', slowMo: true, snapshot: true, pause: true, }], + ['Page.keyboardInsertText', { title: 'Insert "{text}"', slowMo: true, snapshot: true, pause: true, }], + ['Page.keyboardType', { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, }], + ['Page.keyboardPress', { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, }], + ['Page.mouseMove', { title: 'Mouse move', slowMo: true, snapshot: true, pause: true, }], + ['Page.mouseDown', { title: 'Mouse down', slowMo: true, snapshot: true, pause: true, }], + ['Page.mouseUp', { title: 'Mouse up', slowMo: true, snapshot: true, pause: true, }], + ['Page.mouseClick', { title: 'Click', slowMo: true, snapshot: true, pause: true, }], + ['Page.mouseWheel', { title: 'Mouse wheel', slowMo: true, snapshot: true, pause: true, }], + ['Page.touchscreenTap', { title: 'Tap', slowMo: true, snapshot: true, pause: true, }], ['Page.clearPageErrors', { title: 'Clear page errors', }], ['Page.pageErrors', { title: 'Get page errors', group: 'getter', }], ['Page.pdf', { title: 'PDF', }], @@ -154,104 +154,104 @@ export const methodMetainfo = new Map([ ['Page.videoStop', { title: 'Stop video recording', group: 'configuration', }], ['Page.updateSubscription', { internal: true, }], ['Page.setDockTile', { internal: true, }], - ['Frame.evalOnSelector', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['Frame.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['Frame.addScriptTag', { title: 'Add script tag', snapshot: true, pausesBeforeAction: true, }], - ['Frame.addStyleTag', { title: 'Add style tag', snapshot: true, pausesBeforeAction: true, }], + ['Frame.evalOnSelector', { title: 'Evaluate', snapshot: true, pause: true, }], + ['Frame.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, pause: true, }], + ['Frame.addScriptTag', { title: 'Add script tag', snapshot: true, pause: true, }], + ['Frame.addStyleTag', { title: 'Add style tag', snapshot: true, pause: true, }], ['Frame.ariaSnapshot', { title: 'Aria snapshot', group: 'getter', }], - ['Frame.blur', { title: 'Blur', slowMo: true, snapshot: true, pausesBeforeAction: 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, pausesBeforeAction: 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 "{type}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Frame.evaluateExpression', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['Frame.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['Frame.fill', { title: 'Fill "{value}"', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['Frame.focus', { title: 'Focus', slowMo: true, snapshot: true, pausesBeforeAction: true, }], + ['Frame.blur', { title: 'Blur', slowMo: true, snapshot: true, pause: true, }], + ['Frame.check', { title: 'Check', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.click', { title: 'Click', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.content', { title: 'Get content', snapshot: true, pause: true, }], + ['Frame.dragAndDrop', { title: 'Drag and drop', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.dblclick', { title: 'Double click', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.dispatchEvent', { title: 'Dispatch "{type}"', slowMo: true, snapshot: true, pause: true, }], + ['Frame.evaluateExpression', { title: 'Evaluate', snapshot: true, pause: true, }], + ['Frame.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pause: true, }], + ['Frame.fill', { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.focus', { title: 'Focus', slowMo: true, snapshot: true, pause: true, }], ['Frame.frameElement', { title: 'Get frame element', group: 'getter', }], ['Frame.resolveSelector', { internal: true, }], ['Frame.highlight', { title: 'Highlight element', group: 'configuration', }], - ['Frame.getAttribute', { title: 'Get attribute "{name}"', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.goto', { title: 'Navigate to "{url}"', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['Frame.hover', { title: 'Hover', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['Frame.innerHTML', { title: 'Get HTML', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.innerText', { title: 'Get inner text', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.inputValue', { title: 'Get input value', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isChecked', { title: 'Is checked', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isDisabled', { title: 'Is disabled', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isEnabled', { title: 'Is enabled', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isHidden', { title: 'Is hidden', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isVisible', { title: 'Is visible', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.isEditable', { title: 'Is editable', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['Frame.press', { title: 'Press "{key}"', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.getAttribute', { title: 'Get attribute "{name}"', snapshot: true, pause: true, group: 'getter', }], + ['Frame.goto', { title: 'Navigate to "{url}"', slowMo: true, snapshot: true, pause: true, }], + ['Frame.hover', { title: 'Hover', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.innerHTML', { title: 'Get HTML', snapshot: true, pause: true, group: 'getter', }], + ['Frame.innerText', { title: 'Get inner text', snapshot: true, pause: true, group: 'getter', }], + ['Frame.inputValue', { title: 'Get input value', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isChecked', { title: 'Is checked', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isDisabled', { title: 'Is disabled', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isEnabled', { title: 'Is enabled', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isHidden', { title: 'Is hidden', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isVisible', { title: 'Is visible', snapshot: true, pause: true, group: 'getter', }], + ['Frame.isEditable', { title: 'Is editable', snapshot: true, pause: true, group: 'getter', }], + ['Frame.press', { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], ['Frame.querySelector', { title: 'Query selector', snapshot: true, }], ['Frame.querySelectorAll', { title: 'Query selector all', snapshot: true, }], - ['Frame.queryCount', { title: 'Query count', snapshot: true, pausesBeforeAction: true, }], - ['Frame.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['Frame.setContent', { title: 'Set content', snapshot: true, pausesBeforeAction: 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, pausesBeforeAction: true, group: 'getter', }], + ['Frame.queryCount', { title: 'Query count', snapshot: true, pause: true, }], + ['Frame.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.setContent', { title: 'Set content', snapshot: true, pause: true, }], + ['Frame.setInputFiles', { title: 'Set input files', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.tap', { title: 'Tap', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.textContent', { title: 'Get text content', snapshot: true, pause: true, group: 'getter', }], ['Frame.title', { title: 'Get page title', group: 'getter', }], - ['Frame.type', { title: 'Type "{text}"', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['Frame.uncheck', { title: 'Uncheck', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['Frame.type', { title: 'Type "{text}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['Frame.uncheck', { title: 'Uncheck', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], ['Frame.waitForTimeout', { title: 'Wait for timeout', snapshot: true, }], - ['Frame.waitForFunction', { title: 'Wait for function', snapshot: true, pausesBeforeAction: true, }], + ['Frame.waitForFunction', { title: 'Wait for function', snapshot: true, pause: true, }], ['Frame.waitForSelector', { title: 'Wait for selector', snapshot: true, }], - ['Frame.expect', { title: 'Expect "{expression}"', snapshot: true, pausesBeforeAction: true, }], + ['Frame.expect', { title: 'Expect "{expression}"', snapshot: true, pause: true, }], ['Worker.evaluateExpression', { title: 'Evaluate', }], ['Worker.evaluateExpressionHandle', { title: 'Evaluate', }], ['Worker.updateSubscription', { internal: true, }], ['Disposable.dispose', { internal: true, }], ['JSHandle.dispose', { internal: true, }], ['ElementHandle.dispose', { internal: true, }], - ['JSHandle.evaluateExpression', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.evaluateExpression', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['JSHandle.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], + ['JSHandle.evaluateExpression', { title: 'Evaluate', snapshot: true, pause: true, }], + ['ElementHandle.evaluateExpression', { title: 'Evaluate', snapshot: true, pause: true, }], + ['JSHandle.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pause: true, }], + ['ElementHandle.evaluateExpressionHandle', { title: 'Evaluate', snapshot: true, pause: true, }], ['JSHandle.getPropertyList', { title: 'Get property list', group: 'getter', }], ['ElementHandle.getPropertyList', { title: 'Get property list', group: 'getter', }], ['JSHandle.getProperty', { title: 'Get JS property', group: 'getter', }], ['ElementHandle.getProperty', { title: 'Get JS property', group: 'getter', }], ['JSHandle.jsonValue', { title: 'Get JSON value', group: 'getter', }], ['ElementHandle.jsonValue', { title: 'Get JSON value', group: 'getter', }], - ['ElementHandle.evalOnSelector', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.boundingBox', { title: 'Get bounding box', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.check', { title: 'Check', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['ElementHandle.click', { title: 'Click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.evalOnSelector', { title: 'Evaluate', snapshot: true, pause: true, }], + ['ElementHandle.evalOnSelectorAll', { title: 'Evaluate', snapshot: true, pause: true, }], + ['ElementHandle.boundingBox', { title: 'Get bounding box', snapshot: true, pause: true, }], + ['ElementHandle.check', { title: 'Check', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.click', { title: 'Click', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], ['ElementHandle.contentFrame', { title: 'Get content frame', group: 'getter', }], - ['ElementHandle.dblclick', { title: 'Double click', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['ElementHandle.dispatchEvent', { title: 'Dispatch event', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.fill', { title: 'Fill "{value}"', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['ElementHandle.focus', { title: 'Focus', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.getAttribute', { title: 'Get attribute', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.hover', { title: 'Hover', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['ElementHandle.innerHTML', { title: 'Get HTML', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.innerText', { title: 'Get inner text', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.inputValue', { title: 'Get input value', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isChecked', { title: 'Is checked', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isDisabled', { title: 'Is disabled', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isEditable', { title: 'Is editable', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isEnabled', { title: 'Is enabled', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isHidden', { title: 'Is hidden', snapshot: true, pausesBeforeAction: true, group: 'getter', }], - ['ElementHandle.isVisible', { title: 'Is visible', snapshot: true, pausesBeforeAction: true, group: 'getter', }], + ['ElementHandle.dblclick', { title: 'Double click', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.dispatchEvent', { title: 'Dispatch event', slowMo: true, snapshot: true, pause: true, }], + ['ElementHandle.fill', { title: 'Fill "{value}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.focus', { title: 'Focus', slowMo: true, snapshot: true, pause: true, }], + ['ElementHandle.getAttribute', { title: 'Get attribute', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.hover', { title: 'Hover', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.innerHTML', { title: 'Get HTML', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.innerText', { title: 'Get inner text', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.inputValue', { title: 'Get input value', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isChecked', { title: 'Is checked', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isDisabled', { title: 'Is disabled', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isEditable', { title: 'Is editable', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isEnabled', { title: 'Is enabled', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isHidden', { title: 'Is hidden', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.isVisible', { title: 'Is visible', snapshot: true, pause: true, group: 'getter', }], ['ElementHandle.ownerFrame', { title: 'Get owner frame', group: 'getter', }], - ['ElementHandle.press', { title: 'Press "{key}"', slowMo: true, snapshot: true, pausesBeforeInput: true, }], + ['ElementHandle.press', { title: 'Press "{key}"', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], ['ElementHandle.querySelector', { title: 'Query selector', snapshot: true, }], ['ElementHandle.querySelectorAll', { title: 'Query selector all', snapshot: true, }], - ['ElementHandle.screenshot', { title: 'Screenshot', snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.scrollIntoViewIfNeeded', { title: 'Scroll into view', slowMo: true, snapshot: true, pausesBeforeAction: true, }], - ['ElementHandle.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pausesBeforeInput: true, }], - ['ElementHandle.selectText', { title: 'Select text', slowMo: true, snapshot: true, pausesBeforeAction: 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, pausesBeforeAction: true, group: 'getter', }], - ['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, pausesBeforeAction: true, }], + ['ElementHandle.screenshot', { title: 'Screenshot', snapshot: true, pause: true, }], + ['ElementHandle.scrollIntoViewIfNeeded', { title: 'Scroll into view', slowMo: true, snapshot: true, pause: true, }], + ['ElementHandle.selectOption', { title: 'Select option', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.selectText', { title: 'Select text', slowMo: true, snapshot: true, pause: true, }], + ['ElementHandle.setInputFiles', { title: 'Set input files', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.tap', { title: 'Tap', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.textContent', { title: 'Get text content', snapshot: true, pause: true, group: 'getter', }], + ['ElementHandle.type', { title: 'Type', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.uncheck', { title: 'Uncheck', slowMo: true, snapshot: true, pause: true, input: true, isAutoWaiting: true, }], + ['ElementHandle.waitForElementState', { title: 'Wait for state', snapshot: true, pause: true, }], ['ElementHandle.waitForSelector', { title: 'Wait for selector', snapshot: true, }], ['Request.response', { internal: true, }], ['Request.rawRequestHeaders', { internal: true, }], @@ -333,3 +333,7 @@ export const methodMetainfo = new Map([ ['JsonPipe.send', { internal: true, }], ['JsonPipe.close', { internal: true, }] ]); + +export function getMetainfo(metadata: { type: string, method: string }): MethodMetainfo | undefined { + return methodMetainfo.get(metadata.type + '.' + metadata.method); +} diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index bef14056ef883..2f32f1e7a076e 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -1060,7 +1060,7 @@ Browser: parameters: reason: string? flags: - pausesBeforeAction: true + pause: true killForTests: internal: true @@ -1246,7 +1246,7 @@ BrowserContext: parameters: reason: string? flags: - pausesBeforeAction: true + pause: true cookies: title: Get cookies @@ -1617,7 +1617,7 @@ Page: runBeforeUnload: boolean? reason: string? flags: - pausesBeforeAction: true + pause: true clearConsoleMessages: title: Clear console messages @@ -1671,7 +1671,7 @@ Page: - no-override flags: snapshot: true - pausesBeforeAction: true + pause: true exposeBinding: title: Expose binding @@ -1692,7 +1692,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true goForward: title: Go forward @@ -1704,7 +1704,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true requestGC: title: Request garbage collection @@ -1739,7 +1739,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true expectScreenshot: title: Expect screenshot @@ -1770,7 +1770,7 @@ Page: items: string flags: snapshot: true - pausesBeforeAction: true + pause: true screenshot: title: Screenshot @@ -1789,7 +1789,7 @@ Page: binary: binary flags: snapshot: true - pausesBeforeAction: true + pause: true setExtraHTTPHeaders: title: Set extra HTTP headers @@ -1837,7 +1837,7 @@ Page: height: int flags: snapshot: true - pausesBeforeAction: true + pause: true keyboardDown: title: Key down "{key}" @@ -1846,7 +1846,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true keyboardUp: title: Key up "{key}" @@ -1855,7 +1855,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true keyboardInsertText: title: Insert "{text}" @@ -1864,7 +1864,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true keyboardType: title: Type "{text}" @@ -1874,7 +1874,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true keyboardPress: title: Press "{key}" @@ -1884,7 +1884,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true mouseMove: title: Mouse move @@ -1895,7 +1895,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true mouseDown: title: Mouse down @@ -1910,7 +1910,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true mouseUp: title: Mouse up @@ -1925,7 +1925,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true mouseClick: title: Click @@ -1943,7 +1943,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true mouseWheel: title: Mouse wheel @@ -1953,7 +1953,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true touchscreenTap: title: Tap @@ -1963,7 +1963,7 @@ Page: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true clearPageErrors: title: Clear page errors @@ -2231,7 +2231,7 @@ Frame: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true evalOnSelectorAll: title: Evaluate @@ -2244,7 +2244,7 @@ Frame: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true addScriptTag: title: Add script tag @@ -2256,7 +2256,7 @@ Frame: element: ElementHandle flags: snapshot: true - pausesBeforeAction: true + pause: true addStyleTag: title: Add style tag @@ -2267,7 +2267,7 @@ Frame: element: ElementHandle flags: snapshot: true - pausesBeforeAction: true + pause: true ariaSnapshot: title: Aria snapshot @@ -2295,7 +2295,7 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true check: title: Check @@ -2309,7 +2309,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true click: title: Click @@ -2343,7 +2345,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true content: title: Get content @@ -2351,7 +2355,7 @@ Frame: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true dragAndDrop: title: Drag and drop @@ -2368,7 +2372,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true dblclick: title: Double click @@ -2400,7 +2406,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true dispatchEvent: title: Dispatch "{type}" @@ -2413,7 +2421,7 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true evaluateExpression: title: Evaluate @@ -2425,7 +2433,7 @@ Frame: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true evaluateExpressionHandle: title: Evaluate @@ -2437,7 +2445,7 @@ Frame: handle: JSHandle flags: snapshot: true - pausesBeforeAction: true + pause: true fill: title: Fill "{value}" @@ -2450,7 +2458,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true focus: title: Focus @@ -2461,7 +2471,7 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true frameElement: title: Get frame element @@ -2494,7 +2504,7 @@ Frame: value: string? flags: snapshot: true - pausesBeforeAction: true + pause: true goto: title: Navigate to "{url}" @@ -2508,7 +2518,7 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true hover: title: Hover @@ -2532,7 +2542,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true innerHTML: title: Get HTML @@ -2545,7 +2557,7 @@ Frame: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true innerText: title: Get inner text @@ -2558,7 +2570,7 @@ Frame: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true inputValue: title: Get input value @@ -2571,7 +2583,7 @@ Frame: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true isChecked: title: Is checked @@ -2584,7 +2596,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isDisabled: title: Is disabled @@ -2597,7 +2609,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isEnabled: title: Is enabled @@ -2610,7 +2622,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isHidden: title: Is hidden @@ -2623,7 +2635,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isVisible: title: Is visible @@ -2636,7 +2648,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isEditable: title: Is editable @@ -2649,7 +2661,7 @@ Frame: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true press: title: Press "{key}" @@ -2663,7 +2675,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true querySelector: title: Query selector @@ -2694,7 +2708,7 @@ Frame: value: int flags: snapshot: true - pausesBeforeAction: true + pause: true selectOption: title: Select option @@ -2722,7 +2736,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true setContent: title: Set content @@ -2732,7 +2748,7 @@ Frame: waitUntil: LifecycleEvent? flags: snapshot: true - pausesBeforeAction: true + pause: true setInputFiles: title: Set input files @@ -2760,7 +2776,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true tap: title: Tap @@ -2784,7 +2802,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true textContent: title: Get text content @@ -2797,7 +2817,7 @@ Frame: value: string? flags: snapshot: true - pausesBeforeAction: true + pause: true title: title: Get page title @@ -2816,7 +2836,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true uncheck: title: Uncheck @@ -2830,7 +2852,9 @@ Frame: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true waitForTimeout: title: Wait for timeout @@ -2852,7 +2876,7 @@ Frame: handle: JSHandle flags: snapshot: true - pausesBeforeAction: true + pause: true waitForSelector: title: Wait for selector @@ -2897,7 +2921,7 @@ Frame: items: string flags: snapshot: true - pausesBeforeAction: true + pause: true events: @@ -2990,7 +3014,7 @@ JSHandle: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true evaluateExpressionHandle: title: Evaluate @@ -3002,7 +3026,7 @@ JSHandle: handle: JSHandle flags: snapshot: true - pausesBeforeAction: true + pause: true getPropertyList: title: Get property list @@ -3057,7 +3081,7 @@ ElementHandle: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true evalOnSelectorAll: title: Evaluate @@ -3070,7 +3094,7 @@ ElementHandle: value: SerializedValue flags: snapshot: true - pausesBeforeAction: true + pause: true boundingBox: title: Get bounding box @@ -3078,7 +3102,7 @@ ElementHandle: value: Rect? flags: snapshot: true - pausesBeforeAction: true + pause: true check: title: Check @@ -3090,7 +3114,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true click: title: Click @@ -3122,7 +3148,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true contentFrame: title: Get content frame @@ -3158,7 +3186,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true dispatchEvent: title: Dispatch event @@ -3168,7 +3198,7 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true fill: title: Fill "{value}" @@ -3179,14 +3209,16 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true focus: title: Focus flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true getAttribute: title: Get attribute @@ -3197,7 +3229,7 @@ ElementHandle: value: string? flags: snapshot: true - pausesBeforeAction: true + pause: true hover: title: Hover @@ -3219,7 +3251,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true innerHTML: title: Get HTML @@ -3228,7 +3262,7 @@ ElementHandle: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true innerText: title: Get inner text @@ -3237,7 +3271,7 @@ ElementHandle: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true inputValue: title: Get input value @@ -3246,7 +3280,7 @@ ElementHandle: value: string flags: snapshot: true - pausesBeforeAction: true + pause: true isChecked: title: Is checked @@ -3255,7 +3289,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isDisabled: title: Is disabled @@ -3264,7 +3298,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isEditable: title: Is editable @@ -3273,7 +3307,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isEnabled: title: Is enabled @@ -3282,7 +3316,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isHidden: title: Is hidden @@ -3291,7 +3325,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true isVisible: title: Is visible @@ -3300,7 +3334,7 @@ ElementHandle: value: boolean flags: snapshot: true - pausesBeforeAction: true + pause: true ownerFrame: title: Get owner frame @@ -3318,7 +3352,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true querySelector: title: Query selector @@ -3356,7 +3392,7 @@ ElementHandle: binary: binary flags: snapshot: true - pausesBeforeAction: true + pause: true scrollIntoViewIfNeeded: title: Scroll into view @@ -3365,7 +3401,7 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true selectOption: title: Select option @@ -3391,7 +3427,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true selectText: title: Select text @@ -3401,7 +3439,7 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeAction: true + pause: true setInputFiles: title: Set input files @@ -3427,7 +3465,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true tap: title: Tap @@ -3449,7 +3489,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true textContent: title: Get text content @@ -3458,7 +3500,7 @@ ElementHandle: value: string? flags: snapshot: true - pausesBeforeAction: true + pause: true type: title: Type @@ -3469,7 +3511,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true uncheck: title: Uncheck @@ -3481,7 +3525,9 @@ ElementHandle: flags: slowMo: true snapshot: true - pausesBeforeInput: true + pause: true + input: true + isAutoWaiting: true waitForElementState: title: Wait for state @@ -3498,7 +3544,7 @@ ElementHandle: timeout: float flags: snapshot: true - pausesBeforeAction: true + pause: true waitForSelector: title: Wait for selector diff --git a/packages/trace-viewer/src/ui/actionList.tsx b/packages/trace-viewer/src/ui/actionList.tsx index b019bba28e5f8..8f4e6ccaa321b 100644 --- a/packages/trace-viewer/src/ui/actionList.tsx +++ b/packages/trace-viewer/src/ui/actionList.tsx @@ -27,7 +27,8 @@ import type { ActionTraceEventInContext, ActionTreeItem } from '@isomorphic/trac import type { Boundaries } from './geometry'; import { ToolbarButton } from '@web/components/toolbarButton'; import { testStatusIcon } from './testUtils'; -import { formatProtocolParam, getMetainfo } from '@isomorphic/protocolFormatter'; +import { getMetainfo } from '@isomorphic/protocolMetainfo'; +import { formatProtocolParam } from '@isomorphic/protocolFormatter'; export interface ActionListProps { actions: ActionTraceEventInContext[], diff --git a/utils/generate_channels.js b/utils/generate_channels.js index aa0fb884f7b86..3bc621d5d42cb 100755 --- a/utils/generate_channels.js +++ b/utils/generate_channels.js @@ -288,12 +288,8 @@ for (const [name, item] of Object.entries(protocol)) { throw new Error(`Method "${className}.${methodName}" has "slowMo" flag, so cannot be "internal" in protocol.yml`); if (method.flags?.snapshot && method.internal) throw new Error(`Method "${className}.${methodName}" has "snapshot" flag, so cannot be "internal" in protocol.yml`); - if (method.flags?.pausesBeforeInput && method.internal) - throw new Error(`Method "${className}.${methodName}" has "pausesBeforeInput" flag, so cannot be "internal" in protocol.yml`); - if (method.flags?.pausesBeforeAction && method.internal) - throw new Error(`Method "${className}.${methodName}" has "pausesBeforeAction" flag, so cannot be "internal" in protocol.yml`); - if (method.flags?.pausesBeforeInput && method.flags?.pausesBeforeAction) - throw new Error(`Method "${className}.${methodName}" cannot have both "pausesBeforeInput" and "pausesBeforeAction" flags in protocol.yml`); + if (method.flags?.pause && method.internal) + throw new Error(`Method "${className}.${methodName}" has "pause" flag, so cannot be "internal" in protocol.yml`); if (!method.title && !method.internal) throw new Error(`Method "${className}.${methodName}" must have a "title" because it is not "internal" in protocol.yml`); if (method.group && method.internal) @@ -305,9 +301,10 @@ for (const [name, item] of Object.entries(protocol)) { const groupProp = method.group ? ` group: '${method.group}',` : ''; const slowMoProp = method.flags?.slowMo ? ` slowMo: ${method.flags.slowMo},` : ''; const snapshotProp = method.flags?.snapshot ? ` snapshot: ${method.flags.snapshot},` : ''; - const pausesBeforeInputProp = method.flags?.pausesBeforeInput ? ` pausesBeforeInput: ${method.flags.pausesBeforeInput},` : ''; - const pausesBeforeActionProp = method.flags?.pausesBeforeAction ? ` pausesBeforeAction: ${method.flags.pausesBeforeAction},` : ''; - methodMetainfo.push(`['${className + '.' + methodName}', {${internalProp}${titleProp}${slowMoProp}${snapshotProp}${pausesBeforeInputProp}${pausesBeforeActionProp}${groupProp} }]`); + const pauseProp = method.flags?.pause ? ` pause: ${method.flags.pause},` : ''; + const inputProp = method.flags?.input ? ` input: ${method.flags.input},` : ''; + const isAutoWaitingProp = method.flags?.isAutoWaiting ? ` isAutoWaiting: ${method.flags.isAutoWaiting},` : ''; + methodMetainfo.push(`['${className + '.' + methodName}', {${internalProp}${titleProp}${slowMoProp}${snapshotProp}${pauseProp}${inputProp}${isAutoWaitingProp}${groupProp} }]`); } const parameters = objectType(method.parameters || {}, ''); @@ -351,11 +348,15 @@ for (const [name, item] of Object.entries(protocol)) { } } -metainfo_ts.push(`export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pausesBeforeInput?: boolean, pausesBeforeAction?: boolean, group?: string }; +metainfo_ts.push(`export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pause?: boolean, isAutoWaiting?: boolean, input?: boolean, group?: string }; export const methodMetainfo = new Map([ ${methodMetainfo.join(`,\n `)} -]);`); +]); + +export function getMetainfo(metadata: { type: string, method: string }): MethodMetainfo | undefined { + return methodMetainfo.get(metadata.type + '.' + metadata.method); +}`); let hasChanges = false;