OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MouseEventManager_h | 5 #ifndef MouseEventManager_h |
6 #define MouseEventManager_h | 6 #define MouseEventManager_h |
7 | 7 |
8 #include "core/CoreExport.h" | 8 #include "core/CoreExport.h" |
9 #include "core/frame/LocalFrame.h" | |
10 #include "core/input/BoundaryEventDispatcher.h" | 9 #include "core/input/BoundaryEventDispatcher.h" |
| 10 #include "core/page/DragActions.h" |
| 11 #include "core/page/EventWithHitTestResults.h" |
11 #include "platform/PlatformMouseEvent.h" | 12 #include "platform/PlatformMouseEvent.h" |
| 13 #include "platform/Timer.h" |
12 #include "public/platform/WebInputEventResult.h" | 14 #include "public/platform/WebInputEventResult.h" |
13 #include "wtf/Allocator.h" | 15 #include "wtf/Allocator.h" |
14 | 16 |
15 namespace blink { | 17 namespace blink { |
16 | 18 |
| 19 class DragState; |
| 20 class DataTransfer; |
| 21 class Element; |
| 22 class FloatQuad; |
| 23 class HitTestResult; |
| 24 class InputDeviceCapabilities; |
17 class LocalFrame; | 25 class LocalFrame; |
| 26 class ScrollManager; |
| 27 |
| 28 enum class DragInitiator; |
18 | 29 |
19 // This class takes care of dispatching all mouse events and keeps track of | 30 // This class takes care of dispatching all mouse events and keeps track of |
20 // positions and states of mouse. | 31 // positions and states of mouse. |
21 class CORE_EXPORT MouseEventManager : public GarbageCollectedFinalized<MouseEven
tManager> { | 32 class CORE_EXPORT MouseEventManager : public GarbageCollectedFinalized<MouseEven
tManager> { |
22 WTF_MAKE_NONCOPYABLE(MouseEventManager); | 33 WTF_MAKE_NONCOPYABLE(MouseEventManager); |
23 | 34 |
24 public: | 35 public: |
25 explicit MouseEventManager(LocalFrame*); | 36 explicit MouseEventManager(LocalFrame*, ScrollManager*); |
| 37 ~MouseEventManager(); |
26 DECLARE_TRACE(); | 38 DECLARE_TRACE(); |
27 | 39 |
28 WebInputEventResult dispatchMouseEvent( | 40 WebInputEventResult dispatchMouseEvent( |
29 EventTarget*, const AtomicString&, const PlatformMouseEvent&, | 41 EventTarget*, const AtomicString&, const PlatformMouseEvent&, |
30 EventTarget* relatedTarget, int detail = 0, | 42 EventTarget* relatedTarget, bool checkForListener = false); |
31 bool checkForListener = false); | 43 |
| 44 WebInputEventResult setMousePositionAndDispatchMouseEvent( |
| 45 Node* targetNode, const AtomicString& eventType, |
| 46 const PlatformMouseEvent&); |
| 47 |
| 48 WebInputEventResult dispatchMouseClickIfNeeded( |
| 49 const MouseEventWithHitTestResults&); |
| 50 |
| 51 WebInputEventResult dispatchDragSrcEvent(const AtomicString& eventType, cons
t PlatformMouseEvent&); |
| 52 WebInputEventResult dispatchDragEvent(const AtomicString& eventType, Node* t
arget, const PlatformMouseEvent&, DataTransfer*); |
32 | 53 |
33 // Resets the internal state of this object. | 54 // Resets the internal state of this object. |
34 void clear(); | 55 void clear(); |
35 | 56 |
36 void sendBoundaryEvents( | 57 void sendBoundaryEvents( |
37 EventTarget* exitedTarget, | 58 EventTarget* exitedTarget, |
38 EventTarget* enteredTarget, | 59 EventTarget* enteredTarget, |
39 const PlatformMouseEvent& mousePlatformEvent); | 60 const PlatformMouseEvent& mousePlatformEvent); |
40 | 61 |
| 62 void setNodeUnderMouse(Node*, const PlatformMouseEvent&); |
| 63 |
| 64 WebInputEventResult handleMouseFocus(const HitTestResult&, InputDeviceCapabi
lities* sourceCapabilities); |
| 65 |
| 66 void fakeMouseMoveEventTimerFired(TimerBase*); |
| 67 |
| 68 void cancelFakeMouseMoveEvent(); |
| 69 void dispatchFakeMouseMoveEventSoon(); |
| 70 void dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad&); |
| 71 |
| 72 void setLastKnownMousePosition(const PlatformMouseEvent&); |
| 73 |
| 74 bool handleDragDropIfPossible(const GestureEventWithHitTestResults&); |
| 75 |
| 76 WebInputEventResult handleMouseDraggedEvent(const MouseEventWithHitTestResul
ts&); |
| 77 WebInputEventResult handleMousePressEvent(const MouseEventWithHitTestResults
&); |
| 78 WebInputEventResult handleMouseReleaseEvent(const MouseEventWithHitTestResul
ts&); |
| 79 |
| 80 void nodeWillBeRemoved(Node& nodeToBeRemoved); |
| 81 |
| 82 static DragState& dragState(); |
| 83 |
| 84 void focusDocumentView(); |
| 85 |
| 86 // Resets the state that indicates the next events could cause a drag. It is
called when |
| 87 // we realize the next events should not cause drag based on the drag heuris
tics. |
| 88 void clearDragHeuristicState(); |
| 89 |
| 90 void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation); |
| 91 |
| 92 void updateSelectionForMouseDrag(); |
| 93 |
| 94 void handleMousePressEventUpdateStates(const PlatformMouseEvent&); |
| 95 |
| 96 // Returns whether pan is handled and resets the state on release. |
| 97 bool handleSvgPanIfNeeded(bool isReleaseEvent); |
| 98 |
| 99 void invalidateClick(); |
| 100 |
| 101 |
| 102 // TODO: These functions ideally should be private but the code needs more |
| 103 // refactoring to be able to remove the dependency from EventHandler. |
| 104 Node* getNodeUnderMouse(); |
| 105 bool isMousePositionUnknown(); |
| 106 IntPoint lastKnownMousePosition(); |
| 107 |
| 108 bool mousePressed(); |
| 109 void setMousePressed(bool); |
| 110 |
| 111 bool capturesDragging() const; |
| 112 void setCapturesDragging(bool); |
| 113 |
| 114 void setMouseDownMayStartAutoscroll() { m_mouseDownMayStartAutoscroll = true
; } |
| 115 |
| 116 Node* mousePressNode(); |
| 117 void setMousePressNode(Node*); |
| 118 |
| 119 void setClickNode(Node*); |
| 120 void setClickCount(int); |
| 121 |
| 122 bool mouseDownMayStartDrag(); |
| 123 |
41 private: | 124 private: |
42 class MouseEventBoundaryEventDispatcher : public BoundaryEventDispatcher { | 125 class MouseEventBoundaryEventDispatcher : public BoundaryEventDispatcher { |
43 WTF_MAKE_NONCOPYABLE(MouseEventBoundaryEventDispatcher); | 126 WTF_MAKE_NONCOPYABLE(MouseEventBoundaryEventDispatcher); |
44 | 127 |
45 public: | 128 public: |
46 MouseEventBoundaryEventDispatcher(MouseEventManager*, | 129 MouseEventBoundaryEventDispatcher(MouseEventManager*, |
47 const PlatformMouseEvent*, EventTarget* exitedTarget); | 130 const PlatformMouseEvent*, EventTarget* exitedTarget); |
48 | 131 |
49 protected: | 132 protected: |
50 void dispatchOut(EventTarget*, EventTarget* relatedTarget) override; | 133 void dispatchOut(EventTarget*, EventTarget* relatedTarget) override; |
51 void dispatchOver(EventTarget*, EventTarget* relatedTarget) override; | 134 void dispatchOver(EventTarget*, EventTarget* relatedTarget) override; |
52 void dispatchLeave(EventTarget*, EventTarget* relatedTarget, bool checkF
orListener) override; | 135 void dispatchLeave(EventTarget*, EventTarget* relatedTarget, bool checkF
orListener) override; |
53 void dispatchEnter(EventTarget*, EventTarget* relatedTarget, bool checkF
orListener) override; | 136 void dispatchEnter(EventTarget*, EventTarget* relatedTarget, bool checkF
orListener) override; |
54 AtomicString getLeaveEvent() override; | 137 AtomicString getLeaveEvent() override; |
55 AtomicString getEnterEvent() override; | 138 AtomicString getEnterEvent() override; |
56 | 139 |
57 private: | 140 private: |
58 void dispatch(EventTarget*, EventTarget* relatedTarget, | 141 void dispatch(EventTarget*, EventTarget* relatedTarget, |
59 const AtomicString&, const PlatformMouseEvent&, | 142 const AtomicString&, const PlatformMouseEvent&, |
60 bool checkForListener); | 143 bool checkForListener); |
61 Member<MouseEventManager> m_mouseEventManager; | 144 Member<MouseEventManager> m_mouseEventManager; |
62 const PlatformMouseEvent* m_platformMouseEvent; | 145 const PlatformMouseEvent* m_platformMouseEvent; |
63 Member<EventTarget> m_exitedTarget; | 146 Member<EventTarget> m_exitedTarget; |
64 }; | 147 }; |
65 | 148 |
| 149 // If the given element is a shadow host and its root has delegatesFocus=fal
se flag, |
| 150 // slide focus to its inner element. Returns true if the resulting focus is
different from |
| 151 // the given element. |
| 152 bool slideFocusOnShadowHostIfNecessary(const Element&); |
| 153 |
| 154 bool dragHysteresisExceeded(const IntPoint&) const; |
| 155 bool handleDrag(const MouseEventWithHitTestResults&, DragInitiator); |
| 156 bool tryStartDrag(const MouseEventWithHitTestResults&); |
| 157 void clearDragDataTransfer(); |
| 158 DataTransfer* createDraggingDataTransfer() const; |
| 159 |
66 // NOTE: If adding a new field to this class please ensure that it is | 160 // NOTE: If adding a new field to this class please ensure that it is |
67 // cleared in |MouseEventManager::clear()|. | 161 // cleared in |MouseEventManager::clear()|. |
68 | 162 |
69 const Member<LocalFrame> m_frame; | 163 const Member<LocalFrame> m_frame; |
| 164 Member<ScrollManager> m_scrollManager; |
70 | 165 |
71 // The effective position of the mouse pointer. | 166 // The effective position of the mouse pointer. |
72 // See https://w3c.github.io/pointerevents/#dfn-tracking-the-effective-posit
ion-of-the-legacy-mouse-pointer. | 167 // See https://w3c.github.io/pointerevents/#dfn-tracking-the-effective-posit
ion-of-the-legacy-mouse-pointer. |
73 Member<Node> m_nodeUnderMouse; | 168 Member<Node> m_nodeUnderMouse; |
| 169 |
| 170 // The last mouse movement position this frame has seen in root frame coordi
nates. |
| 171 IntPoint m_lastKnownMousePosition; |
| 172 IntPoint m_lastKnownMouseGlobalPosition; |
| 173 |
| 174 unsigned m_isMousePositionUnknown : 1; |
| 175 // Current button-press state for mouse/mouse-like-stylus. |
| 176 // TODO(crbug.com/563676): Buggy for chorded buttons. |
| 177 unsigned m_mousePressed : 1; |
| 178 |
| 179 unsigned m_mouseDownMayStartAutoscroll : 1; |
| 180 unsigned m_svgPan : 1; |
| 181 unsigned m_capturesDragging : 1; |
| 182 unsigned m_mouseDownMayStartDrag : 1; |
| 183 |
| 184 Member<Node> m_mousePressNode; |
| 185 |
| 186 |
| 187 int m_clickCount; |
| 188 Member<Node> m_clickNode; |
| 189 |
| 190 IntPoint m_mouseDownPos; // In our view's coords. |
| 191 double m_mouseDownTimestamp; |
| 192 PlatformMouseEvent m_mouseDown; |
| 193 |
| 194 LayoutPoint m_dragStartPos; |
| 195 |
| 196 Timer<MouseEventManager> m_fakeMouseMoveEventTimer; |
| 197 |
74 }; | 198 }; |
75 | 199 |
76 } // namespace blink | 200 } // namespace blink |
77 | 201 |
78 #endif // MouseEventManager_h | 202 #endif // MouseEventManager_h |
OLD | NEW |