<html>
    <head>
        <script src=media-file.js></script>
        <script src=video-test.js></script>
        <script>
            var state = 0;

            function playing()
            {
                run("internals.beginMediaSessionInterruption()");;
                setTimeout(checkState, 100);
            }

            function checkState()
            {
                consoleWrite("<br>100ms timer fired...");
                testExpected("video.paused", true);
                switch (state) {
                case "interrupted":
                    state = "resuming";
                    setTimeout(checkState, 100);
                    run("internals.endMediaSessionInterruption('')");
                    break;
                case "resuming":
                    consoleWrite("");
                    endTest();
                    break;
                }
            }

            function canplaythrough()
            {
                state = "interrupted";
                run("video.play()");
                consoleWrite("");
            }

            function start()
            {
                if (!window.internals) {
                    failTest('This test requires window.internals.');
                    return;
                }

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

    <body onload="start()">
        <video controls ></video>
        <p>Test that playback is paused by an interruption, and that ending the interruption does automatically resume playback.</p>
    </body>
</html>
