<html>
    <head>
        <title>Drawing to canvas using video with source element does not taint canvas</title>
        <script src=media-file.js></script>
        <script src=video-test.js></script>
        <script src="../resources/js-test-pre.js"></script>
        <script>
            var ctx;
            var width;
            var height;

            function canplaythrough()
            {
                width = video.videoWidth / 2;
                height = video.videoHeight / 2;

                ctx = canvas.getContext("2d");
                video.pause();
                ctx.drawImage(video, 0, 0, width, height);
                shouldBeTrue("!!ctx.getImageData(0, 0, width, height)");
                endTest();
            }

            function start()
            {
                description("Test to ensure we don't taint a canvas when drawing from a video the uses source elements rather than the src attribute");
                findMediaElement();
                canvas = document.getElementsByTagName('canvas')[0];
                waitForEvent('canplaythrough', canplaythrough);
                var mediaFile = findMediaFile("video", "content/counting");
                disableFullTestDetailsPrinting();
                runSilently("var source = document.createElement('source'); source.src = '" + mediaFile + "'; video.appendChild(source)");
                enableFullTestDetailsPrinting();
            }
        </script>
    </head>

    <body onload="start()" >
        <p id="description"></p>
        <video controls></video>
        <canvas width="160" height="120" ></canvas>
        <div id="console"></div>
    </body>
</html>
