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

            function playing()
            {
                run("internals.beginMediaSessionInterruption('System')");;
                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>
