
<html>
    <head>
        <!-- LayoutTests location is hard-coded to avoid duplication of code. -->
        <script src="http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/media-file.js"></script>
        <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(findMediaFile('video', 'http://svn.webkit.org/repository/webkit/trunk/LayoutTests/media/content/test'));
                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>
