<!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=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>
            if (window.testRunner)
                testRunner.dumpAsText();

            function startTest()
            {
                if (window.internals)
                    internals.suspendAnimations();

                // enable only the first audio track
                for (var i = 0; i < video.audioTracks.length; ++i)
                    video.audioTracks[i].enabled = (i == 0);

                showTrackMenu();
                window.setTimeout(testAudioTrackEnabled, 100);
            }

            function testMenu()
            {
                trackListItems = audioTrackMenuList();
                var expectedItemCount = video.audioTracks.length;
                consoleWrite("There should be " + expectedItemCount + " items in the menu.");
                testExpected("trackListItems.length", expectedItemCount);
            }

            function testAudioTrackEnabled()
            {
                trackListItems = audioTrackMenuList();
                consoleWrite("*** Menu item 0 should be selected");

                testExpected("trackListItems.length", 3);
                testExpected("trackListItems[0].classList.contains('selected')", true);
                testExpected("trackListItems[1].classList.contains('selected')", false);
                testExpected("trackListItems[2].classList.contains('selected')", false);

                window.setTimeout(selectDifferentAudioTrack, 100);
            }

            function selectDifferentAudioTrack()
            {
                consoleWrite("*** Selecting French Track");
                selectAudioTrackMenuItem("French");
                setTimeout(testAudioTrackDisabled, 100);
            }

            function testAudioTrackDisabled()
            {
                testExpected("video.audioTracks.length", 3);
                testExpected("video.audioTracks[0].enabled", false);
                testExpected("video.audioTracks[1].enabled", true);
                testExpected("video.audioTracks[2].enabled", false);
                endTest();
            }

            function start()
            {
                findMediaElement();
                video.src = findMediaFile('video', 'content/audio-tracks');
                waitForEvent('canplaythrough', startTest);
            }
        </script>
    </head>

    <body onload="start()">
        <p>Test that we are able to trigger the list of captions, and select from the list.</p>
        <video width="640" height="480" controls>
        </video>
    </body>
</html>

