<!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; }')");
                document.body.offsetTop;
                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();
            }

            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>
