<!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;

            async 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)");
                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' **");
                run("internals.setCaptionsStyleSheetOverride('video::cue { color: blue; background-color: yellow; }')");
                consoleWrite("internals.captionsStyleSheetOverride = " + internals.captionsStyleSheetOverride());
                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; }')");
                testExpected("getComputedStyle(textTrackDisplayElement(video, 'cue')).color", "rgb(128, 0, 128)");
                // The style is not immediately updated.
                await testExpectedEventually("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)");
                // The style is not immediately updated.
                await testExpectedEventually("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>
