<!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 seekCount = 0;

            function seeked()
            {
                var currentCue = textTrackDisplayElement(video, 'cue');

                consoleWrite("<br>** Check style in .vtt file **");
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(255, 255, 255)");
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).backgroundColor", "rgba(0, 0, 0, 0.8)");

                consoleWrite("<br>** Add style to the document **");
                var styleElement = document.createElement("style");
                document.head.appendChild(styleElement);
                stylesheet = styleElement.sheet;
                run("stylesheet.insertRule('video::cue { color: purple; background-color: lime; }', 0)");
                document.body.offsetTop;
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(128, 0, 128)");
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).backgroundColor", "rgb(0, 255, 0)");

                consoleWrite("<br>** Add an override, without '!important' **");
                document.body.offsetTop;
                run("internals.setCaptionsStyleSheetOverride('video::cue { color: blue; background-color: yellow; }')");
                consoleWrite("internals.captionsStyleSheetOverride = " + internals.captionsStyleSheetOverride());
                document.body.offsetTop;
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(128, 0, 128)");
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).backgroundColor", "rgb(0, 255, 0)");

                consoleWrite("<br>** Mark background-color '!important' **");
                run("internals.setCaptionsStyleSheetOverride('video::cue { color: blue ; background-color: yellow !important; }')");
                // The style is not immediately updated, schedule the rest of the test with a zero timeout timer.
                setTimeout(function() {
                    testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(128, 0, 128)");
                    testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).backgroundColor", "rgb(255, 255, 0)");

                    consoleWrite("<br>** Mark color '!important' **");
                    run("stylesheet.insertRule('video::cue { color: blue !important; background-color: yellow  !important; }', 0)");
                    document.body.offsetTop;
                    testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(0, 0, 255)");
                    testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).backgroundColor", "rgb(255, 255, 0)");

                    consoleWrite("");
                    endTest();
                }, 100);
            }

            function loaded()
            {
                consoleWrite("<br>internals.captionsStyleSheetOverride = " + internals.captionsStyleSheetOverride());

                consoleWrite("Test that style to all cues is applied correctly.");
                findMediaElement();
                video.src = findMediaFile('video', '../content/test');
                waitForEvent('seeked', seeked);
                waitForEvent('canplaythrough', function() { video.currentTime = .5; });
            }

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