Commit c517903e authored by nzolghadr's avatar nzolghadr Committed by Commit bot

Add ScrollManager class

Extract scrolling and resizing related logic
from EventHandler and put it in a dedicated
class.

BUG=615079

Review-Url: https://codereview.chromium.org/2010133003
Cr-Commit-Position: refs/heads/master@{#397485}
parent db346b18
......@@ -2804,6 +2804,8 @@
'input/InputDeviceCapabilities.h',
'input/PointerEventManager.cpp',
'input/PointerEventManager.h',
'input/ScrollManager.cpp',
'input/ScrollManager.h',
'input/TouchActionUtil.cpp',
'input/TouchActionUtil.h',
'input/TouchEventManager.cpp',
......
......@@ -29,6 +29,7 @@
#include "core/CoreExport.h"
#include "core/events/TextEventInputType.h"
#include "core/input/PointerEventManager.h"
#include "core/input/ScrollManager.h"
#include "core/layout/HitTestRequest.h"
#include "core/page/DragActions.h"
#include "core/page/EventWithHitTestResults.h"
......@@ -47,14 +48,11 @@
#include "wtf/HashMap.h"
#include "wtf/HashTraits.h"
#include "wtf/RefPtr.h"
#include <deque>
namespace blink {
class AutoscrollController;
class DataTransfer;
class PaintLayer;
class PaintLayerScrollableArea;
class Document;
class DragState;
class Element;
......@@ -79,7 +77,6 @@ class PlatformTouchEvent;
class PlatformWheelEvent;
class ScrollableArea;
class Scrollbar;
class ScrollState;
class SelectionController;
class TextEvent;
class WheelEvent;
......@@ -104,6 +101,11 @@ public:
void startPanScrolling(LayoutObject*);
#endif
// TODO(nzolghadr): Some of the APIs in this class only forward the action
// to the corresponding Manager class. We need to investigate whether it is
// better to expose the manager instance itself later or can the access to
// those APIs be more limited or removed.
void stopAutoscroll();
void dispatchFakeMouseMoveEventSoon();
......@@ -235,9 +237,6 @@ private:
WebInputEventResult handleGestureTap(const GestureEventWithHitTestResults&);
WebInputEventResult handleGestureLongPress(const GestureEventWithHitTestResults&);
WebInputEventResult handleGestureLongTap(const GestureEventWithHitTestResults&);
WebInputEventResult handleGestureScrollUpdate(const PlatformGestureEvent&);
WebInputEventResult handleGestureScrollBegin(const PlatformGestureEvent&);
void clearGestureScrollState();
void updateGestureTargetNodeForMouseEvent(const GestureEventWithHitTestResults&);
......@@ -257,54 +256,6 @@ private:
ScrollableArea* associatedScrollableArea(const PaintLayer*) const;
// 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 = nullptr);
ScrollResult scrollBox(
LayoutBox*,
ScrollGranularity,
const FloatSize& delta,
const FloatPoint& position,
const FloatSize& velocity,
bool* wasRootScroller);
bool isRootScroller(const Node&) const;
void customizedScroll(const Node& startNode, ScrollState&);
void invalidateClick();
Node* updateMouseEventTargetNode(Node*, const PlatformMouseEvent&);
......@@ -349,18 +300,10 @@ private:
void updateLastScrollbarUnderMouse(Scrollbar*, bool);
void setFrameWasScrolledByUser();
bool capturesDragging() const { return m_capturesDragging; }
WebInputEventResult handleGestureShowPress();
bool handleScrollGestureOnResizer(Node*, const PlatformGestureEvent&);
WebInputEventResult passScrollGestureEventToWidget(const PlatformGestureEvent&, LayoutObject*);
AutoscrollController* autoscrollController() const;
bool panScrollInProgress() const;
void setLastKnownMousePosition(const PlatformMouseEvent&);
bool shouldTopControlsConsumeScroll(FloatSize) const;
......@@ -401,8 +344,6 @@ private:
bool m_svgPan;
Member<PaintLayerScrollableArea> m_resizeScrollableArea;
Member<Node> m_capturingMouseEventsNode;
bool m_eventHandlerWillResetCapturingMouseEventsNode;
......@@ -420,8 +361,6 @@ private:
Member<HTMLFrameSetElement> m_frameSetBeingResized;
LayoutSize m_offsetFromResizeCorner; // In the coords of m_resizeScrollableArea.
bool m_mousePositionIsUnknown;
// The last mouse movement position this frame has seen in root frame coordinates.
IntPoint m_lastKnownMousePosition;
......@@ -432,15 +371,7 @@ private:
RefPtr<UserGestureToken> m_lastMouseDownUserGestureToken;
PointerEventManager m_pointerEventManager;
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;
Member<Scrollbar> m_scrollbarHandlingScrollGesture;
ScrollManager m_scrollManager;
double m_maxMouseMovedDuration;
......@@ -449,15 +380,6 @@ private:
Timer<EventHandler> m_activeIntervalTimer;
double m_lastShowPressTimestamp;
Member<Element> m_lastDeferredTapElement;
// Only used with the ScrollCustomization runtime enabled feature.
std::deque<int> m_currentScrollChain;
// 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;
};
} // namespace blink
......
This diff is collapsed.
// 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment