<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
<head>
    <title>Test rendering of volume slider of video tag</title>
    <script src=media-file.js></script>
    <script src=media-controls.js></script>
    <script>
        var video;

        function init()
        {
            if (window.testRunner)
                testRunner.waitUntilDone();

            internals.suspendAnimations(); // Volumebar can be animated and we would need a timeout to have it shown.

            video = document.getElementsByTagName("video")[0];
            video.src = findMediaFile("video", "content/test");
        }

        function test()
        {
            video.volume = 0.7;

            if (window.eventSender) {
                var muteCoords;
                try {
                    muteCoords = mediaControlsButtonCoordinates(video, "mute-button");
                } catch (exception) {
                    testRunner.notifyDone();
                    return;
                }
                eventSender.mouseMoveTo(muteCoords[0], muteCoords[1]);
            }

            video.addEventListener("volumechange", function() {
                 if (window.testRunner)
                     testRunner.notifyDone();
            });
        }
    </script>
</head>
<body onload="init()">
    Tests if the volume slider is rendererd properly. This test assumes the<br>
    volume slider is implemented and mouse over the right bottom corner of<br>
    video element will show the volume slider.<br>
    <video oncanplaythrough="test()" controls></video>
</body>
</html>
