
<html>
    <head>
        <!-- LayoutTests location is hard-coded to avoid duplication of code. -->
        <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/video-test.js"></script>

        <script>
            var expectedRates = { "defaultPlaybackRate" : 1, "playbackRate" : 1};
            var playingFromScript = false;
            var changedRate = false;

            function absoluteUrl(url)
            {
                var a = document.createElement('a');
                a.href = url;
                return a.href;
            }

            function testRates()
            {
                consoleWrite("");
                var playWithControllerButton = !changedRate && !playingFromScript;
                testExpected("video.playbackRate", playWithControllerButton ? expectedRates['defaultPlaybackRate'] : expectedRates['playbackRate']);
                testExpected("video.defaultPlaybackRate", expectedRates['defaultPlaybackRate']);
                changedRate = false;
            }

            function playing()
            {
                consoleWrite("<br>'playing' event");
                expectedRates['playbackRate'] = playingFromScript ? video.playbackRate : video.defaultPlaybackRate;
                testRates();
                playingFromScript = false;
            }

            function ratechange()
            {
                consoleWrite("<br>'ratechange' event");
                testRates();
            }

            function start()
            {
                findMediaElement();
                video.addEventListener('ratechange', ratechange);
                video.addEventListener('playing', playing);

                // Use the video file from the svn repository to avoid duplicating the file.
                video.src = absoluteUrl('http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content/test.ogv');
                testRates();
            }

            function play()
            {
                playingFromScript = true;
                video.play();
            }

            function setRate(which, rate)
            {
                changedRate = true;
                video[which] = rate;
                expectedRates[which] = rate;
            }

        </script>
    </head>

    <body onload="start()">

        <video controls > </video>
        <ul>
            <li>The current 'playbackRate' and 'defaultPlaybackRate' should be logged every time either changes.</li>
            <li>'playbackRate' should be set to 'defaultPlaybackRate' when the Play button in the built-in controls is pressed</li>
            <li>'playbackRate' should NOT when play() is called from script.</li>
        </ul>
        <div>
            <button id="controls" onclick="setRate('defaultPlaybackRate', 2)">defaultPlaybackRate = 2</button>
            <button id="controls" onclick="setRate('defaultPlaybackRate', 1)">defaultPlaybackRate = 1</button>
            <button id="controls" onclick="setRate('playbackRate', 2)">playbackRate = 2</button>
            <button id="controls" onclick="setRate('playbackRate', 1)">playbackRate = 1</button>
        </div>
        <div>
            <button id="controls" onclick="play()">play()</button>
            <button id="controls" onclick="video.pause()">pause()</button>
        </div>
        <br>
    </body>
</html>
