<html dir=rtl style="-webkit-writing-mode:vertical-lr">
    <head>
        <script src="../../resources/js-test-pre.js"></script>
        <script>

            function log(str)
            {
                var li = document.createElement("li");
                li.appendChild(document.createTextNode(str));
                var console = document.getElementById("console");
                console.appendChild(li);
            }
            
            if (window.testRunner) {
                testRunner.waitUntilDone();
            }

            function dispatchWheelEvent()
            {
                window.addEventListener("mousewheel", mousewheelHandler, false);

               window.scrollTo(100, -100);
               if (window.eventSender) {
                    eventSender.mouseMoveTo(100, 100);
                    eventSender.continuousMouseScrollBy(-10, 0);
                    eventSender.continuousMouseScrollBy(30, 0);
                    eventSender.continuousMouseScrollBy(0, -10);
                    eventSender.continuousMouseScrollBy(0, 30);
                }

                setTimeout('checkOffsets();', 100);
            }

            function checkOffsets()
            {
                log("window.scrollX: " + window.scrollX);
                log("window.scrollY: " + window.scrollY);

                if (window.testRunner)
                    window.testRunner.notifyDone();
            }

            function mousewheelHandler(e)
            {
            }
        </script>
    </head>

    <body style="margin:0" onload="setTimeout('dispatchWheelEvent();', 100)">

        <div id="div" style="whitespace:nowrap; width: 4000px; height: 1000px; border: 1px solid red;">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."</div>
        <div id="console"></div>
    </body>
</html>
