From 868a95eadc3c3462630d6131b9cee1a283eb793a Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Wed, 13 Nov 2024 12:40:30 +0100 Subject: [PATCH] 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 a9f89ba273..b3e98973b4 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 0000000000..ef75b219fc --- /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 0c8ad1aafd..70bfe4228a 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