Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index 1aa320260c4a78fca50d761c17db32e99e3a9f38..f4e20864fbdca418572eeb632e8139e9a4382d0d 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,22 @@ 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; |
+ |
+ if (delta.isZero()) |
+ return consumed; |
+ } |
+ |
// Try to scroll the frame view. |
FrameView* view = m_frame->view(); |
if (!view) |
- return false; |
+ return consumed; |
if (scrollAreaOnBothAxes(delta, *view)) { |
setFrameWasScrolledByUser(); |
@@ -2549,14 +2564,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 +3923,18 @@ 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 it's in the direction to hide the top controls, only consume when the frame can also scroll. |
+ if (m_frame->view()->scrollPosition().y() < m_frame->view()->maximumScrollPosition().y()) |
+ return true; |
+ |
+ return false; |
+} |
+ |
+ |
} // namespace blink |