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

        <script src=../media-controls.js></script>
        <script src=../trackmenu-test.js></script>
        <script src=../video-test.js></script>
        <script>

            function testVisibleCue()
            {
                consoleWrite("");
                consoleWrite("EVENT(seeked)");
                consoleWrite("EVENT(cuechange)");
                testExpected("video.textTracks[3].activeCues.length", 1);
                testExpected("textTrackDisplayElement(video, 'cue')", null, "!=");
                consoleWrite("");

                endTest();
            }
            
            function testTracks()
            {
                consoleWrite("<br><i>** Forced tracks should be in .textTracks, but not in the menu<" + "/i>");
                testExpected("video.textTracks.length", 9);

                // Click the CC button to show the menu because it isn't created until it becomes visible.
                clickCCButton();

                trackMenuItems = captionTrackMenuList();
                if (!trackMenuItems) {
                    failTest("Failed to find track menu!");
                    return;
                }
                testExpected("trackMenuItems.length", 6);

                consoleWrite("<br><i>** Only the 'fr' forced track should be showing<" + "/i>");
                testExpected("video.textTracks[0].language", "en");
                testExpected("video.textTracks[0].kind", "subtitles");
                testExpected("video.textTracks[0].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[1].language", "en");
                testExpected("video.textTracks[1].kind", "forced");
                testExpected("video.textTracks[1].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[2].language", "fr");
                testExpected("video.textTracks[2].kind", "subtitles");
                testExpected("video.textTracks[2].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[3].language", "fr");
                testExpected("video.textTracks[3].kind", "forced");
                testExpected("video.textTracks[3].mode", "showing");
                consoleWrite("");

                testExpected("video.textTracks[4].language", "es");
                testExpected("video.textTracks[4].kind", "subtitles");
                testExpected("video.textTracks[4].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[5].language", "es");
                testExpected("video.textTracks[5].kind", "forced");
                testExpected("video.textTracks[5].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[6].language", "de");
                testExpected("video.textTracks[6].kind", "subtitles");
                testExpected("video.textTracks[6].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[7].language", "de");
                testExpected("video.textTracks[7].kind", "forced");
                testExpected("video.textTracks[7].mode", "disabled");
                consoleWrite("");

                testExpected("video.textTracks[8].language", "en");
                testExpected("video.textTracks[8].kind", "captions");
                testExpected("video.textTracks[8].mode", "disabled");
                consoleWrite("");

                waitForEventsAndCall([[video, 'seeked'], [video.textTracks[3], 'cuechange']], testVisibleCue);

                run("video.currentTime = 9.5");
            }

            function setup()
            {
                findMediaElement();
                run("internals.settings.setShouldDisplayTrackKind('Captions', false)");
                run("internals.settings.setShouldDisplayTrackKind('Subtitles', true)");
                run("internals.setUserPreferredLanguages(['en'])");
                run("internals.setPrimaryAudioTrackLanguageOverride('fr')");
                run("internals.setCaptionDisplayMode('ForcedOnly')");
                video.src = '../content/CC+Subtitles.mov';

                waitForEvent('canplaythrough', testTracks);
            }

        </script>
    </head>
    <body onload="setup()">
        <p>Tests that forced subtitles are enable automatically.</p>
        <video width="640" height="360" controls>
        </video>
    </body>
</html>
