157void EventDispatcher::dispatchWheelEvent(Node* node, PlatformWheelEvent& e)
158{
159 ASSERT(!eventDispatchForbidden());
160 if (!(e.deltaX() || e.deltaY()))
161 return;
162
163 EventDispatcher dispatcher(node);
164
165 if (!dispatcher.m_view)
166 return;
167
168 IntPoint pos = dispatcher.m_view->windowToContents(e.pos());
169
170 int adjustedPageX = pos.x();
171 int adjustedPageY = pos.y();
172 if (Frame* frame = node->document()->frame()) {
173 float pageZoom = frame->pageZoomFactor();
174 if (pageZoom != 1.0f) {
175 // Adjust our pageX and pageY to account for the page zoom.
176 adjustedPageX = lroundf(pos.x() / pageZoom);
177 adjustedPageY = lroundf(pos.y() / pageZoom);
178 }
179 }
180
181 WheelEvent::Granularity granularity;
182 switch (e.granularity()) {
183 case ScrollByPageWheelEvent:
184 granularity = WheelEvent::Page;
185 break;
186 case ScrollByPixelWheelEvent:
187 default:
188 granularity = WheelEvent::Pixel;
189 break;
190 }
191
192 RefPtr<WheelEvent> we = WheelEvent::create(e.wheelTicksX(), e.wheelTicksY(), e.deltaX(), e.deltaY(), granularity,
193 node->document()->defaultView(), e.globalX(), e.globalY(), adjustedPageX, adjustedPageY,
194 e.ctrlKey(), e.altKey(), e.shiftKey(), e.metaKey());
195
196 we->setAbsoluteLocation(IntPoint(pos.x(), pos.y()));
197
198 if (!dispatcher.dispatchEvent(we) || we->defaultHandled())
199 e.accept();
200
201 we.release();
202}
203