<!DOCTYPE html><!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
    <head>
        <script src="../media-file.js"></script>
        <script src="controls-test-helpers.js"></script>
        <script>
            var maxAttemptsToTestPlaceholderVisibility = 10;
            var attemptsToTestPlaceholderVisibility = 0;

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

            const tester = new ControlsTest("non-existent-media-file", "error")
                .whenReady(runTestsWithoutVideo)
                .start();

            function runTestsWithoutVideo()
            {
                const currentState = tester.currentState;
                tester.test("We are using the apple idiom")
                    .value(currentState.idiom)
                    .isEqualTo("apple");

                tester.startNewSection("Test the picture-in-picture button without video", true);

                const stateForPictureInPictureButton = tester.stateForControlsElement("Picture-in-picture Button");
                tester.test("Picture-in-picture button should not be visible if there's no video")
                    .value(stateForPictureInPictureButton.className)
                    .contains("hidden");

                tester.resetEventTrigger("canplaythrough")
                    .whenReady(runTestsWithVideo)
                    .media.src = findMediaFile("video", "../content/test");
            }

            function runTestsWithVideo()
            {
                tester.startNewSection("Test the picture-in-picture button with valid video");

                const stateForPictureInPictureButton = tester.stateForControlsElement("Picture-in-picture Button", true);
                tester.test("Picture-in-picture button should be visible if there's video")
                    .value(stateForPictureInPictureButton.className)
                    .doesNotContain("hidden");

                tester.test("Picture-in-picture button should be in the dom if there's video")
                    .value(stateForPictureInPictureButton.parentElement)
                    .isNotEqualTo(undefined);

                const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true);
                tester.test("Inline placeholder should not be visible at this point")
                    .value(stateForPlaceholder.className)
                    .contains("hidden");

                internals.setMediaElementRestrictions(tester.media, "NoRestrictions");
                tester.resetEventTrigger("webkitpresentationmodechanged")
                    .whenReady(testPIPPlaceholder)
                    .media.webkitSetPresentationMode("picture-in-picture");
            }

            function testPIPPlaceholder()
            {
                tester.startNewSection("Test for the pip placeholder visibility in pip mode");

                tester.test("Should be in pip mode")
                    .value(tester.media.webkitPresentationMode)
                    .isEqualTo("picture-in-picture");

                pollPIPPlaceholderVisibilityChange();
            }

            function pollPIPPlaceholderVisibilityChange()
            {
                const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true);
                if (stateForPlaceholder.className.indexOf("hidden") >= 0) {
                    if (attemptsToTestPlaceholderVisibility > maxAttemptsToTestPlaceholderVisibility) {
                        tester.logFailure("Inline placeholder did not become visible after video enters picture-in-picture.");
                        tester.end();
                        return;
                    }

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

                tester.test("Inline placeholder should be visible at this point")
                    .value(stateForPlaceholder.className)
                    .doesNotContain("hidden");

                const controlsObserver = new MutationObserver(controlsDidChange);
                controlsObserver.observe(tester.media, { attributes: true, attributeFilter: ['controls'] });

                tester.media.removeAttribute('controls');
            }

            function controlsDidChange()
            {
                tester.startNewSection("Test for the pip placeholder visibility in pip mode without a 'controls' attribute");

                tester.test("Should still be in pip mode")
                    .value(tester.media.webkitPresentationMode)
                    .isEqualTo("picture-in-picture");

                tester.test("No controls attribute")
                    .value(tester.media.hasAttribute('controls'))
                    .isFalse();

                const stateForPlaceholder = tester.stateForControlsElement("Inline playback placeholder", true);
                tester.test("Inline placeholder should still be visible")
                    .value(stateForPlaceholder.className)
                    .doesNotContain("hidden");

                tester.media.webkitSetPresentationMode("inline");

                tester.end();
            }
        </script>
    </head>
    <body>
        <p>This tests the picture-in-picture button.</p>
        <p>This test only runs in DRT!</p>
        <video controls></video>
    </body>
</html>
