<!DOCTYPE html>
<html>
<head>
    <script src="../video-test.js"></script>
    <script src="../media-file.js"></script>
    <script type="text/javascript">
        var session, controls;

        function runTest() 
        {
            session = new MediaSession("content");
            controls = session.controls;
            controls.nextTrackEnabled = true;
            controls.previousTrackEnabled = true;
            waitForEvent('nexttrack', skipToNextTrack, false, true, controls);
            waitForEvent('previoustrack', skipToPreviousTrack, false, true, controls);

            findMediaElement();
            waitForEvent('canplaythrough', beginPlaying);
            video.src = findMediaFile("video", "../content/counting");
            video.session = session;
            waitForEvent('playing', beganPlaying, false, true, video);
        }

        function beginPlaying(event)
        {
            if (window.internals)
                testExpected('internals.mediaSessionCurrentState(session)', "idle");

            testExpected('video.paused', true);

            consoleWrite("Begin playing media.");
            video.play();
        }

        function beganPlaying(event)
        {
            consoleWrite("Media began playing.");
            testExpected('video.paused', false);

            if (window.internals) {
                testExpected('internals.mediaSessionCurrentState(session)', "active");

                consoleWrite("Sending Next Track media event.");
                run('internals.sendMediaControlEvent("next-track")');
            }
        }

        function skipToNextTrack(event)
        {
            consoleWrite("Sending Previous Track media event.");
            run('internals.sendMediaControlEvent("previous-track")');
        }

        function skipToPreviousTrack(event)
        {
            endTest();
        }
    </script>
</head>
<body onload="runTest()">
    <p>'Content' sessions that are active should respond to Previous/Next Track media control events.</p>
    <video id="video" />
</body>
</html>
