<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
        <script>
            var givenScrollTop = 2; // Only one page per event, so this should be interpreted as 1
            var givenScrollLeft = 2;
            var expectedScrollTop = 511; // Window is 800x600. 15 pixel scrollbars. Scroll 87.5% of visible.
            var expectedScrollLeft = 686;
            var event;
            var div;

            if (window.testRunner)
                testRunner.waitUntilDone();

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

                if (window.eventSender) {
                    eventSender.mouseMoveTo(100, 110);
                    eventSender.continuousMouseScrollBy(-window.givenScrollLeft, -window.givenScrollTop, true);
                }

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

            function checkOffsets()
            {
                shouldBe("document.body.scrollTop", "window.expectedScrollTop");
                shouldBe("document.body.scrollLeft", "window.expectedScrollLeft");

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

            function mousewheelHandler(e)
            {
                event = e;
                shouldBe("event.wheelDeltaY", "window.givenScrollTop * -3");
                shouldBe("event.wheelDeltaX", "window.givenScrollLeft * -3");

                if (e.wheelDeltaY)
                    shouldBe("event.wheelDelta", "window.givenScrollTop * -3");
                else
                    shouldBe("event.wheelDelta", "window.givenScrollLeft * -3");
            }
        </script>
    </head>

    <body style="margin:0" onload="setTimeout('dispatchWheelEvent();', 100)">
        <div style="height:900px;width:2400px">
          <div style="background-color:red;height:900px;width:1200px;position:relative;left:0px;top:0px"></div>
          <div style="background-color:green;height:900px;width:1200px;position:relative;left:1200px;top:-900px"></div>
        </div>
        <div style="height:900px;width:2400px">
          <div style="background-color:blue;height:900px;width:1200px;position:relative;left:0px;top:0px"></div>
          <div style="background-color:yellow;height:900px;width:1200px;position:relative;left:1200px;top:-900px"></div>
        </div>
        <div id="console"></div>
    </body>
</html>
