<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Testing basic video exchange from offerer to receiver</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <video id="video" autoplay playsinline></video>
        <canvas id="canvas" width="640" height="480"></canvas>
        <script src ="routines.js"></script>
        <script>
if (window.testRunner)
    testRunner.setUserMediaPermission(true);

video = document.getElementById("video");
canvas = document.getElementById("canvas");
// FIXME: We should use tracks

function testImage()
{
    try {
        if (!video.videoWidth || !video.videoHeight)
            throw `Video size invalid: ${video.videoWidth}x${video.videoHeight}`;

        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);

        imageData = canvas.getContext('2d').getImageData(0, 0, canvas.width, canvas.height);
        assert_true(imageData.data.every( (pixel, index) => {
            return pixel === 0 || (index % 4) === 3;
        }));

        finishTest();
    } catch(e) {
        errorTest(e);
    }
}

function testStream(stream)
{
    video.srcObject = stream;
    video.onplay = setTimeout(() => {
        stream.getTracks()[0].enabled = false;
        setTimeout(() => {
            testImage();
        }, 0);
    }, 2000);
}

var finishTest, errorTest;
promise_test((test) => {
    return navigator.mediaDevices.getUserMedia({ video: true}).then((stream) => {
        return new Promise((resolve, reject) => {
            finishTest = resolve;
            errorTest = reject;
            createConnections((firstConnection) => {
                firstConnection.addTrack(stream.getVideoTracks()[0], stream);
            }, (secondConnection) => {
                secondConnection.ontrack = (trackEvent) => { testStream(trackEvent.streams[0]); };
            });
        });
    });
}, "Disabled source exchange");
        </script>
    </body>
</html>
