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

Unified Diff: Source/core/frame/LocalFrame.cpp

Issue 988823003: Use scroll customization primitives for touch scrolling (behind REF). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix nullptr dereference. Created 5 years, 9 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/frame/LocalFrame.cpp
diff --git a/Source/core/frame/LocalFrame.cpp b/Source/core/frame/LocalFrame.cpp
index 28169539cf8a328a7f762123976014824720c0af..48c35439e68842bb8e8140f3d83f0e306127f3ff 100644
--- a/Source/core/frame/LocalFrame.cpp
+++ b/Source/core/frame/LocalFrame.cpp
@@ -765,6 +765,55 @@ void LocalFrame::removeSpellingMarkersUnderWords(const Vector<String>& words)
spellChecker().removeSpellingMarkersUnderWords(words);
}
+static bool scrollAreaOnBothAxes(const FloatSize& delta, ScrollableArea& view)
+{
+ bool scrolledHorizontal = view.scroll(ScrollLeft, ScrollByPrecisePixel, delta.width());
+ bool scrolledVertical = view.scroll(ScrollUp, ScrollByPrecisePixel, delta.height());
+ return scrolledHorizontal || scrolledVertical;
Rick Byers 2015/03/11 02:22:18 again, don't you need to handle these two cases se
tdresser 2015/03/20 18:00:36 This doesn't change any behavior, see https://cod
Rick Byers 2015/03/26 21:22:49 Ok, SGTM - thanks.
+}
+
+// Returns true if a scroll occurred.
+bool LocalFrame::applyScrollDelta(const FloatSize& delta, bool isScrollBegin)
+{
+ if (isScrollBegin)
+ host()->topControls().scrollBegin();
+
+ if (!view() || delta.isZero())
+ return false;
+
+ FloatSize remainingDelta = delta;
+
+ // If this is main frame, allow top controls to scroll first and update
+ // |remainingDelta| accordingly
+ bool giveToTopControls = false;
+ if (isMainFrame()) {
+ // Always give the delta to the top controls if the scroll is in
+ // the direction to show the top controls. If it's in the
+ // direction to hide the top controls, only give the delta to the
+ // top controls when the frame can scroll.
+ giveToTopControls = remainingDelta.height() > 0
+ || view()->scrollPosition().y() < view()->maximumScrollPosition().y();
+ }
+
+ if (giveToTopControls)
+ remainingDelta = host()->topControls().scrollBy(remainingDelta);
+
+ if (remainingDelta.isZero())
+ return true;
+
+ if (scrollAreaOnBothAxes(remainingDelta, *view()))
+ return true;
+
+ // If this is the main frame and it didn't scroll, propagate up to the pinch viewport.
+ if (!settings()->pinchVirtualViewportEnabled() || !isMainFrame())
+ return false;
+
+ if (scrollAreaOnBothAxes(remainingDelta, page()->frameHost().pinchViewport()))
+ return true;
+
+ return false;
+}
+
#if ENABLE(OILPAN)
void LocalFrame::registerPluginElement(HTMLPlugInElement* plugin)
{

Powered by Google App Engine
This is Rietveld 408576698