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

        <script src=../../media-controls.js></script>
        <script src=../../media-file.js></script>
        <script src=../../video-test.js></script>
        <script>
        var testTrack;
        var region;
        var container;
        var totalVisibleLines;

        var seekTimes = [0.2, 0.5, 1.0, 2.3, 3.0];
        var crtSeekTime = 0;

        function countVisibleLines(cueElement)
        {
            var cueRect = cueElement.getBoundingClientRect();
            var regionRect = region.getBoundingClientRect();

            var linesMatch = cueElement.textContent.match(/\n/g);
            var linesCount = 1 + (linesMatch == null ? 0 : linesMatch.length);
            var lineHeight = cueRect.height / linesCount;

            var visibleLines = 0;
            for (i = 0; i < linesCount; ++i) {
              var lineTop = cueRect.top + i * lineHeight;
              var lineBottom = cueRect.top + (i+1) * lineHeight;

              if (lineTop >= regionRect.top && lineBottom <= regionRect.bottom)
                visibleLines++;
            }

            return visibleLines;
        }

        function testRegionsDisplay()
        {
            testTrack = video.textTracks[0];

            consoleWrite("** The text track has only one region **");
            testExpected("testTrack.regions.length", 1);

            try {
              region = textTrackDisplayElement(video, 'region');
              container = textTrackDisplayElement(video, 'region-container');
            } catch(e) {
              consoleWrite(e);
            }

            consoleWrite("<br>** Inspecting cues displayed within region**");

            waitForEvent("seeked", inspectRegionTree);
            seekVideo();
        }

        function seekVideo()
        {
            consoleWrite("");
            run("video.currentTime = " + seekTimes[crtSeekTime++]);
        }

        function inspectRegionTree()
        {
            consoleWrite("Total cues in region: " + container.children.length);
            totalVisibleLines = 0;

            for (var i = 0; i < container.children.length; ++i) {
                var cue = container.children[i];
                var cueVisibleLines = countVisibleLines(cue);
                consoleWrite("Cue content is: " + cue.textContent);
                consoleWrite("Cue lines visible from this cue: " + cueVisibleLines);

                totalVisibleLines += cueVisibleLines;
            }

            testExpected("totalVisibleLines <= testTrack.regions[0].lines", true);

            if (crtSeekTime == seekTimes.length)
                endTest();
            else
                seekVideo();
        }

        function startTest()
        {
            if (!window.VTTRegion) {
                failTest();
                return;
            }

            findMediaElement();

            video.src = findMediaFile('video', '../../content/test');
            waitForEvent('canplaythrough', testRegionsDisplay);
        }

        setCaptionDisplayMode('Automatic');
        </script>
    </head>
    <body>
        <p>Tests default rendering for TextTrackCues that belong to a VTTRegion.</p>
        <video controls>
            <track src="../captions-webvtt/captions-regions.vtt" kind="captions" default onload="startTest()">
        </video>
    </body>
</html>
