<!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 src=../media-controls.js></script>

        <script>

        var testTrack;
        var fragment;

        function testMutability()
        {
            consoleWrite("<br>** Test initial cue info");

            testExpected("testTrack.track.activeCues.length", 0);
            testExpected("textTrackDisplayElement(video, 'display').innerText", "");

            testExpected("testTrack.track.cues[0].startTime", 1.0);
            testExpected("testTrack.track.cues[1].startTime", 3.0);

            testExpected("testTrack.track.cues[0].text", "Lorem ipsum dolor sit amet,");
            fragment = document.createDocumentFragment();
            fragment.appendChild(document.createTextNode("Lorem ipsum dolor sit amet,"));
            testExpected("fragment.isEqualNode(testTrack.track.cues[0].getCueAsHTML())", true);

            consoleWrite("<br>** Change the start time of cue #1, it should become visible.");
            run("testTrack.track.cues[0].startTime = 0");
            testExpected("testTrack.track.cues[0].startTime", 0);
            testExpected("textTrackDisplayElement(video, 'display').innerText", "Lorem ipsum dolor sit amet,");

            consoleWrite("<br>** Change the cue text, getCueAsHTML() should return a new, correct fragment.");
            run("testTrack.track.cues[0].text = 'Lorem <b>ipsum</b> <u>dolor</u> <i.sit>sit</i> amet,'");
            testExpected("testTrack.track.cues[0].text", "Lorem <b>ipsum</b> <u>dolor</u> <i.sit>sit</i> amet,");

            fragment = document.createDocumentFragment();
            fragment.appendChild(document.createTextNode("Lorem "));

            var bold = document.createElement("b");
            bold.appendChild(document.createTextNode("ipsum"));
            fragment.appendChild(bold);

            fragment.appendChild(document.createTextNode(" "));

            var underline = document.createElement("u");
            underline.appendChild(document.createTextNode("dolor"));
            fragment.appendChild(underline);

            fragment.appendChild(document.createTextNode(" "));

            var italics = document.createElement("i");
            italics.className = "sit";
            italics.appendChild(document.createTextNode("sit"));
            fragment.appendChild(italics);

            fragment.appendChild(document.createTextNode(" amet,"));

            testExpected("fragment.isEqualNode(testTrack.track.cues[0].getCueAsHTML())", true);

            consoleWrite("");
            endTest();
        }

        function loaded()
        {
            findMediaElement();
            testTrack = document.querySelector('track');

            waitForEventsAndCall([[video, 'canplaythrough'], [testTrack, 'load']], testMutability);

            video.src = findMediaFile('video', '../content/counting');
        }

        setCaptionDisplayMode('Automatic');
        </script>
    </head>
    <body onload="loaded()">
        <video controls >
            <track src="captions-webvtt/captions-gaps.vtt" kind="captions" default >
        </video>
        <p>Test that cue text is mutable.</p>
    </body>
</html>
