<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
<head>
    <title>Test rendering of video control after exiting fullscreen</title>
    <script src=media-file.js></script>
    <script src=media-controls.js></script>
    <script src=video-test.js></script>
    <script src=../fullscreen/full-screen-test.js></script>
    <script>
        var panel;
        var playButtonCoordinates;
        var fadeoutTime = 3500;
        var count = 0;

        function init()
        {
            findMediaElement();
            waitForEvent(video, 'canplaythrough', oncanplaythrough);
            video.src = findMediaFile('video', 'content/test');
        }

        function oncanplaythrough()
        {
            waitForEvent(video, 'webkitfullscreenchange', onfullscreenchange);

            panel = mediaControlsElement(internals.shadowRoot(video).firstChild, "-webkit-media-controls-panel");
            if (window.eventSender) {
                try {
                    playButtonCoordinates = mediaControlsButtonCoordinates(video, "play-button");
                } catch (exception) {
                    testRunner.notifyDone();
                    return;
                }
                var x = playButtonCoordinates[0];
                var y = playButtonCoordinates[1];

                consoleWrite("** Move mouse to the play button and start playing the video **");                     
                eventSender.mouseMoveTo(x, y);
                eventSender.mouseDown();
                eventSender.mouseUp();
                consoleWrite("");
            }

            consoleWrite("** Test that controls are shown when controls attribute is present **");
            var opacity = getComputedStyle(panel).opacity;
            if (opacity < 1)
                failTest("Media control is not opaque.");
            else
                runWithKeyDown(function(){ video.webkitRequestFullscreen(); });
        }

        function onfullscreenchange()
        {
            switch (count) {
                case 0:
                    setTimeout(continueTest, fadeoutTime);
                    break;
                case 1:
                    consoleWrite("");
                    consoleWrite("** The controls should be shown after exiting the fullscreen");
                    var opacity = getComputedStyle(panel).opacity;
                    if (opacity < 1)
                        failTest("Media control is not opaque.");
                    else
                        endTest();
            }
            count++;
        }

        function continueTest()
        {
            consoleWrite("");
            run("video.webkitExitFullScreen()");
        }

    </script>
</head>
<body onload="init()">
    Tests that video controls are shwon after exiting fullscreen<br>
    <video controls></video>
</body>
</html>

