<!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=false ] -->
<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 src=../media-controls.js></script>

        <script>

        var testTrack;
        var cueDisplayElement;
        var cueDisplayContainer;
        var controlsPanelElement;
        var seekedCount = 0;

        var testCaseDescription = [
                "Default",
                "Center",
                "Top left",
                "Top right",
                "Bottom right",
                "Bottom left",
                "Bottom center",
                "Multiple cues"
        ];

        var testCaseSeekTime = [
                0.10,
                0.60,
                1.10,
                1.60,
                2.10,
                2.60,
                3.10,
                4.10
        ];

        var currentTestCase = 0;

        function seeked()
        {
            consoleWrite("Active cues: " + testTrack.track.activeCues.length);

            for (var i = 0; i < testTrack.track.activeCues.length; ++i) {
                cueDisplayElement = textTrackDisplayElement(video, 'display', i);

                consoleWrite("");
                consoleWrite("* Cue " + i + " *");
                testExpected("cueDisplayElement.innerText", testTrack.track.activeCues[i].text);
                consoleWrite("Cue alignment (default or as specified): " + testTrack.track.activeCues[i].align);

                consoleWrite("Cue left position (percentage): " + Math.round(cueDisplayElement.offsetLeft / cueDisplayContainer.offsetWidth * 100));
                consoleWrite("Cue top position (percentage): " + Math.round(cueDisplayElement.offsetTop / cueDisplayContainer.offsetHeight * 100));
            }

            runNextTestCase();
        };

        function runNextTestCase()
        {
            if (currentTestCase == testCaseDescription.length) {
                endTest();
                return;
            }

            consoleWrite("");
            consoleWrite("** " +  testCaseDescription[currentTestCase] + " **");

            video.currentTime = testCaseSeekTime[currentTestCase];
            waitForEvent('seeked', seeked, false, true);

            currentTestCase++;
        }

        function loaded()
        {
            consoleWrite("Test that TextTrack's cues are rendered correctly when the snap to lines flag is not set.");

            findMediaElement();
            testTrack = document.querySelector('track');
            video.src = findMediaFile('video', '../content/test');
            controlsPanelElement = mediaControlsElement(internals.shadowRoot(video).firstChild, '-webkit-media-controls-panel');

            waitForEvent('canplaythrough', function() {
                cueDisplayContainer = textTrackDisplayElement(video);
                runNextTestCase();
            });
        }

        setCaptionDisplayMode('Automatic');
        </script>
    </head>
    <body onload="loaded()">
        <video controls>
            <track src="captions-webvtt/captions-snap-to-lines-not-set.vtt" kind="captions" default>
        </video>
    </body>
</html>
