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 0000000000..c0c2f59f26 Binary files /dev/null and b/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-chromium.png differ 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 new file mode 100644 index 0000000000..16f542aabc Binary files /dev/null and b/tests/library/trace-viewer.spec.ts-snapshots/canvas-clipping-with-overlaying-element-1-webkit.png differ