<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
        <script>
            var givenScrollTop = 0;
            var givenScrollLeft = 2;
            var expectedScrollTop = 0;
            var expectedScrollLeft = 0;
            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", "0");
				shouldBe("event.wheelDeltaX", "window.givenScrollLeft * -3");

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

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