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

Unified Diff: third_party/WebKit/Source/core/input/ScrollManager.h

Issue 2010133003: Add ScrollManager class (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Adding TODOs Created 4 years, 7 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: third_party/WebKit/Source/core/input/ScrollManager.h
diff --git a/third_party/WebKit/Source/core/input/ScrollManager.h b/third_party/WebKit/Source/core/input/ScrollManager.h
new file mode 100644
index 0000000000000000000000000000000000000000..0d7394fd4908fd6afa809f189994802755d0827f
--- /dev/null
+++ b/third_party/WebKit/Source/core/input/ScrollManager.h
@@ -0,0 +1,176 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ScrollManager_h
+#define ScrollManager_h
+
+#include "core/CoreExport.h"
+#include "core/page/EventWithHitTestResults.h"
+#include "platform/PlatformEvent.h"
+#include "platform/geometry/LayoutSize.h"
+#include "platform/heap/Handle.h"
+#include "platform/heap/Visitor.h"
+#include "platform/scroll/ScrollTypes.h"
+#include "public/platform/WebInputEventResult.h"
+#include "wtf/Allocator.h"
+#include <deque>
+
+namespace blink {
+
+class AutoscrollController;
+class FloatPoint;
+class FrameHost;
+class LayoutBox;
+class LayoutObject;
+class LocalFrame;
+class PaintLayer;
+class PaintLayerScrollableArea;
+class PlatformGestureEvent;
+class Scrollbar;
+class ScrollState;
+
+// This class takes care of scrolling and resizing and the related states. The
+// user action that causes scrolling or resizing is determined in other *Manager
+// classes and they call into this class for doing the work.
+class CORE_EXPORT ScrollManager {
+ WTF_MAKE_NONCOPYABLE(ScrollManager);
+ DISALLOW_NEW();
+public:
+ explicit ScrollManager(LocalFrame*);
+ ~ScrollManager();
+ DECLARE_TRACE();
+
+ void clear();
+
+ bool panScrollInProgress() const;
+ AutoscrollController* autoscrollController() const;
+ void stopAutoscroll();
+
+ // Performs a chaining scroll, within a *single* frame, starting from a
+ // given node and optionally stopping on a given node.
+ // granularity - The units that the scroll delta parameter is in.
+ // delta - The delta to scroll by, in the units of the granularity param
+ // (e.g. pixels, lines, pages, etc.). These are in a physical
+ // direction. i.e. Positive is down and right.
+ // position - Where the scroll originated from (e.g. touch location).
+ // velocity - The velocity of the scroll in the case of fling gestures.
+ // startNode - The node to start the scroll chaining from.
+ // stopNode - On input, if non-null, the node at which we should stop
+ // chaining. On output, if provided and a node was scrolled,
+ // stopNode will point to that node.
+ // consumed - [OUT] Whether the scroll was consumed. This is different than
+ // ScrollResult.didScroll since we might not have scrolled but
+ // have reached the stopNode and thus don't want to continue
+ // chaining the scroll.
+ ScrollResult physicalScroll(
+ ScrollGranularity,
+ const FloatSize& delta,
+ const FloatPoint& position,
+ const FloatSize& velocity,
+ Node* startNode,
+ Node** stopNode,
+ bool* consumed);
+
+ // Performs a chaining logical scroll, within a *single* frame, starting
+ // from either a provided starting node or a default based on the focused or
+ // most recently clicked node, falling back to the frame.
+ // Returns true if the scroll was consumed.
+ // direction - The logical direction to scroll in. This will be converted to
+ // a physical direction for each LayoutBox we try to scroll
+ // based on that box's writing mode.
+ // granularity - The units that the scroll delta parameter is in.
+ // startNode - Optional. If provided, start chaining from the given node.
+ // If not, use the current focus or last clicked node.
+ bool logicalScroll(ScrollDirection, ScrollGranularity, Node* startNode, Node* mousePressNode);
+
+ // Performs a logical scroll that chains, crossing frames, starting from
+ // the given node or a reasonable default (focus/last clicked).
+ bool bubblingScroll(ScrollDirection, ScrollGranularity, Node* startingNode, Node* mousePressNode);
+
+ void setFrameWasScrolledByUser();
+
+
+ // TODO(crbug.com/616491): Consider moving all gesture related functions to
+ // another class.
+
+ // Handle the provided scroll gesture event, propagating down to child frames as necessary.
+ WebInputEventResult handleGestureScrollEvent(const PlatformGestureEvent&);
+
+ WebInputEventResult handleGestureScrollEnd(const PlatformGestureEvent&);
+
+ bool isScrollbarHandlingGestures() const;
+
+ // Returns true if the gesture event should be handled in ScrollManager.
+ bool canHandleGestureEvent(const GestureEventWithHitTestResults&);
+
+ // These functions are related to |m_resizeScrollableArea|.
+ bool inResizeMode() const;
+ void resize(const PlatformEvent&);
+ // Clears |m_resizeScrollableArea|. if |shouldNotBeNull| is true this
+ // function DCHECKs to make sure that variable is indeed not null.
+ void clearResizeScrollableArea(bool shouldNotBeNull);
+ void setResizeScrollableArea(PaintLayer*, IntPoint);
+
+private:
+
+ WebInputEventResult handleGestureScrollUpdate(const PlatformGestureEvent&);
+ WebInputEventResult handleGestureScrollBegin(const PlatformGestureEvent&);
+
+ WebInputEventResult passScrollGestureEventToWidget(const PlatformGestureEvent&, LayoutObject*);
+
+ void clearGestureScrollState();
+
+ void customizedScroll(const Node& startNode, ScrollState&);
+
+ ScrollResult scrollBox(
+ LayoutBox*,
+ ScrollGranularity,
+ const FloatSize& delta,
+ const FloatPoint& position,
+ const FloatSize& velocity,
+ bool* wasRootScroller);
+
+ FrameHost* frameHost() const;
+
+ bool isRootScroller(const Node&) const;
+
+ bool handleScrollGestureOnResizer(Node*, const PlatformGestureEvent&);
+
+
+ // NOTE: If adding a new field to this class please ensure that it is
+ // cleared in |ScrollManager::clear()|.
+
+ const Member<LocalFrame> m_frame;
+
+ // Only used with the ScrollCustomization runtime enabled feature.
+ std::deque<int> m_currentScrollChain;
+
+ Member<Node> m_scrollGestureHandlingNode;
+
+ bool m_lastGestureScrollOverWidget;
+
+ // The most recent element to scroll natively during this scroll
+ // sequence. Null if no native element has scrolled this scroll
+ // sequence, or if the most recent element to scroll used scroll
+ // customization.
+ Member<Node> m_previousGestureScrolledNode;
+
+ // True iff some of the delta has been consumed for the current
+ // scroll sequence in this frame, or any child frames. Only used
+ // with ScrollCustomization. If some delta has been consumed, a
+ // scroll which shouldn't propagate can't cause any element to
+ // scroll other than the |m_previousGestureScrolledNode|.
+ bool m_deltaConsumedForScrollSequence;
+
+ Member<Scrollbar> m_scrollbarHandlingScrollGesture;
+
+ Member<PaintLayerScrollableArea> m_resizeScrollableArea;
+
+ LayoutSize m_offsetFromResizeCorner; // In the coords of m_resizeScrollableArea.
+
+};
+
+} // namespace blink
+
+#endif // ScrollManager_h
« no previous file with comments | « third_party/WebKit/Source/core/input/EventHandler.cpp ('k') | third_party/WebKit/Source/core/input/ScrollManager.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698