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

