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 |