Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(994)

Unified Diff: Source/core/page/EventHandler.cpp

Issue 893683003: Implement top controls show/hide functionality for main thread scrolling (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix minor macro issue Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698