<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
    <head>
        <title>Test that video play, pause and enterfullscreen does not work unless a user gesture is involved in playing a video</title>
        <script src=media-controls.js></script>
        <script src=media-file.js></script>
        <script src=video-test.js></script>
        <script>
            var userGestureInitiated = 0;
            if (window.internals) 
                window.internals.settings.setVideoPlaybackRequiresUserGesture(true);

            function playing()
            {
                if (userGestureInitiated == 0) {
                    failTest("Should not play without user gesture.");
                } else {
                    run("video.pause()");
                }
            }

            function pause()
            {
                testExpected("video.paused", true);
                // Now video.webkitEnterFullScreen() should no longer throw any exception.
                // However, the video element may not always enter fullscreen. For example,
                // chromium uses fullscreen API which still requires user gesture
                try {
                    run("video.webkitEnterFullScreen()");
                } catch(ex) {
                    failTest("video.webkitEnterFullScreen() still requires user gesture.");
                }
                endTest();
            }

            function canplaythrough()
            {
                consoleWrite("");
                consoleWrite("* No user gesture initiated");
                run("handlePromise(video.play())");
                testDOMException("video.webkitEnterFullScreen()", "DOMException.INVALID_STATE_ERR");
                testExpected("video.paused", true);
                consoleWrite("");

                consoleWrite("* User gesture initiated");
                userGestureInitiated = 1;
                try {
                    clickPlayButton(video);
                } catch (exception) {
                    failTest(exception.description);
                    return;
                }
            }

            function start()
            {
                 findMediaElement();
                 waitForEvent('canplaythrough', canplaythrough);
                 waitForEvent('playing', playing);
                 waitForEvent('pause', pause);
                 video.src = findMediaFile("video", "content/test");
            }
        </script>
    </head>

    <body onload="start()">
    <p>Test that video play(), pause() and webkitEnterFullScreen() should not work unless a user clicked on the play button.</p>
    <video controls></video>
    </body>
</html>
