<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
<head>
    <title>Click on placeholder on a MediaDocument should not pause.</title>
    <script src="media-file.js"></script>
    <script src="video-test.js"></script>
    <script src="media-controls.js"></script>
    <script>
        var mediaElement;
        var placeholder;
        var maxAttemptsToTestPlaceholderVisibility = 10;
        var attemptsToTestPlaceholderVisibility = 0;


        if (window.internals)
            window.internals.settings.setAllowsPictureInPictureMediaPlayback(true);

        function frameLoaded()
        {
            consoleWrite("Video frame loaded.");

            var standaloneMediaDocument = document.getElementById("videoframe").contentDocument;
            mediaElement = standaloneMediaDocument.querySelector("video");
            if (!mediaElement) {
                failTest("ERROR: Video element was not found in frameLoaded().");
                return;
            }

            runWithKeyDown(function(){ mediaElement.play(); });

            if (!('webkitSupportsPresentationMode' in mediaElement && 'webkitPresentationMode' in mediaElement)) {
                failTest("Presentation mode is not supported in this video element.")
                return;
            }

            consoleWrite("Going into Picture-in-Picture");
            mediaElement.addEventListener('webkitpresentationmodechanged', onpresentationmodechanged);
            runWithKeyDown(function(){ mediaElement.webkitSetPresentationMode('picture-in-picture'); });
        }

        function onpresentationmodechanged()
        {
            testExpected("mediaElement.webkitPresentationMode", "picture-in-picture");

            pollPIPPlaceholderVisibilityChange();
        }

        function pollPIPPlaceholderVisibilityChange()
        {
            placeholder = mediaControlsElement(internals.shadowRoot(mediaElement), '-webkit-media-controls-wireless-playback-status');

            if (placeholder.classList.contains('hidden')) {
                if (attemptsToTestPlaceholderVisibility > maxAttemptsToTestPlaceholderVisibility) {
                    failTest("Inline placeholder did not become visible after video enters picture-in-picture.");
                    endTest();
                    return;
                }

                // Use 33 to match PlaceholderPollingDelay in mediaControlsApple.js.
                setTimeout(pollPIPPlaceholderVisibilityChange, 33);
                attemptsToTestPlaceholderVisibility++;
                return;
            }

            testExpected("placeholder.classList.contains('hidden')", false);

            if (!window.eventSender) {
                failTest("ERROR: no event sender.");
                return;
            }

            var boundingRect = placeholder.getBoundingClientRect();
            var x = boundingRect.left + boundingRect.width / 2;
            var y = boundingRect.top + boundingRect.height / 2;
            eventSender.mouseMoveTo(x, y);
            eventSender.mouseDown();
            eventSender.mouseUp();

            testExpected("mediaElement.paused", false);
            endTest();
        }

    </script>
</head>
<body>
    <p>Click on placeholder on a MediaDocument should not pause.</p>
    <iframe id="videoframe" width=400 height=300"></iframe>
    <script type="text/javascript">
        onload = function() {
            var videoframe = document.getElementById("videoframe");
            videoframe.onload = frameLoaded;
            videoframe.src = findMediaFile("video", "content/test");
        }
    </script>

</body>
</html>

