blob: d152a6ab287e4c06ed5bc441422eae8b9c5dd221 [file] [edit]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<body>
<canvas id="canvas1" width=400px height=400px></canvas>
<video id="video1" controls autoplay width=400px height=400px></video>
<br>
<canvas id="canvas2" width=400px height=400px></canvas>
<video id="video2" controls autoplay width=400px height=400px></video>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script>
var canvas1 = document.getElementById("canvas1");
var canvas2 = document.getElementById("canvas2");
var video1 = document.getElementById("video1");
var video2 = document.getElementById("video2");
var gl1 = canvas1.getContext('webgl', { preserveDrawingBuffer: false } );
var gl2 = canvas2.getContext('webgl', { preserveDrawingBuffer: true } );
function modifyCanvas(gl, green)
{
gl.clearColor(0, green ? 1 : 0, 0, 1);
gl.clear(gl.COLOR_BUFFER_BIT);
setTimeout(() => { modifyCanvas(gl, !green) }, 500);
}
function checkGreenPixel(value, cptr)
{
var index = cptr % 4;
if (index == 0)
return value == 0;
if (index == 1)
return value == 255;
if (index == 2)
return value == 0;
if (index == 3)
return value == 255;
}
promise_test(async test => {
var stream = canvas1.captureStream();
video1.srcObject = stream;
await new Promise(resolve => requestAnimationFrame(() => setTimeout(resolve, 0)));
const promise = new Promise((resolve, reject) => {
const identifier = video1.requestVideoFrameCallback((now, metadata) => {
resolve(new VideoFrame(video1));
});
setTimeout(() => {
reject("no rvfc for " + identifier);
video1.cancelVideoFrameCallback(identifier);
}, 5000);
});
modifyCanvas(gl1, true);
const frame = await promise;
test.add_cleanup(() => { frame.close(); });
const data = new Uint8Array(frame.allocationSize());
const layout = await frame.copyTo(data);
assert_equals(frame.format, "BGRA");
data.forEach((value, cptr) => {
assert_true(checkGreenPixel(value, cptr), "expecting value " + cptr + " to be part of a green pixel");
});
}, "captureStream with 3d context drawing - not buffered initially");
promise_test(async test => {
var stream = canvas2.captureStream();
video2.srcObject = stream;
await new Promise(resolve => requestAnimationFrame(() => setTimeout(resolve, 0)));
const promise = new Promise((resolve, reject) => {
const identifier = video2.requestVideoFrameCallback((now, metadata) => {
resolve(new VideoFrame(video2));
});
setTimeout(() => {
reject("no rvfc for " + identifier);
video2.cancelVideoFrameCallback(identifier);
}, 5000);
});
modifyCanvas(gl2, true);
const frame = await promise;
test.add_cleanup(() => { frame.close(); });
const data = new Uint8Array(frame.allocationSize());
const layout = await frame.copyTo(data);
assert_equals(frame.format, "BGRA");
data.forEach((value, cptr) => {
assert_true(checkGreenPixel(value, cptr), "expecting value " + cptr + " to be part of a green pixel");
});
}, "captureStream with 3d context drawing - buffered initially");
</script>
</body>
</html>