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..7c9044c3cb68d00d15eaab82f8de3322e4f9ec4a 100644 |
| --- a/Source/core/input/EventHandler.cpp |
| +++ b/Source/core/input/EventHandler.cpp |
| @@ -1716,6 +1716,43 @@ 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; |
| + |
| + // TODO(bokan): This should be moved out into Chromium or removed if possible. |
|
Rick Byers
2015/08/25 18:09:58
nit: now that the #if is gone, do you still even w
bokan
2015/08/25 18:13:45
Yah, I suppose it'd be cleaner to just have a "Pre
|
| + if (event.hasPreciseScrollingDeltas() && granularity == ScrollByPixel) |
| + granularity = ScrollByPrecisePixel; |
| + |
| + // 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 +1810,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()) |