| // 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 |
| : public GarbageCollectedFinalized<ScrollManager> { |
| WTF_MAKE_NONCOPYABLE(ScrollManager); |
| |
| public: |
| explicit ScrollManager(LocalFrame*); |
| DECLARE_TRACE(); |
| |
| void clear(); |
| |
| bool middleClickAutoscrollInProgress() const; |
| AutoscrollController* autoscrollController() const; |
| void stopAutoscroll(); |
| |
| // 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&); |
| |
| FrameHost* frameHost() const; |
| |
| bool isEffectiveRootScroller(const Node&) const; |
| |
| bool handleScrollGestureOnResizer(Node*, const PlatformGestureEvent&); |
| |
| void recomputeScrollChain(const Node& startNode, |
| std::deque<int>& scrollChain); |
| |
| // 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 |