Chromium Code Reviews| Index: Source/core/input/EventHandler.cpp |
| diff --git a/Source/core/input/EventHandler.cpp b/Source/core/input/EventHandler.cpp |
| index 006aa2c40a9b7a45bfea777b122a31c3acd2a0e9..e92ad2c581da3358c3deb0c7956016ee411ed622 100644 |
| --- a/Source/core/input/EventHandler.cpp |
| +++ b/Source/core/input/EventHandler.cpp |
| @@ -1716,6 +1716,44 @@ bool EventHandler::slideFocusOnShadowHostIfNecessary(const Element& element) |
| return false; |
| } |
| +namespace { |
| + |
| +ScrollResult scrollAreaWithWheelEvent(const PlatformWheelEvent& event, ScrollableArea& scrollableArea) |
| +{ |
| + float deltaX = event.railsMode() != PlatformEvent::RailsModeVertical ? event.deltaX() : 0; |
| + float deltaY = event.railsMode() != PlatformEvent::RailsModeHorizontal ? event.deltaY() : 0; |
| + |
| + ScrollGranularity granularity = |
| + event.granularity() == ScrollByPixelWheelEvent ? ScrollByPixel : ScrollByPage; |
| + |
| +#if !OS(MACOSX) |
| + if (event.hasPreciseScrollingDeltas() && granularity == ScrollByPixel) |
| + granularity = ScrollByPrecisePixel; |
|
Rick Byers
2015/08/19 17:33:31
why do we need this? Should be handled up in chro
bokan
2015/08/19 18:45:46
I don't understand this well but I moved it from S
|
| +#endif |
| + |
| + // If the event is a "PageWheelEvent" we should disregard the delta and |
| + // scroll by *one* page length per event. |
| + if (event.granularity() == ScrollByPageWheelEvent) { |
| + if (deltaX) |
| + deltaX = deltaX > 0 ? 1 : -1; |
| + if (deltaY) |
| + deltaY = deltaY > 0 ? 1 : -1; |
| + } |
| + |
| + // Positive delta is up and left. |
| + ScrollResultOneDimensional resultY = scrollableArea.userScroll(ScrollUp, granularity, deltaY); |
| + ScrollResultOneDimensional resultX = scrollableArea.userScroll(ScrollLeft, granularity, deltaX); |
| + |
| + ScrollResult result; |
| + result.didScrollY = resultY.didScroll; |
| + result.didScrollX = resultX.didScroll; |
| + result.unusedScrollDeltaY = resultY.unusedScrollDelta; |
| + result.unusedScrollDeltaX = resultX.unusedScrollDelta; |
| + return result; |
| +} |
| + |
| +} // namespace |
| + |
| bool EventHandler::handleWheelEvent(const PlatformWheelEvent& event) |
| { |
| #define RETURN_WHEEL_EVENT_HANDLED() \ |
| @@ -1773,7 +1811,11 @@ bool EventHandler::handleWheelEvent(const PlatformWheelEvent& event) |
| if (!view) |
| return false; |
| - ScrollResult scrollResult = view->scrollableArea()->handleWheel(event); |
| + // Wheel events which do not scroll are used to trigger zooming. |
| + if (!event.canScroll()) |
| + return false; |
| + |
| + ScrollResult scrollResult = scrollAreaWithWheelEvent(event, *view->scrollableArea()); |
| if (m_frame->settings() && m_frame->settings()->reportWheelOverscroll()) |
| handleOverscroll(scrollResult); |
| if (scrollResult.didScroll()) |