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 #include "core/input/PointerEventManager.h" | 5 #include "core/input/PointerEventManager.h" |
6 | 6 |
7 #include "core/dom/shadow/FlatTreeTraversal.h" | 7 #include "core/dom/shadow/FlatTreeTraversal.h" |
8 #include "core/events/MouseEvent.h" | 8 #include "core/events/MouseEvent.h" |
9 #include "core/input/EventHandler.h" | 9 #include "core/input/EventHandler.h" |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 case PlatformTouchPoint::TouchMoved: | 24 case PlatformTouchPoint::TouchMoved: |
25 return EventTypeNames::pointermove; | 25 return EventTypeNames::pointermove; |
26 case PlatformTouchPoint::TouchStationary: | 26 case PlatformTouchPoint::TouchStationary: |
27 // Fall through to default | 27 // Fall through to default |
28 default: | 28 default: |
29 ASSERT_NOT_REACHED(); | 29 ASSERT_NOT_REACHED(); |
30 return emptyAtom; | 30 return emptyAtom; |
31 } | 31 } |
32 } | 32 } |
33 | 33 |
34 bool isInDocument(PassRefPtrWillBeRawPtr<EventTarget> n) | 34 bool isInDocument(RawPtr<EventTarget> n) |
35 { | 35 { |
36 return n && n->toNode() && n->toNode()->inDocument(); | 36 return n && n->toNode() && n->toNode()->inDocument(); |
37 } | 37 } |
38 | 38 |
39 WebInputEventResult dispatchMouseEvent( | 39 WebInputEventResult dispatchMouseEvent( |
40 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, | 40 RawPtr<EventTarget> prpTarget, |
41 const AtomicString& mouseEventType, | 41 const AtomicString& mouseEventType, |
42 const PlatformMouseEvent& mouseEvent, | 42 const PlatformMouseEvent& mouseEvent, |
43 PassRefPtrWillBeRawPtr<EventTarget> prpRelatedTarget, | 43 RawPtr<EventTarget> prpRelatedTarget, |
44 int detail = 0, | 44 int detail = 0, |
45 bool checkForListener = false) | 45 bool checkForListener = false) |
46 { | 46 { |
47 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 47 RawPtr<EventTarget> target = prpTarget; |
48 RefPtrWillBeRawPtr<EventTarget> relatedTarget = prpRelatedTarget; | 48 RawPtr<EventTarget> relatedTarget = prpRelatedTarget; |
49 if (target && target->toNode() | 49 if (target && target->toNode() |
50 && (!checkForListener || target->hasEventListeners(mouseEventType))) { | 50 && (!checkForListener || target->hasEventListeners(mouseEventType))) { |
51 RefPtrWillBeRawPtr<Node> targetNode = target->toNode(); | 51 RawPtr<Node> targetNode = target->toNode(); |
52 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType
, | 52 RawPtr<MouseEvent> event = MouseEvent::create(mouseEventType, |
53 targetNode->document().domWindow(), mouseEvent, detail, | 53 targetNode->document().domWindow(), mouseEvent, detail, |
54 relatedTarget ? relatedTarget->toNode() : nullptr); | 54 relatedTarget ? relatedTarget->toNode() : nullptr); |
55 DispatchEventResult dispatchResult = target->dispatchEvent(event); | 55 DispatchEventResult dispatchResult = target->dispatchEvent(event); |
56 return EventHandler::toWebInputEventResult(dispatchResult); | 56 return EventHandler::toWebInputEventResult(dispatchResult); |
57 } | 57 } |
58 return WebInputEventResult::NotHandled; | 58 return WebInputEventResult::NotHandled; |
59 } | 59 } |
60 | 60 |
61 } // namespace | 61 } // namespace |
62 | 62 |
63 WebInputEventResult PointerEventManager::dispatchPointerEvent( | 63 WebInputEventResult PointerEventManager::dispatchPointerEvent( |
64 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, | 64 RawPtr<EventTarget> prpTarget, |
65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 65 RawPtr<PointerEvent> prpPointerEvent, |
66 bool checkForListener) | 66 bool checkForListener) |
67 { | 67 { |
68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 68 RawPtr<EventTarget> target = prpTarget; |
69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 69 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
70 | 70 |
71 if (!target) | 71 if (!target) |
72 return WebInputEventResult::NotHandled; | 72 return WebInputEventResult::NotHandled; |
73 | 73 |
74 // Set whether node under pointer has received pointerover or not. | 74 // Set whether node under pointer has received pointerover or not. |
75 const int pointerId = pointerEvent->pointerId(); | 75 const int pointerId = pointerEvent->pointerId(); |
76 const AtomicString& eventType = pointerEvent->type(); | 76 const AtomicString& eventType = pointerEvent->type(); |
77 if ((eventType == EventTypeNames::pointerout | 77 if ((eventType == EventTypeNames::pointerout |
78 || eventType == EventTypeNames::pointerover) | 78 || eventType == EventTypeNames::pointerover) |
79 && m_nodeUnderPointer.contains(pointerId)) { | 79 && m_nodeUnderPointer.contains(pointerId)) { |
80 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer = | 80 RawPtr<EventTarget> targetUnderPointer = |
81 m_nodeUnderPointer.get(pointerId).target; | 81 m_nodeUnderPointer.get(pointerId).target; |
82 if (targetUnderPointer == target) { | 82 if (targetUnderPointer == target) { |
83 m_nodeUnderPointer.set(pointerId, EventTargetAttributes | 83 m_nodeUnderPointer.set(pointerId, EventTargetAttributes |
84 (targetUnderPointer, | 84 (targetUnderPointer, |
85 eventType == EventTypeNames::pointerover)); | 85 eventType == EventTypeNames::pointerover)); |
86 } | 86 } |
87 } | 87 } |
88 | 88 |
89 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 89 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
90 return WebInputEventResult::NotHandled; | 90 return WebInputEventResult::NotHandled; |
91 if (!checkForListener || target->hasEventListeners(eventType)) { | 91 if (!checkForListener || target->hasEventListeners(eventType)) { |
92 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent)
; | 92 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent)
; |
93 return EventHandler::toWebInputEventResult(dispatchResult); | 93 return EventHandler::toWebInputEventResult(dispatchResult); |
94 } | 94 } |
95 return WebInputEventResult::NotHandled; | 95 return WebInputEventResult::NotHandled; |
96 } | 96 } |
97 | 97 |
98 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo
interEvent( | 98 RawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPointerEvent( |
99 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) | 99 RawPtr<EventTarget> target, int pointerId) |
100 { | 100 { |
101 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 101 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
102 return capturingTarget; | 102 return capturingTarget; |
103 return target; | 103 return target; |
104 } | 104 } |
105 | 105 |
106 void PointerEventManager::sendMouseAndPossiblyPointerNodeTransitionEvents( | 106 void PointerEventManager::sendMouseAndPossiblyPointerNodeTransitionEvents( |
107 PassRefPtrWillBeRawPtr<Node> exitedNode, | 107 RawPtr<Node> exitedNode, |
108 PassRefPtrWillBeRawPtr<Node> enteredNode, | 108 RawPtr<Node> enteredNode, |
109 const PlatformMouseEvent& mouseEvent, | 109 const PlatformMouseEvent& mouseEvent, |
110 PassRefPtrWillBeRawPtr<AbstractView> view, | 110 RawPtr<AbstractView> view, |
111 bool isFrameBoundaryTransition) | 111 bool isFrameBoundaryTransition) |
112 { | 112 { |
113 // Pointer event type does not matter as it will be overridden in the sendNo
deTransitionEvents | 113 // Pointer event type does not matter as it will be overridden in the sendNo
deTransitionEvents |
114 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 114 RawPtr<PointerEvent> pointerEvent = |
115 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, | 115 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, |
116 nullptr, view); | 116 nullptr, view); |
117 | 117 |
118 // TODO(crbug/545647): This state should reset with pointercancel too. | 118 // TODO(crbug/545647): This state should reset with pointercancel too. |
119 // This function also gets called for compat mouse events of touch at this | 119 // This function also gets called for compat mouse events of touch at this |
120 // stage. So if the event is not frame boundary transition it is only a | 120 // stage. So if the event is not frame boundary transition it is only a |
121 // compatibility mouse event and we do not need to change pointer event | 121 // compatibility mouse event and we do not need to change pointer event |
122 // behavior regarding preventMouseEvent state in that case. | 122 // behavior regarding preventMouseEvent state in that case. |
123 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0) { | 123 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0) { |
124 m_preventMouseEventForPointerTypeMouse = false; | 124 m_preventMouseEventForPointerTypeMouse = false; |
125 } | 125 } |
126 | 126 |
127 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, | 127 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, |
128 exitedNode, mouseEvent, true, isFrameBoundaryTransition); | 128 exitedNode, mouseEvent, true, isFrameBoundaryTransition); |
129 } | 129 } |
130 | 130 |
131 void PointerEventManager::sendNodeTransitionEvents( | 131 void PointerEventManager::sendNodeTransitionEvents( |
132 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, | 132 RawPtr<EventTarget> prpExitedTarget, |
133 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, | 133 RawPtr<EventTarget> prpEnteredTarget, |
134 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 134 RawPtr<PointerEvent> prpPointerEvent, |
135 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) | 135 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
136 { | 136 { |
137 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; | 137 RawPtr<EventTarget> exitedTarget = prpExitedTarget; |
138 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; | 138 RawPtr<EventTarget> enteredTarget = prpEnteredTarget; |
139 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 139 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
140 | 140 |
141 if (exitedTarget == enteredTarget) | 141 if (exitedTarget == enteredTarget) |
142 return; | 142 return; |
143 | 143 |
144 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId(
))) { | 144 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId(
))) { |
145 if (capturingTarget == exitedTarget) | 145 if (capturingTarget == exitedTarget) |
146 enteredTarget = nullptr; | 146 enteredTarget = nullptr; |
147 else if (capturingTarget == enteredTarget) | 147 else if (capturingTarget == enteredTarget) |
148 exitedTarget = nullptr; | 148 exitedTarget = nullptr; |
149 else | 149 else |
150 return; | 150 return; |
151 } | 151 } |
152 | 152 |
153 // Dispatch pointerout/mouseout events | 153 // Dispatch pointerout/mouseout events |
154 if (isInDocument(exitedTarget)) { | 154 if (isInDocument(exitedTarget)) { |
155 if (!sendMouseEvent) { | 155 if (!sendMouseEvent) { |
156 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erTransitionEvent( | 156 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erTransitionEvent( |
157 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 157 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
158 } else { | 158 } else { |
159 dispatchMouseEvent(exitedTarget, | 159 dispatchMouseEvent(exitedTarget, |
160 EventTypeNames::mouseout, mouseEvent, enteredTarget); | 160 EventTypeNames::mouseout, mouseEvent, enteredTarget); |
161 } | 161 } |
162 } | 162 } |
163 | 163 |
164 // Create lists of all exited/entered ancestors, locate the common ancestor | 164 // Create lists of all exited/entered ancestors, locate the common ancestor |
165 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; | 165 HeapVector<Member<Node>, 32> exitedAncestors; |
166 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; | 166 HeapVector<Member<Node>, 32> enteredAncestors; |
167 if (isInDocument(exitedTarget)) { | 167 if (isInDocument(exitedTarget)) { |
168 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); | 168 RawPtr<Node> exitedNode = exitedTarget->toNode(); |
169 exitedNode->updateDistribution(); | 169 exitedNode->updateDistribution(); |
170 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr
aversal::parent(*node)) | 170 for (RawPtr<Node> node = exitedNode; node; node = FlatTreeTraversal::par
ent(*node)) |
171 exitedAncestors.append(node); | 171 exitedAncestors.append(node); |
172 } | 172 } |
173 | 173 |
174 if (isInDocument(enteredTarget)) { | 174 if (isInDocument(enteredTarget)) { |
175 RefPtrWillBeRawPtr<Node> enteredNode = enteredTarget->toNode(); | 175 RawPtr<Node> enteredNode = enteredTarget->toNode(); |
176 enteredNode->updateDistribution(); | 176 enteredNode->updateDistribution(); |
177 for (RefPtrWillBeRawPtr<Node> node = enteredNode; node; node = FlatTreeT
raversal::parent(*node)) | 177 for (RawPtr<Node> node = enteredNode; node; node = FlatTreeTraversal::pa
rent(*node)) |
178 enteredAncestors.append(node); | 178 enteredAncestors.append(node); |
179 } | 179 } |
180 | 180 |
181 // A note on mouseenter and mouseleave: These are non-bubbling events, and t
hey are dispatched if there | 181 // A note on mouseenter and mouseleave: These are non-bubbling events, and t
hey are dispatched if there |
182 // is a capturing event handler on an ancestor or a normal event handler on
the element itself. This special | 182 // is a capturing event handler on an ancestor or a normal event handler on
the element itself. This special |
183 // handling is necessary to avoid O(n^2) capturing event handler checks. | 183 // handling is necessary to avoid O(n^2) capturing event handler checks. |
184 // | 184 // |
185 // Note, however, that this optimization can possibly cause some unanswere
d/missing/redundant mouseenter or | 185 // Note, however, that this optimization can possibly cause some unanswere
d/missing/redundant mouseenter or |
186 // mouseleave events in certain contrived eventhandling scenarios, e.g., whe
n: | 186 // mouseleave events in certain contrived eventhandling scenarios, e.g., whe
n: |
187 // - the mouseleave handler for a node sets the only capturing-mouseleave-li
stener in its ancestor, or | 187 // - the mouseleave handler for a node sets the only capturing-mouseleave-li
stener in its ancestor, or |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 !enteredNodeHasCapturingAncestor); | 261 !enteredNodeHasCapturingAncestor); |
262 } else { | 262 } else { |
263 dispatchMouseEvent(enteredAncestors[i-1].get(), | 263 dispatchMouseEvent(enteredAncestors[i-1].get(), |
264 EventTypeNames::mouseenter, mouseEvent, exitedTarget, | 264 EventTypeNames::mouseenter, mouseEvent, exitedTarget, |
265 0, !enteredNodeHasCapturingAncestor); | 265 0, !enteredNodeHasCapturingAncestor); |
266 } | 266 } |
267 } | 267 } |
268 } | 268 } |
269 | 269 |
270 void PointerEventManager::setNodeUnderPointer( | 270 void PointerEventManager::setNodeUnderPointer( |
271 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 271 RawPtr<PointerEvent> prpPointerEvent, |
272 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, | 272 RawPtr<EventTarget> prpTarget, |
273 bool sendEvent) | 273 bool sendEvent) |
274 { | 274 { |
275 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 275 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
276 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 276 RawPtr<EventTarget> target = prpTarget; |
277 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { | 277 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { |
278 EventTargetAttributes node = m_nodeUnderPointer.get( | 278 EventTargetAttributes node = m_nodeUnderPointer.get( |
279 pointerEvent->pointerId()); | 279 pointerEvent->pointerId()); |
280 if (!target) { | 280 if (!target) { |
281 m_nodeUnderPointer.remove(pointerEvent->pointerId()); | 281 m_nodeUnderPointer.remove(pointerEvent->pointerId()); |
282 } else if (target | 282 } else if (target |
283 != m_nodeUnderPointer.get(pointerEvent->pointerId()).target) { | 283 != m_nodeUnderPointer.get(pointerEvent->pointerId()).target) { |
284 m_nodeUnderPointer.set(pointerEvent->pointerId(), | 284 m_nodeUnderPointer.set(pointerEvent->pointerId(), |
285 EventTargetAttributes(target, false)); | 285 EventTargetAttributes(target, false)); |
286 } | 286 } |
287 if (sendEvent) | 287 if (sendEvent) |
288 sendNodeTransitionEvents(node.target, target, pointerEvent); | 288 sendNodeTransitionEvents(node.target, target, pointerEvent); |
289 } else if (target) { | 289 } else if (target) { |
290 m_nodeUnderPointer.add(pointerEvent->pointerId(), | 290 m_nodeUnderPointer.add(pointerEvent->pointerId(), |
291 EventTargetAttributes(target, false)); | 291 EventTargetAttributes(target, false)); |
292 if (sendEvent) | 292 if (sendEvent) |
293 sendNodeTransitionEvents(nullptr, target, pointerEvent); | 293 sendNodeTransitionEvents(nullptr, target, pointerEvent); |
294 } | 294 } |
295 } | 295 } |
296 | 296 |
297 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve
ntTarget> prpTarget, const PlatformTouchPoint& point) | 297 void PointerEventManager::sendTouchCancelPointerEvent(RawPtr<EventTarget> prpTar
get, const PlatformTouchPoint& point) |
298 { | 298 { |
299 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 299 RawPtr<EventTarget> target = prpTarget; |
300 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.create
PointerCancelEvent(point); | 300 RawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.createPointerCance
lEvent(point); |
301 | 301 |
302 | 302 |
303 processCaptureAndPositionOfPointerEvent(pointerEvent, target); | 303 processCaptureAndPositionOfPointerEvent(pointerEvent, target); |
304 | 304 |
305 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v
s pointer event capturing | 305 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v
s pointer event capturing |
306 dispatchPointerEvent( | 306 dispatchPointerEvent( |
307 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), | 307 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), |
308 pointerEvent.get()); | 308 pointerEvent.get()); |
309 | 309 |
310 setNodeUnderPointer(pointerEvent, nullptr); | 310 setNodeUnderPointer(pointerEvent, nullptr); |
311 | 311 |
312 removePointer(pointerEvent); | 312 removePointer(pointerEvent); |
313 } | 313 } |
314 | 314 |
315 WebInputEventResult PointerEventManager::sendTouchPointerEvent( | 315 WebInputEventResult PointerEventManager::sendTouchPointerEvent( |
316 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, | 316 RawPtr<EventTarget> prpTarget, |
317 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, | 317 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, |
318 const double width, const double height, | 318 const double width, const double height, |
319 const double clientX, const double clientY) | 319 const double clientX, const double clientY) |
320 { | 320 { |
321 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 321 RawPtr<EventTarget> target = prpTarget; |
322 | 322 |
323 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 323 RawPtr<PointerEvent> pointerEvent = |
324 m_pointerEventFactory.create( | 324 m_pointerEventFactory.create( |
325 pointerEventNameForTouchPointState(touchPoint.state()), | 325 pointerEventNameForTouchPointState(touchPoint.state()), |
326 touchPoint, modifiers, width, height, clientX, clientY); | 326 touchPoint, modifiers, width, height, clientX, clientY); |
327 | 327 |
328 processCaptureAndPositionOfPointerEvent(pointerEvent, target); | 328 processCaptureAndPositionOfPointerEvent(pointerEvent, target); |
329 | 329 |
330 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v
s pointer event capturing | 330 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v
s pointer event capturing |
331 WebInputEventResult result = dispatchPointerEvent( | 331 WebInputEventResult result = dispatchPointerEvent( |
332 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), | 332 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), |
333 pointerEvent.get()); | 333 pointerEvent.get()); |
334 | 334 |
335 if (touchPoint.state() == PlatformTouchPoint::TouchReleased | 335 if (touchPoint.state() == PlatformTouchPoint::TouchReleased |
336 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) { | 336 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) { |
337 setNodeUnderPointer(pointerEvent, nullptr); | 337 setNodeUnderPointer(pointerEvent, nullptr); |
338 removePointer(pointerEvent); | 338 removePointer(pointerEvent); |
339 } | 339 } |
340 | 340 |
341 return result; | 341 return result; |
342 } | 342 } |
343 | 343 |
344 WebInputEventResult PointerEventManager::sendMousePointerEvent( | 344 WebInputEventResult PointerEventManager::sendMousePointerEvent( |
345 PassRefPtrWillBeRawPtr<Node> prpTarget, const AtomicString& mouseEventType, | 345 RawPtr<Node> prpTarget, const AtomicString& mouseEventType, |
346 int clickCount, const PlatformMouseEvent& mouseEvent, | 346 int clickCount, const PlatformMouseEvent& mouseEvent, |
347 PassRefPtrWillBeRawPtr<Node> relatedTarget, | 347 RawPtr<Node> relatedTarget, |
348 PassRefPtrWillBeRawPtr<AbstractView> view, | 348 RawPtr<AbstractView> view, |
349 PassRefPtrWillBeRawPtr<Node> lastNodeUnderMouse) | 349 RawPtr<Node> lastNodeUnderMouse) |
350 { | 350 { |
351 RefPtrWillBeRawPtr<Node> target = prpTarget; | 351 RawPtr<Node> target = prpTarget; |
352 | 352 |
353 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 353 RawPtr<PointerEvent> pointerEvent = |
354 m_pointerEventFactory.create(mouseEventType, mouseEvent, | 354 m_pointerEventFactory.create(mouseEventType, mouseEvent, |
355 relatedTarget, view); | 355 relatedTarget, view); |
356 | 356 |
357 // This is for when the mouse is released outside of the page. | 357 // This is for when the mouse is released outside of the page. |
358 if (pointerEvent->type() == EventTypeNames::pointermove | 358 if (pointerEvent->type() == EventTypeNames::pointermove |
359 && !pointerEvent->buttons()) { | 359 && !pointerEvent->buttons()) { |
360 m_preventMouseEventForPointerTypeMouse = false; | 360 m_preventMouseEventForPointerTypeMouse = false; |
361 } | 361 } |
362 | 362 |
363 processCaptureAndPositionOfPointerEvent(pointerEvent, target, | 363 processCaptureAndPositionOfPointerEvent(pointerEvent, target, |
364 lastNodeUnderMouse, mouseEvent, true, true); | 364 lastNodeUnderMouse, mouseEvent, true, true); |
365 | 365 |
366 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = | 366 RawPtr<EventTarget> effectiveTarget = |
367 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); | 367 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); |
368 | 368 |
369 WebInputEventResult result = | 369 WebInputEventResult result = |
370 dispatchPointerEvent(effectiveTarget, pointerEvent); | 370 dispatchPointerEvent(effectiveTarget, pointerEvent); |
371 | 371 |
372 if (result != WebInputEventResult::NotHandled | 372 if (result != WebInputEventResult::NotHandled |
373 && pointerEvent->type() == EventTypeNames::pointerdown) | 373 && pointerEvent->type() == EventTypeNames::pointerdown) |
374 m_preventMouseEventForPointerTypeMouse = true; | 374 m_preventMouseEventForPointerTypeMouse = true; |
375 | 375 |
376 if (!m_preventMouseEventForPointerTypeMouse) { | 376 if (!m_preventMouseEventForPointerTypeMouse) { |
(...skipping 20 matching lines...) Expand all Loading... |
397 } | 397 } |
398 | 398 |
399 void PointerEventManager::clear() | 399 void PointerEventManager::clear() |
400 { | 400 { |
401 m_preventMouseEventForPointerTypeMouse = false; | 401 m_preventMouseEventForPointerTypeMouse = false; |
402 m_pointerEventFactory.clear(); | 402 m_pointerEventFactory.clear(); |
403 m_nodeUnderPointer.clear(); | 403 m_nodeUnderPointer.clear(); |
404 } | 404 } |
405 | 405 |
406 void PointerEventManager::processCaptureAndPositionOfPointerEvent( | 406 void PointerEventManager::processCaptureAndPositionOfPointerEvent( |
407 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 407 const RawPtr<PointerEvent> prpPointerEvent, |
408 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, | 408 const RawPtr<EventTarget> prpHitTestTarget, |
409 const PassRefPtrWillBeRawPtr<EventTarget> lastNodeUnderMouse, | 409 const RawPtr<EventTarget> lastNodeUnderMouse, |
410 const PlatformMouseEvent& mouseEvent, | 410 const PlatformMouseEvent& mouseEvent, |
411 bool sendMouseEvent, bool setPointerPosition) | 411 bool sendMouseEvent, bool setPointerPosition) |
412 { | 412 { |
413 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 413 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
414 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; | 414 RawPtr<EventTarget> hitTestTarget = prpHitTestTarget; |
415 bool isCaptureChanged = false; | 415 bool isCaptureChanged = false; |
416 | 416 |
417 if (setPointerPosition) { | 417 if (setPointerPosition) { |
418 isCaptureChanged = processPendingPointerCapture(pointerEvent, | 418 isCaptureChanged = processPendingPointerCapture(pointerEvent, |
419 hitTestTarget, mouseEvent, sendMouseEvent); | 419 hitTestTarget, mouseEvent, sendMouseEvent); |
420 // If there was a change in capturing processPendingPointerCapture has | 420 // If there was a change in capturing processPendingPointerCapture has |
421 // already taken care of transition events. So we don't need to send the | 421 // already taken care of transition events. So we don't need to send the |
422 // transition events here. | 422 // transition events here. |
423 setNodeUnderPointer(pointerEvent, hitTestTarget, !isCaptureChanged); | 423 setNodeUnderPointer(pointerEvent, hitTestTarget, !isCaptureChanged); |
424 } | 424 } |
425 if (sendMouseEvent && !isCaptureChanged) { | 425 if (sendMouseEvent && !isCaptureChanged) { |
426 // lastNodeUnderMouse is needed here because it is still stored in Event
Handler. | 426 // lastNodeUnderMouse is needed here because it is still stored in Event
Handler. |
427 sendNodeTransitionEvents(lastNodeUnderMouse, hitTestTarget, | 427 sendNodeTransitionEvents(lastNodeUnderMouse, hitTestTarget, |
428 pointerEvent, mouseEvent, true); | 428 pointerEvent, mouseEvent, true); |
429 } | 429 } |
430 } | 430 } |
431 | 431 |
432 bool PointerEventManager::processPendingPointerCapture( | 432 bool PointerEventManager::processPendingPointerCapture( |
433 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 433 const RawPtr<PointerEvent> prpPointerEvent, |
434 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, | 434 const RawPtr<EventTarget> prpHitTestTarget, |
435 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) | 435 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
436 { | 436 { |
437 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 437 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
438 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; | 438 RawPtr<EventTarget> hitTestTarget = prpHitTestTarget; |
439 int pointerId = pointerEvent->pointerId(); | 439 int pointerId = pointerEvent->pointerId(); |
440 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = | 440 const RawPtr<EventTarget> pointerCaptureTarget = |
441 m_pointerCaptureTarget.contains(pointerId) | 441 m_pointerCaptureTarget.contains(pointerId) |
442 ? m_pointerCaptureTarget.get(pointerId) : nullptr; | 442 ? m_pointerCaptureTarget.get(pointerId) : nullptr; |
443 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = | 443 const RawPtr<EventTarget> pendingPointerCaptureTarget = |
444 m_pendingPointerCaptureTarget.contains(pointerId) | 444 m_pendingPointerCaptureTarget.contains(pointerId) |
445 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; | 445 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; |
446 const EventTargetAttributes &nodeUnderPointerAtt = | 446 const EventTargetAttributes &nodeUnderPointerAtt = |
447 m_nodeUnderPointer.contains(pointerId) | 447 m_nodeUnderPointer.contains(pointerId) |
448 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); | 448 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); |
449 const bool isCaptureChanged = | 449 const bool isCaptureChanged = |
450 pointerCaptureTarget != pendingPointerCaptureTarget; | 450 pointerCaptureTarget != pendingPointerCaptureTarget; |
451 | 451 |
452 if (isCaptureChanged) { | 452 if (isCaptureChanged) { |
453 if ((hitTestTarget != nodeUnderPointerAtt.target | 453 if ((hitTestTarget != nodeUnderPointerAtt.target |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 } | 521 } |
522 | 522 |
523 EventTarget* PointerEventManager::getCapturingNode(int pointerId) | 523 EventTarget* PointerEventManager::getCapturingNode(int pointerId) |
524 { | 524 { |
525 if (m_pointerCaptureTarget.contains(pointerId)) | 525 if (m_pointerCaptureTarget.contains(pointerId)) |
526 return m_pointerCaptureTarget.get(pointerId); | 526 return m_pointerCaptureTarget.get(pointerId); |
527 return nullptr; | 527 return nullptr; |
528 } | 528 } |
529 | 529 |
530 void PointerEventManager::removePointer( | 530 void PointerEventManager::removePointer( |
531 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent) | 531 const RawPtr<PointerEvent> prpPointerEvent) |
532 { | 532 { |
533 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 533 RawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
534 if (m_pointerEventFactory.remove(pointerEvent)) { | 534 if (m_pointerEventFactory.remove(pointerEvent)) { |
535 int pointerId = pointerEvent->pointerId(); | 535 int pointerId = pointerEvent->pointerId(); |
536 m_pendingPointerCaptureTarget.remove(pointerId); | 536 m_pendingPointerCaptureTarget.remove(pointerId); |
537 m_pointerCaptureTarget.remove(pointerId); | 537 m_pointerCaptureTarget.remove(pointerId); |
538 m_nodeUnderPointer.remove(pointerId); | 538 m_nodeUnderPointer.remove(pointerId); |
539 } | 539 } |
540 } | 540 } |
541 | 541 |
542 void PointerEventManager::elementRemoved(EventTarget* target) | 542 void PointerEventManager::elementRemoved(EventTarget* target) |
543 { | 543 { |
(...skipping 26 matching lines...) Expand all Loading... |
570 { | 570 { |
571 #if ENABLE(OILPAN) | 571 #if ENABLE(OILPAN) |
572 visitor->trace(m_nodeUnderPointer); | 572 visitor->trace(m_nodeUnderPointer); |
573 visitor->trace(m_pointerCaptureTarget); | 573 visitor->trace(m_pointerCaptureTarget); |
574 visitor->trace(m_pendingPointerCaptureTarget); | 574 visitor->trace(m_pendingPointerCaptureTarget); |
575 #endif | 575 #endif |
576 } | 576 } |
577 | 577 |
578 | 578 |
579 } // namespace blink | 579 } // namespace blink |
OLD | NEW |