<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <script src=../media-file.js></script>
        <script src=../video-test.js></script>
        <script>
            var videoCanPlayThrough = false;
            var trackLoaded = false;

            var currentCue;
            var testTrack;

            var dispatchedEvents = [];

            function runTests()
            {
                if (!trackLoaded || !videoCanPlayThrough)
                    return;

                testTrack = document.getElementById("testTrack");
                testExpected("testTrack.track.cues.length", 8);

                for (var i = 0; i < testTrack.track.cues.length; ++i) {
                    testTrack.track.cues[i].addEventListener('enter', cueEnteredOrExited);
                    testTrack.track.cues[i].addEventListener('exit', cueEnteredOrExited);
                }

                run("video.play()");
            }

            function cueEnteredOrExited(event)
            {
                currentCue = event.target;

                var eventObj = {};

                eventObj.time = currentCue.startTime;
                if (event.type == 'exit')
                    eventObj.time = currentCue.endTime;

                eventObj.type = event.type;
                eventObj.cue = currentCue;

                dispatchedEvents.push(eventObj);
            }

            function loaded()
            {
                trackLoaded = true;
                runTests();
            }

            function bodyLoaded()
            {
                findMediaElement();
                video.src = findMediaFile("video", "../content/test");
            }

            function logEndTest()
            {
                for (var i = 0; i < dispatchedEvents.length; ++i) {
                    consoleWrite("Cue event: " + dispatchedEvents[i].type +
                                 " id: " + dispatchedEvents[i].cue.id +
                                 " time: " + dispatchedEvents[i].time);
                }

                endTest();
            }

            waitForEvent('ended', logEndTest);

            waitForEvent('canplaythrough', function() {
                video.currentTime = 5.00;
                videoCanPlayThrough = true;

                runTests();
            });

            setCaptionDisplayMode('Automatic');
        </script>
    </head>
    <body onload="bodyLoaded()">
        <p>Tests that all events events are triggered in chronological order.</p>
        <video controls>
            <track id="testTrack" src="captions-webvtt/sorted-dispatch.vtt" onload="loaded()" default>
        </video>
    </body>
</html>
