<html>
    <head>
        <script src="../../resources/js-test-pre.js"></script>
        <script>
            var expectedScrollTop = 200;
            var expectedScrollLeft = 100;
            var event;
            var div;

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

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

                    var wheelEvent = document.createEvent("WheelEvent");
                    wheelEvent.initWebKitWheelEvent(-window.expectedScrollLeft, -window.expectedScrollTop, window, 0, 0, 0, 0, false, false, false, false);
                    overflowElement.dispatchEvent(wheelEvent);
                }

                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.expectedScrollTop*-120");
                shouldBe("event.wheelDeltaX", "window.expectedScrollLeft*-120");

                if (e.wheelDeltaY)
                    shouldBe("event.wheelDelta", "window.expectedScrollTop*-120");
                else
                    shouldBe("event.wheelDelta", "window.expectedScrollLeft*-120");
            }
        </script>
    </head>

    <body style="margin:0" onload="setTimeout('dispatchWheelEvent();', 100)">
        <div id="overflow" style="border:2px solid black;overflow:auto;height:200px;width:200px;">
            <div style="background-color:red;height:200px;width:400px;"></div>
            <div style="background-color:green;height:200px;width:400px;"></div>
            <div style="background-color:red;height:200px;width:400px;"></div>
        </div>
        <div id="console"></div>
    </body>
</html>
