<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
        <script>
            var givenScrollTop = 1;
            var givenScrollLeft = 2;
            var expectedScrollTop = 161;
            var expectedScrollLeft = 322;
            var event;
            var div;

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

            function dispatchWheelEvent()
            {
                var overflowElement = document.getElementById("overflow");
                if (overflowElement)
                    overflowElement.addEventListener("mousewheel", mousewheelHandler, false);

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

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

            function checkOffsets()
            {
                div = document.getElementById("overflow");
                shouldBe("div.scrollTop", "window.expectedScrollTop");
                shouldBe("div.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)">
         <!-- This div is 200 pixels high. The content results in scrool bars on
          both edges, resulting in an effective content area of 185 x 185 on
          linux. The paging context overlap is 24 pixels. So one page of scroll
          moves the content by 185 - 24 -= 161 pixels. -->
        <div id="overflow" style="border:2px solid black;overflow:auto;height:200px;width:200px;">
            <div style="height:300px;width:600px">
              <div style="background-color:red;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
              <div style="background-color:green;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
            </div>
            <div style="height:300px;width:600px">
              <div style="background-color:blue;height:300px;width:300px;position:relative;left:0px;top:0px"></div>
              <div style="background-color:yellow;height:300px;width:300px;position:relative;left:300px;top:-300px"></div>
            </div>
        </div>
        <div id="console"></div>
    </body>
</html>
