From 21ae298015c2e53296dea03240439e0c8ca97934 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Thu, 17 Feb 2022 22:12:42 +0100 Subject: [PATCH] fix(trace-viewer): don't crash when argument is null (#12186) --- .../src/web/traceViewer/ui/callTab.tsx | 2 +- tests/trace-viewer/trace-viewer.spec.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/playwright-core/src/web/traceViewer/ui/callTab.tsx b/packages/playwright-core/src/web/traceViewer/ui/callTab.tsx index f2be96bee6..18efe7ceb9 100644 --- a/packages/playwright-core/src/web/traceViewer/ui/callTab.tsx +++ b/packages/playwright-core/src/web/traceViewer/ui/callTab.tsx @@ -82,7 +82,7 @@ function toString(metadata: CallMetadata, name: string, value: any): { title: st value = parseSerializedValue(value, new Array(10).fill({ handle: '' })); } const type = typeof value; - if (type !== 'object') + if (type !== 'object' || value === null) return { title: String(value), type }; if (value.guid) return { title: '', type: 'handle' }; diff --git a/tests/trace-viewer/trace-viewer.spec.ts b/tests/trace-viewer/trace-viewer.spec.ts index 18fa5dbd9e..b0d67b0420 100644 --- a/tests/trace-viewer/trace-viewer.spec.ts +++ b/tests/trace-viewer/trace-viewer.spec.ts @@ -145,6 +145,8 @@ test.beforeAll(async function recordTrace({ browser, browserName, browserType, s }); }, { a: 'paramA', b: 4 }); + await page.evaluate(() => 1 + 1, null); + async function doClick() { await page.click('"Click"'); } @@ -192,6 +194,7 @@ test('should open simple trace viewer', async ({ showTraceViewer }) => { /page.setContent/, /expect.toHaveTextbutton/, /page.evaluate/, + /page.evaluate/, /page.click"Click"/, /page.waitForEvent/, /page.waitForEvent/, @@ -254,6 +257,20 @@ test('should show params and return value', async ({ showTraceViewer, browserNam ]); }); +test('should show null as a param', async ({ showTraceViewer, browserName }) => { + const traceViewer = await showTraceViewer([traceFile]); + await traceViewer.selectAction('page.evaluate', 1); + await expect(traceViewer.callLines).toHaveText([ + /page.evaluate/, + /wall time: [0-9/:,APM ]+/, + /duration: [\d]+ms/, + 'expression: "() => 1 + 1"', + 'isFunction: true', + 'arg: null', + 'value: 2' + ]); +}); + test('should have correct snapshot size', async ({ showTraceViewer }, testInfo) => { const traceViewer = await showTraceViewer([traceFile]); await traceViewer.selectAction('page.setViewport');