<!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((test) => {
    var stream = canvas1.captureStream();
    video1.srcObject = stream;

    if (!window.internals)
        var promise = Promise.resolve();
    else {
        internals.observeMediaStreamTrack(stream.getVideoTracks()[0]);
        var promise = internals.grabNextMediaStreamTrackFrame().then((data) => {
            data.data.forEach((value, cptr) => {
                assert_true(checkGreenPixel(value, cptr), "expecting value " + cptr + " to be part of a green pixel");
            });
        })
    }

    modifyCanvas(gl1, true);
    return promise;
}, "captureStream with 3d context drawing - not buffered initially");

promise_test((test) => {
    var stream = canvas2.captureStream();
    video2.srcObject = stream;

    if (!window.internals)
        var promise = Promise.resolve();
    else {
        internals.observeMediaStreamTrack(stream.getVideoTracks()[0]);
        var promise = internals.grabNextMediaStreamTrackFrame().then((data) => {
            data.data.forEach((value, cptr) => {
                assert_true(checkGreenPixel(value, cptr), "expecting value " + cptr + " to be part of a green pixel");
            });
        })
    }

    modifyCanvas(gl2, true);
    return promise;
}, "captureStream with 3d context drawing - buffered initially");

        </script>
    </body>
</html>
