From 868a95eadc3c3462630d6131b9cee1a283eb793a Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Wed, 13 Nov 2024 12:40:30 +0100 Subject: [PATCH 1/8] fix(canvas snapshots): fix position mismatch with headless screenshots --- .../trace-viewer/src/sw/snapshotRenderer.ts | 10 ++--- .../screenshots/canvas-with-overlay.html | 42 ++++++++++++++++++ tests/library/trace-viewer.spec.ts | 14 +++++- ...ing-with-overlaying-element-1-chromium.png | Bin 0 -> 17381 bytes ...pping-with-overlaying-element-1-webkit.png | Bin 0 -> 17210 bytes 5 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 tests/assets/screenshots/canvas-with-overlay.html create mode 100644 tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png create mode 100644 tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-webkit.png diff --git a/packages/trace-viewer/src/sw/snapshotRenderer.ts b/packages/trace-viewer/src/sw/snapshotRenderer.ts index a9f89ba27338c..b3e98973b46d3 100644 --- a/packages/trace-viewer/src/sw/snapshotRenderer.ts +++ b/packages/trace-viewer/src/sw/snapshotRenderer.ts @@ -429,12 +429,12 @@ function snapshotScript(...targetIds: (string | undefined)[]) { const boundingRect = canvas.getBoundingClientRect(); const xStart = boundingRect.left / window.innerWidth; - const yStart = boundingRect.top / window.innerHeight; + const yStart = boundingRect.top / window.innerWidth; const xEnd = boundingRect.right / window.innerWidth; - const yEnd = boundingRect.bottom / window.innerHeight; + const yEnd = boundingRect.bottom / window.innerWidth; - const partiallyUncaptured = xEnd > 1 || yEnd > 1; - const fullyUncaptured = xStart > 1 || yStart > 1; + const partiallyUncaptured = boundingRect.right > window.innerWidth || boundingRect.bottom > window.innerHeight; + const fullyUncaptured = boundingRect.left > window.innerWidth || boundingRect.top > window.innerHeight; if (fullyUncaptured) { canvas.title = `Playwright couldn't capture canvas contents because it's located outside the viewport.`; continue; @@ -442,7 +442,7 @@ function snapshotScript(...targetIds: (string | undefined)[]) { drawCheckerboard(context, canvas); - context.drawImage(img, xStart * img.width, yStart * img.height, (xEnd - xStart) * img.width, (yEnd - yStart) * img.height, 0, 0, canvas.width, canvas.height); + context.drawImage(img, xStart * img.width, yStart * img.width, (xEnd - xStart) * img.width, (yEnd - yStart) * img.width, 0, 0, canvas.width, canvas.height); if (isUnderTest) // eslint-disable-next-line no-console console.log(`canvas drawn:`, JSON.stringify([xStart, yStart, xEnd, yEnd].map(v => Math.floor(v * 100)))); diff --git a/tests/assets/screenshots/canvas-with-overlay.html b/tests/assets/screenshots/canvas-with-overlay.html new file mode 100644 index 0000000000000..ef75b219fc9b9 --- /dev/null +++ b/tests/assets/screenshots/canvas-with-overlay.html @@ -0,0 +1,42 @@ + + +
+ +
An HTML element
+
+ + \ No newline at end of file diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index 0c8ad1aafd823..70bfe4228a305 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -1510,7 +1510,7 @@ test('canvas clipping', async ({ runAndTrace, page, server }) => { }); const msg = await traceViewer.page.waitForEvent('console', { predicate: msg => msg.text().startsWith('canvas drawn:') }); - expect(msg.text()).toEqual('canvas drawn: [0,91,12,111]'); + expect(msg.text()).toEqual('canvas drawn: [0,51,12,62]'); const snapshot = await traceViewer.snapshotFrame('page.goto'); await expect(snapshot.locator('canvas')).toHaveAttribute('title', `Playwright couldn't capture full canvas contents because it's located partially outside the viewport.`); @@ -1529,6 +1529,18 @@ test('canvas clipping in iframe', async ({ runAndTrace, page, server }) => { await expect(canvas).toHaveAttribute('title', `Playwright displays canvas contents on a best-effort basis. It doesn't support canvas elements inside an iframe yet. If this impacts your workflow, please open an issue so we can prioritize.`); }); +test('canvas clipping with overlaying element', { annotation: [{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/33562' }] }, async ({ runAndTrace, page, server, browserName }) => { + test.fixme(browserName === 'firefox', 'firefox doesnt handle the screenshot test well'); + + const traceViewer = await runAndTrace(async () => { + await page.goto(server.PREFIX + '/screenshots/canvas-with-overlay.html'); + await rafraf(page, 5); + }); + + const snapshot = await traceViewer.snapshotFrame('page.evaluate'); + await expect(snapshot.owner()).toHaveScreenshot(); +}); + test('should show only one pointer with multilevel iframes', async ({ page, runAndTrace, server, browserName }) => { test.fixme(browserName === 'firefox', 'Elements in iframe are not marked'); diff --git a/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png b/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png new file mode 100644 index 0000000000000000000000000000000000000000..c0c2f59f268924d1d4534ebb33c884f117155c37 GIT binary patch literal 17381 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 WE}vX9L2rv Date: Wed, 13 Nov 2024 12:41:36 +0100 Subject: [PATCH 2/8] remove border --- .../screenshots/canvas-with-overlay.html | 10 ---------- ...ing-with-overlaying-element-1-chromium.png | Bin 17381 -> 6918 bytes ...pping-with-overlaying-element-1-webkit.png | Bin 17210 -> 6784 bytes 3 files changed, 10 deletions(-) diff --git a/tests/assets/screenshots/canvas-with-overlay.html b/tests/assets/screenshots/canvas-with-overlay.html index ef75b219fc9b9..3b5bef918beda 100644 --- a/tests/assets/screenshots/canvas-with-overlay.html +++ b/tests/assets/screenshots/canvas-with-overlay.html @@ -1,28 +1,18 @@ - -
- -
An HTML element
-
- - \ No newline at end of file diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index a14072cfeb43b..651f2f64cae5d 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -1510,7 +1510,7 @@ test('canvas clipping', async ({ runAndTrace, page, server }) => { }); const msg = await traceViewer.page.waitForEvent('console', { predicate: msg => msg.text().startsWith('canvas drawn:') }); - expect(msg.text()).toEqual('canvas drawn: [0,51,12,62]'); + expect(msg.text()).toEqual('canvas drawn: [0,91,11,20]'); const snapshot = await traceViewer.snapshotFrame('page.goto'); await expect(snapshot.locator('canvas')).toHaveAttribute('title', `Playwright couldn't capture full canvas contents because it's located partially outside the viewport.`); From 79ad3e2b65313950681d8419cd8591e8ff8c4c73 Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 14 Nov 2024 09:14:35 +0100 Subject: [PATCH 7/8] remove for good --- tests/library/trace-viewer.spec.ts | 12 ------------ ...ipping-with-overlaying-element-1-chromium.png | Bin 6918 -> 0 bytes ...clipping-with-overlaying-element-1-webkit.png | Bin 6784 -> 0 bytes 3 files changed, 12 deletions(-) delete mode 100644 tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png delete mode 100644 tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-webkit.png diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index 651f2f64cae5d..0daf06298a180 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -1529,18 +1529,6 @@ test('canvas clipping in iframe', async ({ runAndTrace, page, server }) => { await expect(canvas).toHaveAttribute('title', `Playwright displays canvas contents on a best-effort basis. It doesn't support canvas elements inside an iframe yet. If this impacts your workflow, please open an issue so we can prioritize.`); }); -test('canvas clipping with overlaying element', { annotation: [{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/33562' }] }, async ({ runAndTrace, page, server, browserName }) => { - test.fixme(browserName === 'firefox', 'firefox doesnt handle the screenshot test well'); - - const traceViewer = await runAndTrace(async () => { - await page.goto(server.PREFIX + '/screenshots/canvas-with-overlay.html'); - await rafraf(page, 5); - }); - - const snapshot = await traceViewer.snapshotFrame('page.evaluate'); - await expect(snapshot.owner()).toHaveScreenshot({ maxDiffPixelRatio: 0.05 }); -}); - test('should show only one pointer with multilevel iframes', async ({ page, runAndTrace, server, browserName }) => { test.fixme(browserName === 'firefox', 'Elements in iframe are not marked'); diff --git a/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png b/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png deleted file mode 100644 index 8fadfbfc2b246d8bed54e879063dc556618fd03e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6918 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 diff --git a/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-webkit.png b/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-webkit.png deleted file mode 100644 index f4ea12e2aec8a9bdba206f21e4d209d01dc76ce9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6784 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 F{{gZd{N(@u From 85fd54aa18db2ff3b6ea12810b8af77305350bda Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Thu, 14 Nov 2024 10:29:37 +0100 Subject: [PATCH 8/8] address feedback --- packages/trace-viewer/src/sw/snapshotRenderer.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/trace-viewer/src/sw/snapshotRenderer.ts b/packages/trace-viewer/src/sw/snapshotRenderer.ts index ecf9593ab5666..f4e9d908fb761 100644 --- a/packages/trace-viewer/src/sw/snapshotRenderer.ts +++ b/packages/trace-viewer/src/sw/snapshotRenderer.ts @@ -427,14 +427,17 @@ function snapshotScript(...targetIds: (string | undefined)[]) { for (const canvas of canvasElements) { const context = canvas.getContext('2d')!; - drawCheckerboard(context, canvas); - const boundingRectAttribute = canvas.getAttribute('__playwright_bounding_rect__'); canvas.removeAttribute('__playwright_bounding_rect__'); if (!boundingRectAttribute) continue; - const boundingRect = JSON.parse(boundingRectAttribute) as { left: number, top: number, right: number, bottom: number }; + let boundingRect: { left: number, top: number, right: number, bottom: number }; + try { + boundingRect = JSON.parse(boundingRectAttribute); + } catch (e) { + continue; + } const partiallyUncaptured = boundingRect.right > 1 || boundingRect.bottom > 1; const fullyUncaptured = boundingRect.left > 1 || boundingRect.top > 1; @@ -443,6 +446,8 @@ function snapshotScript(...targetIds: (string | undefined)[]) { continue; } + drawCheckerboard(context, canvas); + context.drawImage(img, boundingRect.left * img.width, boundingRect.top * img.height, (boundingRect.right - boundingRect.left) * img.width, (boundingRect.bottom - boundingRect.top) * img.height, 0, 0, canvas.width, canvas.height); if (isUnderTest) // eslint-disable-next-line no-console