<!DOCTYPE html>
<html>
    <head>
        <title>Test dismissal of track menu when clicking anywhere in the page</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>
            var displayStyle;

            if (window.testRunner)
                testRunner.dumpAsText();

            function startTest()
            {
                testMenuIsVisible();
            }

            function testMenuIsVisible()
            {
                var trackListElement = getTrackListElement();
                displayStyle = window.getComputedStyle(trackListElement.parentNode).display;
                consoleWrite("*** Track menu should be visible " + displayStyle);
                testExpected("displayStyle", "block");
                // Now, click outside of the video to test that the track menu hides when clicking anywhere else.
                eventSender.mouseMoveTo(1, 1);
                eventSender.mouseDown();
                eventSender.mouseUp();
                testMenuIsInvisible();
            }

            function testMenuIsInvisible()
            {
                var trackListElement = getTrackListElement();
                displayStyle = window.getComputedStyle(trackListElement.parentNode).display;
                consoleWrite("*** Track menu should be invisible " + displayStyle);
                testExpected("displayStyle", "none");
                endTest();
            }

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

    <body onload="start()">
        <p>Test that we are able to trigger the list of captions, and then click elsewhere to hide it.</p>
        <video width="500" height="300" controls>
            <track kind="captions" src="track/captions-webvtt/captions-fast.vtt" srclang="en">
        </video>
    </body>
</html>

