Chromium Code Reviews| Index: Source/core/page/EventHandler.cpp |
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
| index 1aa320260c4a78fca50d761c17db32e99e3a9f38..d2855688c89191655ec5aa018be4be247e1e46bc 100644 |
| --- a/Source/core/page/EventHandler.cpp |
| +++ b/Source/core/page/EventHandler.cpp |
| @@ -2483,6 +2483,9 @@ bool EventHandler::handleGestureScrollBegin(const PlatformGestureEvent& gestureE |
| passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->renderer()); |
| + if (m_frame->isMainFrame()) |
| + m_frame->host()->topControls().scrollBegin(); |
| + |
| return true; |
| } |
| @@ -2537,10 +2540,19 @@ bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture |
| } |
| } |
| + // If this is main frame, allow top controls to scroll first and update |
| + // delta accordingly |
| + bool consumed = false; |
| + if (m_frame->isMainFrame() && shouldTopControlsConsumeScroll(delta)) { |
| + FloatSize excessDelta = m_frame->host()->topControls().scrollBy(delta); |
| + consumed = excessDelta != delta; |
| + delta = excessDelta; |
|
Rick Byers
2015/02/19 16:38:38
should we perhaps be returning early for the case
majidvp
2015/02/19 19:18:01
Done. Originally I didn't do this thinking that we
|
| + } |
| + |
| // Try to scroll the frame view. |
| FrameView* view = m_frame->view(); |
| if (!view) |
| - return false; |
| + return consumed; |
| if (scrollAreaOnBothAxes(delta, *view)) { |
| setFrameWasScrolledByUser(); |
| @@ -2549,14 +2561,14 @@ bool EventHandler::handleGestureScrollUpdate(const PlatformGestureEvent& gesture |
| // If this is the main frame and it didn't scroll, propagate up to the pinch viewport. |
| if (!m_frame->settings()->pinchVirtualViewportEnabled() || !m_frame->isMainFrame()) |
| - return false; |
| + return consumed; |
| - if (scrollAreaOnBothAxes(delta, m_frame->page()->frameHost().pinchViewport())) { |
| + if (scrollAreaOnBothAxes(delta, m_frame->host()->pinchViewport())) { |
| setFrameWasScrolledByUser(); |
| return true; |
| } |
| - return false; |
| + return consumed; |
| } |
| void EventHandler::clearGestureScrollNodes() |
| @@ -3908,4 +3920,17 @@ unsigned EventHandler::accessKeyModifiers() |
| #endif |
| } |
| +bool EventHandler::shouldTopControlsConsumeScroll(FloatSize scrollDelta) const |
| +{ |
| + // Always consume if it's in the direction to show the top controls. |
| + if (scrollDelta.height() > 0) |
| + return true; |
| + |
| + if (m_frame->view()->scrollPosition().y() < m_frame->view()->maximumScrollPosition().y()) |
|
Rick Byers
2015/02/19 16:38:38
I don't fully understand the intention here, can y
majidvp
2015/02/19 19:18:01
Note that this is only relevant when scrolling dow
Rick Byers
2015/02/21 02:39:10
Duh, sorry - I had the case inverted. Makes sense
|
| + return true; |
| + |
| + return false; |
| +} |
| + |
| + |
| } // namespace blink |