| 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
|
|
|