<!DOCTYPE html>
<html>
<head>
    <title>Test pip video going into fullscreen should exit pip</title>
    <script src="media-file.js"></script>
    <script src="video-test.js"></script>
    <script>
        if (window.internals) {
            internals.settings.setAllowsPictureInPictureMediaPlayback(true);
            internals.setMockVideoPresentationModeEnabled(true);
        }

        var enteredFullscreen = false;
        var exitedPIP = false;

        function init()
        {
            findMediaElement();
            video.addEventListener('canplaythrough', oncanplaythrough);
            video.src = findMediaFile('video', 'content/test');
        }

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

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

        function onfirstpresentationmodechanged()
        {
            testExpected("video.webkitPresentationMode", "picture-in-picture");
            video.removeEventListener('webkitpresentationmodechanged', onfirstpresentationmodechanged);

            consoleWrite("Going into Full Screen from Picture-in-Picture");
            video.addEventListener('webkitfullscreenchange', onfullscreenchange);
            video.addEventListener('webkitpresentationmodechanged', onsecondpresentationmodechanged);
            runWithKeyDown(function(){ video.webkitRequestFullscreen(); });
        }

        function onfullscreenchange()
        {
            enteredFullscreen = true;
            if (exitedPIP)
                checkFinalState();
        }

        function onsecondpresentationmodechanged()
        {
            // We only expect one presentation mode change - from picture-in-picture to fullscreen.
            if (exitedPIP)
                failTest("Presentation mode changes more than once going into fullscreen from picture-in-picture.");

            exitedPIP = true;
            if (enteredFullscreen)
                checkFinalState();
        }

        function checkFinalState()
        {
            testExpected("document.webkitCurrentFullScreenElement", video);
            testExpected("video.webkitPresentationMode", "fullscreen");
            endTest();
        }

    </script>
</head>
<body onload="init()">
    Tests pip video going into fullscreen should exit pip<br>
    <video controls></video>
</body>
</html>

