diff --git a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts index 80045bb2e2f54..d2994a7c6207d 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolFormatter.ts @@ -16,44 +16,51 @@ import { methodMetainfo } from './protocolMetainfo'; -export function formatProtocolParam(params: Record | undefined, name: string): string { +export function formatProtocolParam(params: Record | undefined, alternatives: string): string | undefined { if (!params) - return ''; - if (name === 'url') { - try { - const urlObject = new URL(params[name]); - if (urlObject.protocol === 'data:') - return urlObject.protocol; - if (urlObject.protocol === 'about:') - return params[name]; - return urlObject.pathname + urlObject.search; - } catch (error) { - return params[name]; + return undefined; + + for (const name of alternatives.split('|')) { + if (name === 'url') { + try { + const urlObject = new URL(params[name]); + if (urlObject.protocol === 'data:') + return urlObject.protocol; + if (urlObject.protocol === 'about:') + return params[name]; + return urlObject.pathname + urlObject.search; + } catch (error) { + if (params[name] !== undefined) + return params[name]; + } } + if (name === 'timeNumber' && params[name] !== undefined) { + // eslint-disable-next-line no-restricted-globals + return new Date(params[name]).toString(); + } + + const value = deepParam(params, name); + if (value !== undefined) + return value; } - if (name === 'timeNumber') { - // eslint-disable-next-line no-restricted-globals - return new Date(params[name]).toString(); - } - return deepParam(params, name); } -function deepParam(params: Record, name: string): string { +function deepParam(params: Record, name: string): string | undefined { const tokens = name.split('.'); let current = params; for (const token of tokens) { if (typeof current !== 'object' || current === null) - return ''; + return undefined; current = current[token]; } if (current === undefined) - return ''; + return undefined; return String(current); } 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; - return titleFormat.replace(/\{([^}]+)\}/g, (_, p1) => { - return formatProtocolParam(metadata.params, p1); + return titleFormat.replace(/\{([^}]+)\}/g, (fullMatch, p1) => { + return formatProtocolParam(metadata.params, p1) ?? fullMatch; }); } diff --git a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts index c85f04c599144..ccec3047e3065 100644 --- a/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts +++ b/packages/playwright-core/src/utils/isomorphic/protocolMetainfo.ts @@ -91,13 +91,13 @@ export const methodMetainfo = new Map{param}); - title.push(param); + title.push(param); + } currentIndex = match.index + fullMatch.length; } diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index 10125495b599a..f4e4fcf18ea44 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -110,12 +110,14 @@ test('should open trace viewer on specific host', async ({ showTraceViewer }, te }); test('should show tracing.group in the action list with location', async ({ runAndTrace, page, context }) => { + test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/36483' }); + const traceViewer = await test.step('create trace with groups', async () => { await page.context().tracing.group('ignored group'); return await runAndTrace(async () => { await context.tracing.group('outer group'); await page.goto(`data:text/html,
Hello world
`); - await context.tracing.group('inner group 1', { location: { file: __filename, line: 17, column: 1 } }); + await context.tracing.group('inner group 1 {{ eager_beaver }}', { location: { file: __filename, line: 17, column: 1 } }); await page.locator('body').click(); await context.tracing.groupEnd(); await context.tracing.group('inner group 2'); @@ -128,7 +130,7 @@ test('should show tracing.group in the action list with location', async ({ runA await expect(traceViewer.actionTitles).toHaveText([ /outer group/, /Navigate/, - /inner group 1/, + /inner group 1 {{ eager_beaver }}/, /inner group 2/, /toBeVisible/, ]); @@ -138,7 +140,7 @@ test('should show tracing.group in the action list with location', async ({ runA await expect(traceViewer.actionTitles).toHaveText([ /outer group/, /Navigate/, - /inner group 1/, + /inner group 1 {{ eager_beaver }}/, /Click.*locator/, /inner group 2/, ]);