<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
    <meta name="viewport" content="width=device-width">
    <title>Progress Events Generated Correctly During Loading</title>
    <body>
    <p>Test that progress events are generated during loading of media resource.</p>

    <script src=./video-test.js></script>
    <script src=./media-file.js></script>
    <script>
        function errorListener(event)
        {
            logResult(false, "Caught 'error' event, media.error.code = " + this.error.code);
            endTest();
        }

        function canplaythroughListener(event)
        {
            consoleWrite("EVENT(canplaythrough)");
            this.play();
        }

        function playingListener(event)
        {
            consoleWrite("EVENT(playing)");
        }

        function progressListener(event)
        {
            ++progressCount;
        }

        function endedListener(event)
        {
            consoleWrite("EVENT(ended)");
            testExpected("progressCount", 1, ">");
            endTest();
        }

        document.write("<video controls></video>");
        var videoElement = document.getElementsByTagName('video')[0];
        var progressCount = 0;
        videoElement.addEventListener('error', errorListener);
        videoElement.addEventListener('canplaythrough', canplaythroughListener);
        videoElement.addEventListener('playing', playingListener);
        videoElement.addEventListener('ended', endedListener);
        videoElement.src = findMediaFile("video", "./content/counting");
        videoElement.addEventListener('progress', progressListener);
    </script>
</body>
</html>
