Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
- This WPT test may be referenced by the following Test IDs:
- /html/canvas/offscreen/manual/draw-element-image/video-worker.tentative.html - WPT Dashboard Interop Dashboard
<!DOCTYPE HTML>
<html class="reftest-wait">
<head>
<title>captureElementImage repaints video frames in worker</title>
<meta name="fuzzy" content="maxDifference=0-19;totalPixels=0-4096">
<link rel="match" href="video-worker-ref.html">
<script src="/common/reftest-wait.js"></script>
<script src="/html/canvas/resources/wait-for-canvas-paint.js"></script>
<style>
#child {
width: 64px;
height: 64px;
}
#video {
width: 64px;
height: 64px;
}
</style>
</head>
<body>
<canvas id=canvas width="100" height="100" layoutsubtree>
<div id=child>
<video id=video src="/media/fast-red-green.webm" autoplay muted></video>
</div>
</canvas>
<script type="module">
let video = document.getElementById('video');
let canvas = document.getElementById('canvas');
let child = document.getElementById('child');
const workerCode = `
let ctx;
self.onmessage = (e) => {
if (e.data.canvas) {
ctx = e.data.canvas.getContext('2d');
}
if (e.data.elementImage) {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.drawElementImage(e.data.elementImage, 0, 0);
}
if (e.data.ping) {
self.postMessage({pong:true});
}
};
`;
const worker = new Worker(URL.createObjectURL(new Blob([workerCode], {type: 'application/javascript'})));
const offscreen = canvas.transferControlToOffscreen();
worker.postMessage({ canvas: offscreen }, [offscreen]);
await waitForCanvasPaint(canvas);
video.src = "/media/fast-red-green.webm";
video.onended = () => {
canvas.onpaint = null;
// Wait for a response to a 'ping' message to make sure the worker
// has flushed its message queue before we take the screenshot.
worker.addEventListener("message", e => {
if (e.data.pong) {
takeScreenshot();
}
});
worker.postMessage({ping:true});
};
canvas.onpaint = () => {
const elementImage = canvas.captureElementImage(child);
worker.postMessage({ elementImage: elementImage }, [elementImage]);
};
</script>
</body>
</html>