<!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=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("../content/test", "canplaythrough")
                .whenReady(runTestsWithVideo)
                .start();

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

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

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

                tester.media.removeEventListener("webkitpresentationmodechanged", tester, false);

                pollPIPPlaceholderVisibilityChange();
            }

            function pollPIPPlaceholderVisibilityChange()
            {
                // Intentionally using internals.shadowRoot instead of tester.stateForControlsElement()
                // since the latter has the side effect of ensuring the shadow root and hence injecting
                // the media controls script. The bug we are testing here is caused by the media controls
                // script not being injected early enough.
                var shadowRoot = internals.shadowRoot(tester.media);
                var placeholder = shadowRoot ? shadowRoot.querySelector("div[pseudo='-webkit-media-controls-wireless-playback-status']") : null;
                if (!placeholder || placeholder.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(placeholder.className)
                    .doesNotContain("hidden");

                tester.test("Inline placeholder should have the 'picture-in-picture' class")
                    .value(placeholder.className)
                    .contains("picture-in-picture");

                tester.media.webkitSetPresentationMode("inline");

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