<!DOCTYPE html>
<html>
<head>
    <script src="../../resources/js-test-pre.js"></script>
</head>
<body onload="start()">
<p id="description"></p>
<div id="console"></div>
<video controls width="680" height="360"></video>
<video controls width="680" height="360"></video>
<canvas width="680" height="360"></canvas>
<script>
    let mediaStream;
    let videos;
    let buffer;
    let currentTest = 0;
    
    function isPixelTransparent(pixel)
    {
        return pixel[0] === 0 && pixel[1] === 0 && pixel[2] === 0 && pixel[3] === 0;
    }

    function isPixelBlack(pixel)
    {
        return pixel[0] === 0 && pixel[1] === 0 && pixel[2] === 0 && pixel[3] === 255;
    }

    function isPixelGray(pixel)
    {
        return pixel[0] === 128 && pixel[1] === 128 && pixel[2] === 128 && pixel[3] === 255;
    }

    function verifyFramesBeingDisplayed()
    {
        videos[currentTest].removeEventListener('playing', verifyFramesBeingDisplayed, false)

        canvas = document.querySelector('canvas');
        context = canvas.getContext('2d');
        
        context.clearRect(0, 0, canvas.width, canvas.height);
        let x = canvas.width * .035;
        let y = canvas.height * 0.6 + 2 + x;
        buffer = context.getImageData(x, y, 1, 1).data;
        shouldBeTrue('isPixelTransparent(buffer)');
        
        evalAndLog(`context.drawImage(videos[${currentTest}], 0, 0, ${canvas.width}, ${canvas.height})`);
        buffer = context.getImageData(x, y, 1, 1).data;
        shouldBeFalse('isPixelTransparent(buffer)');
        shouldBeFalse('isPixelBlack(buffer)');

        x = canvas.width * .05;
        y = canvas.height * .05;
        buffer = context.getImageData(x, y, 1, 1).data;
        shouldBeFalse('isPixelTransparent(buffer)');
        if (!currentTest)
            shouldBeTrue('isPixelBlack(buffer)');
        else
            shouldBeTrue('isPixelGray(buffer)');

        if (currentTest >= 1) {
            finishJSTest();
            return;
        }
        
        videos[currentTest].pause();
        ++currentTest;
        requestNextStream();
    }

    function setupVideoElement(stream)
    {
        mediaStream = stream;
        testPassed('mediaDevices.getUserMedia generated a stream successfully.');
        evalAndLog(`videos[${currentTest}].srcObject = mediaStream`);
    }

    function canplay()
    {
        videos[currentTest].removeEventListener('canplay', canplay, false)
        evalAndLog(`videos[${currentTest}].play()`);
    }
    
    function requestNextStream()
    {
        debug(`<br> === checking pixels from ${!currentTest ? "front" : "back"} camera ===`);
        let constraints = {video : !currentTest ? true : {facingMode: "environment"}};
        navigator.mediaDevices.getUserMedia(constraints).then(setupVideoElement);
    }
    
    function start()
    {
        description("Tests that the stream displays captured buffers to the video element.");
        if (window.testRunner)
            testRunner.setUserMediaPermission(true);

        videos = Array.from(document.getElementsByTagName('video'));
        videos.forEach((video) => {
            video.addEventListener('canplay', canplay, false);
            video.addEventListener('playing', verifyFramesBeingDisplayed, false);
        });
        requestNextStream();
    }

    window.jsTestIsAsync = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
