<!DOCTYPE html><!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
    <head>
        <title>Selecting from a list of tracks</title>
        <script src="media-controls.js"></script>
        <script src="media-file.js"></script>
        <script src="video-test.js"></script>
        <script src="trackmenu-test.js"></script>
        <script>

            function finishTest()
            {
                testExpected("video.textTracks[0].mode", "disabled");
                testExpected("video.textTracks[1].mode", "showing");
                listTrackMenu();

                consoleWrite("");
                endTest();
            }

            function trackLoaded()
            {
                consoleWrite("<br>EVENT(load)");

                consoleWrite("<br>*** The new track should be selected because it is in the preferred language.");
                testExpected("event.target.srclang", "en");
                testExpected("event.target.readyState", HTMLTrackElement.LOADED);

                showMenu(finishTest);
            }

            function startTest()
            {
                trackListElement = getTrackListElement();
                if (!trackListElement)
                    return;

                consoleWrite("<br>** The preferred language is set to English, but the Spanish track should be enabled because it is available");
                listTrackMenu();
                testExpected("video.textTracks[0].mode", "showing");
                clickCCButton();

                consoleWrite("<br>*** Add a text track in the preferred language.");
                run("track = document.createElement('track')");
                run("track.setAttribute('kind', 'captions')");
                uri = 'data:text/vtt,' + encodeURIComponent('WEBVTT\n\n00:00:00.000 --> 00:00:01.000\nCaption 1\n');
                run("track.src = '" + uri + "'");
                run("track.setAttribute('srclang', 'en')");
                run("track.setAttribute('onload', 'trackLoaded()')");
                run("video.appendChild(track)");
            }

            function showMenu(nextFunction)
            {
                clickCCButton();
                window.setTimeout(nextFunction, 100);
            }

            function canplaythrough()
            {
                consoleWrite("<br>*** Set the user's preferred language to English, enable automatic caption selection.");
                run("internals.setUserPreferredLanguages(['en'])");
                run("internals.setCaptionDisplayMode('AlwaysOn')");
                window.setTimeout(function() { showMenu(startTest) }, 100);
            }

            function start()
            {
                findMediaElement();
                video.src = findMediaFile('video', 'content/test');
                setCaptionDisplayMode('Automatic');

                waitForEvent('canplaythrough', canplaythrough);
            }
        </script>
    </head>

    <body onload="start()">
        <p>Test that we update the menu when the selected track changes.</p>
        <video width="500" height="300" controls>
            <track kind="captions" title="Commentary" src="track/captions-webvtt/captions-fast.vtt" srclang="es">
        </video>
    </body>
</html>

