<!-- webkit-test-runner [ enableModernMediaControls=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>

