From 2e6ade9399f73c03465b494c639e1ad91ace0f38 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Fri, 20 Mar 2026 09:51:31 -0700 Subject: [PATCH] chore: add getMetainfo convenience getter for protocol metainfo Extract MethodMetainfo type from generate_channels.js and add getMetainfo() helper in protocolFormatter.ts to replace repeated methodMetainfo.get(type + '.' + method) lookups across the codebase. --- packages/playwright-core/src/client/channelOwner.ts | 4 ++-- packages/playwright-core/src/server/debugger.ts | 4 ++-- .../playwright-core/src/server/dispatchers/dispatcher.ts | 4 ++-- .../playwright-core/src/server/trace/recorder/tracing.ts | 4 ++-- .../src/utils/isomorphic/protocolFormatter.ts | 9 +++++++-- .../src/utils/isomorphic/protocolMetainfo.ts | 4 +++- packages/trace-viewer/src/ui/actionList.tsx | 5 ++--- utils/generate_channels.js | 4 +++- 8 files changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/playwright-core/src/client/channelOwner.ts b/packages/playwright-core/src/client/channelOwner.ts index 7bd097b3ff486..3957d0f8bfe7d 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 { methodMetainfo } from '../utils/isomorphic/protocolMetainfo'; +import { getMetainfo } from '../utils/isomorphic/protocolFormatter'; import { captureLibraryStackTrace } from './clientStackTrace'; import { stringifyStackFrames } from '../utils/isomorphic/stackTrace'; @@ -147,7 +147,7 @@ export abstract class ChannelOwner { if (typeof prop === 'string') { const validator = maybeFindValidator(this._type, prop, 'Params'); - const { internal } = methodMetainfo.get(this._type + '.' + prop) || {}; + const { internal } = getMetainfo({ type: this._type, method: prop }) || {}; if (validator) { return async (params: any) => { return await this._wrapApiCall(async apiZone => { diff --git a/packages/playwright-core/src/server/debugger.ts b/packages/playwright-core/src/server/debugger.ts index 541f877717354..2e14c64fa3c05 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 { methodMetainfo } from '../utils/isomorphic/protocolMetainfo'; +import { getMetainfo } from '../utils/isomorphic/protocolFormatter'; import type { CallMetadata, InstrumentationListener } from './instrumentation'; @@ -125,6 +125,6 @@ function matchesLocation(metadata: CallMetadata, location: { file: string, line? function shouldPauseBeforeStep(metadata: CallMetadata, includeInputActions: boolean): boolean { if (metadata.internal) return false; - const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); + const metainfo = getMetainfo(metadata); return !!metainfo?.pausesBeforeAction || (includeInputActions && !!metainfo?.pausesBeforeInput); } diff --git a/packages/playwright-core/src/server/dispatchers/dispatcher.ts b/packages/playwright-core/src/server/dispatchers/dispatcher.ts index f3f50166cf4e5..41b0479a8d6ab 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 { methodMetainfo } from '../../utils/isomorphic/protocolMetainfo'; +import { getMetainfo } from '../../utils/isomorphic/protocolFormatter'; import { Progress, ProgressController } from '../progress'; import type { CallMetadata } from '../instrumentation'; @@ -318,7 +318,7 @@ export class DispatcherConnection { return; } - const metainfo = methodMetainfo.get(dispatcher._type + '.' + method); + const metainfo = getMetainfo({ type: dispatcher._type, method }); if (metainfo?.internal) { // For non-js ports, it is easier to detect internal calls here rather // than generate protocol metainfo for each language. diff --git a/packages/playwright-core/src/server/trace/recorder/tracing.ts b/packages/playwright-core/src/server/trace/recorder/tracing.ts index 93d9ce5817fe6..54caaf6ad96ed 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 { methodMetainfo } from '../../../utils/isomorphic/protocolMetainfo'; +import { getMetainfo } from '../../../utils/isomorphic/protocolFormatter'; import { assert } from '../../../utils/isomorphic/assert'; import { monotonicTime } from '../../../utils/isomorphic/time'; import { eventsHelper } from '../../utils/eventsHelper'; @@ -660,7 +660,7 @@ function visitTraceEvent(object: any, sha1s: Set): any { } function shouldCaptureSnapshot(metadata: CallMetadata): boolean { - const metainfo = methodMetainfo.get(metadata.type + '.' + metadata.method); + const metainfo = getMetainfo(metadata); return !!metainfo?.snapshot; } diff --git a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts index 89447dff9f7c8..eb23d0393e9a2 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts @@ -15,6 +15,7 @@ */ import { methodMetainfo } from './protocolMetainfo'; +import type { MethodMetainfo } from './protocolMetainfo'; export function formatProtocolParam(params: Record | undefined, alternatives: string): string | undefined { return _formatProtocolParam(params, alternatives)?.replaceAll('\n', '\\n'); @@ -63,14 +64,18 @@ function deepParam(params: Record, name: string): string | undefine } export function renderTitleForCall(metadata: { title?: string, type: string, method: string, params: Record | undefined }) { - const titleFormat = metadata.title ?? methodMetainfo.get(metadata.type + '.' + metadata.method)?.title ?? metadata.method; + const titleFormat = metadata.title ?? getMetainfo(metadata)?.title ?? metadata.method; return titleFormat.replace(/\{([^}]+)\}/g, (fullMatch, p1) => { return formatProtocolParam(metadata.params, p1) ?? fullMatch; }); } +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 }) { - return methodMetainfo.get(metadata.type + '.' + metadata.method)?.group as undefined | ActionGroup; + return getMetainfo(metadata)?.group as undefined | ActionGroup; } diff --git a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts index 49f3c0c63f7e5..0abc085356e83 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts @@ -16,7 +16,9 @@ // This file is generated by generate_channels.js, do not edit manually. -export const methodMetainfo = new Map([ +export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pausesBeforeInput?: boolean, pausesBeforeAction?: boolean, group?: string }; + +export const methodMetainfo = new Map([ ['APIRequestContext.fetch', { title: '{method} "{url}"', }], ['APIRequestContext.fetchResponseBody', { title: 'Get response body', group: 'getter', }], ['APIRequestContext.fetchLog', { internal: true, }], diff --git a/packages/trace-viewer/src/ui/actionList.tsx b/packages/trace-viewer/src/ui/actionList.tsx index 7d666db23b648..b019bba28e5f8 100644 --- a/packages/trace-viewer/src/ui/actionList.tsx +++ b/packages/trace-viewer/src/ui/actionList.tsx @@ -27,8 +27,7 @@ import type { ActionTraceEventInContext, ActionTreeItem } from '@isomorphic/trac import type { Boundaries } from './geometry'; import { ToolbarButton } from '@web/components/toolbarButton'; import { testStatusIcon } from './testUtils'; -import { methodMetainfo } from '@isomorphic/protocolMetainfo'; -import { formatProtocolParam } from '@isomorphic/protocolFormatter'; +import { formatProtocolParam, getMetainfo } from '@isomorphic/protocolFormatter'; export interface ActionListProps { actions: ActionTraceEventInContext[], @@ -163,7 +162,7 @@ export const renderAction = ( }; export function renderTitleForCall(action: ActionTraceEvent, sdkLanguage?: Language): { elements: React.ReactNode[], title: string } { - let titleFormat = action.title ?? methodMetainfo.get(action.class + '.' + action.method)?.title ?? action.method; + let titleFormat = action.title ?? getMetainfo({ type: action.class, method: action.method })?.title ?? action.method; titleFormat = titleFormat.replace(/\n/g, ' '); const elements: React.ReactNode[] = []; diff --git a/utils/generate_channels.js b/utils/generate_channels.js index 9466dd843f7a2..aa0fb884f7b86 100755 --- a/utils/generate_channels.js +++ b/utils/generate_channels.js @@ -351,7 +351,9 @@ for (const [name, item] of Object.entries(protocol)) { } } -metainfo_ts.push(`export const methodMetainfo = new Map([ +metainfo_ts.push(`export type MethodMetainfo = { internal?: boolean, title?: string, slowMo?: boolean, snapshot?: boolean, pausesBeforeInput?: boolean, pausesBeforeAction?: boolean, group?: string }; + +export const methodMetainfo = new Map([ ${methodMetainfo.join(`,\n `)} ]);`);