Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1176)

Side by Side Diff: third_party/WebKit/Source/core/input/PointerEventManager.cpp

Issue 1809603003: Separate mouse transition events from pointerevent (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 28 matching lines...) Expand all
39 WebInputEventResult dispatchMouseEvent( 39 WebInputEventResult dispatchMouseEvent(
40 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, 40 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
41 const AtomicString& mouseEventType, 41 const AtomicString& mouseEventType,
42 const PlatformMouseEvent& mouseEvent, 42 const PlatformMouseEvent& mouseEvent,
43 PassRefPtrWillBeRawPtr<EventTarget> prpRelatedTarget, 43 PassRefPtrWillBeRawPtr<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 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
48 RefPtrWillBeRawPtr<EventTarget> relatedTarget = prpRelatedTarget; 48 RefPtrWillBeRawPtr<EventTarget> relatedTarget = prpRelatedTarget;
49 if (target->toNode() 49 if (target && target->toNode()
50 && (!checkForListener || target->hasEventListeners(mouseEventType))) { 50 && (!checkForListener || target->hasEventListeners(mouseEventType))) {
51 RefPtrWillBeRawPtr<Node> targetNode = target->toNode(); 51 RefPtrWillBeRawPtr<Node> targetNode = target->toNode();
52 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType , 52 RefPtrWillBeRawPtr<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 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
66 bool checkForListener) 66 bool checkForListener)
67 { 67 {
68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
70 70
71 if (!target)
72 return WebInputEventResult::NotHandled;
73
71 // Set whether node under pointer has received pointerover or not. 74 // Set whether node under pointer has received pointerover or not.
72 const int pointerId = pointerEvent->pointerId(); 75 const int pointerId = pointerEvent->pointerId();
73 const AtomicString& eventType = pointerEvent->type(); 76 const AtomicString& eventType = pointerEvent->type();
74 if ((eventType == EventTypeNames::pointerout 77 if ((eventType == EventTypeNames::pointerout
75 || eventType == EventTypeNames::pointerover) 78 || eventType == EventTypeNames::pointerover)
76 && m_nodeUnderPointer.contains(pointerId)) { 79 && m_nodeUnderPointer.contains(pointerId)) {
77 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer = 80 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer =
78 m_nodeUnderPointer.get(pointerId).target; 81 m_nodeUnderPointer.get(pointerId).target;
79 if (targetUnderPointer == target) { 82 if (targetUnderPointer == target) {
80 m_nodeUnderPointer.set(pointerId, EventTargetAttributes 83 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
81 (targetUnderPointer, 84 (targetUnderPointer,
82 eventType == EventTypeNames::pointerover)); 85 eventType == EventTypeNames::pointerover));
83 } 86 }
84 } 87 }
85 88
86 // TODO(crbug.com/587955): The following is a hack to work around this bug
87 if (pointerId == 1) {
88 if (eventType == EventTypeNames::pointerover) {
89 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
90 (target, true));
91 }
92 if (eventType == EventTypeNames::pointerout
93 && m_nodeUnderPointer.get(pointerId).target == target) {
94 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
95 (target, false));
96 }
97 }
98
99 if (!RuntimeEnabledFeatures::pointerEventEnabled()) 89 if (!RuntimeEnabledFeatures::pointerEventEnabled())
100 return WebInputEventResult::NotHandled; 90 return WebInputEventResult::NotHandled;
101 if (!checkForListener || target->hasEventListeners(eventType)) { 91 if (!checkForListener || target->hasEventListeners(eventType)) {
102 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; 92 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ;
103 return EventHandler::toWebInputEventResult(dispatchResult); 93 return EventHandler::toWebInputEventResult(dispatchResult);
104 } 94 }
105 return WebInputEventResult::NotHandled; 95 return WebInputEventResult::NotHandled;
106 } 96 }
107 97
108 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( 98 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent(
109 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) 99 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId)
110 { 100 {
111 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) 101 if (EventTarget* capturingTarget = getCapturingNode(pointerId))
112 return capturingTarget; 102 return capturingTarget;
113 return target; 103 return target;
114 } 104 }
115 105
116 // Sends node transition events (pointer|mouse)(out|leave|over|enter) to the cor responding targets 106 // Sends node transition events (pointer|mouse)(out|leave|over|enter) to the cor responding targets
117 void PointerEventManager::sendNodeTransitionEvents( 107 void PointerEventManager::sendNodeTransitionEvents(
118 PassRefPtrWillBeRawPtr<Node> prpExitedNode, 108 PassRefPtrWillBeRawPtr<Node> prpExitedNode,
119 PassRefPtrWillBeRawPtr<Node> prpEnteredNode, 109 PassRefPtrWillBeRawPtr<Node> prpEnteredNode,
120 const PlatformMouseEvent& mouseEvent, 110 const PlatformMouseEvent& mouseEvent,
121 PassRefPtrWillBeRawPtr<AbstractView> view) 111 PassRefPtrWillBeRawPtr<AbstractView> view,
112 bool setPointerPosition)
122 { 113 {
123 RefPtrWillBeRawPtr<Node> exitedNode = prpExitedNode; 114 RefPtrWillBeRawPtr<Node> exitedNode = prpExitedNode;
124 RefPtrWillBeRawPtr<Node> enteredNode = prpEnteredNode; 115 RefPtrWillBeRawPtr<Node> enteredNode = prpEnteredNode;
116
117 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents
125 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 118 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
126 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, 119 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent,
127 nullptr, view); 120 nullptr, view);
128 processPendingPointerCapture(pointerEvent, enteredNode, mouseEvent, true); 121 processPendingPointerCapture(pointerEvent, enteredNode, mouseEvent, true);
129 122
130 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents
131 sendNodeTransitionEvents(exitedNode, enteredNode, pointerEvent, mouseEvent, 123 sendNodeTransitionEvents(exitedNode, enteredNode, pointerEvent, mouseEvent,
132 true); 124 true);
125
126 if (setPointerPosition)
127 setNodeUnderPointer(pointerEvent, enteredNode);
133 } 128 }
134 129
135 void PointerEventManager::sendNodeTransitionEvents( 130 void PointerEventManager::sendNodeTransitionEvents(
136 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, 131 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget,
137 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, 132 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget,
138 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 133 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
139 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) 134 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
140 { 135 {
141 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; 136 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget;
142 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; 137 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget;
143 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 138 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
144 if (exitedTarget == enteredTarget) 139 if (exitedTarget == enteredTarget)
145 return; 140 return;
146 141
147 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId( ))) { 142 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId( ))) {
148 if (capturingTarget == exitedTarget) 143 if (capturingTarget == exitedTarget)
149 enteredTarget = nullptr; 144 enteredTarget = nullptr;
150 else if (capturingTarget == enteredTarget) 145 else if (capturingTarget == enteredTarget)
151 exitedTarget = nullptr; 146 exitedTarget = nullptr;
152 else 147 else
153 return; 148 return;
154 } 149 }
155 150
156 // Dispatch pointerout/mouseout events 151 // Dispatch pointerout/mouseout events
157 if (isInDocument(exitedTarget)) { 152 if (isInDocument(exitedTarget)) {
158 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr ansitionEvent(
159 pointerEvent, EventTypeNames::pointerout, enteredTarget));
160 if (sendMouseEvent) { 153 if (sendMouseEvent) {
161 dispatchMouseEvent(exitedTarget, 154 dispatchMouseEvent(exitedTarget,
162 EventTypeNames::mouseout, mouseEvent, enteredTarget); 155 EventTypeNames::mouseout, mouseEvent, enteredTarget);
156 } else {
157 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint erTransitionEvent(
158 pointerEvent, EventTypeNames::pointerout, enteredTarget));
163 } 159 }
164 } 160 }
165 161
166 // Create lists of all exited/entered ancestors, locate the common ancestor 162 // Create lists of all exited/entered ancestors, locate the common ancestor
167 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; 163 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors;
168 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; 164 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors;
169 if (isInDocument(exitedTarget)) { 165 if (isInDocument(exitedTarget)) {
170 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); 166 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode();
171 exitedNode->updateDistribution(); 167 exitedNode->updateDistribution();
172 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr aversal::parent(*node)) 168 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr aversal::parent(*node))
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 bool exitedNodeHasCapturingAncestor = false; 210 bool exitedNodeHasCapturingAncestor = false;
215 for (size_t j = 0; j < exitedAncestors.size(); j++) { 211 for (size_t j = 0; j < exitedAncestors.size(); j++) {
216 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) 212 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave)
217 || (RuntimeEnabledFeatures::pointerEventEnabled() 213 || (RuntimeEnabledFeatures::pointerEventEnabled()
218 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) 214 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave)))
219 exitedNodeHasCapturingAncestor = true; 215 exitedNodeHasCapturingAncestor = true;
220 } 216 }
221 217
222 // Dispatch pointerleave/mouseleave events, in child-to-parent order. 218 // Dispatch pointerleave/mouseleave events, in child-to-parent order.
223 for (size_t j = 0; j < exitedAncestorIndex; j++) { 219 for (size_t j = 0; j < exitedAncestorIndex; j++) {
224 dispatchPointerEvent(exitedAncestors[j].get(),
225 m_pointerEventFactory.createPointerTransitionEvent(
226 pointerEvent, EventTypeNames::pointerleave, enteredTarget),
227 !exitedNodeHasCapturingAncestor);
228 if (sendMouseEvent) { 220 if (sendMouseEvent) {
229 dispatchMouseEvent(exitedAncestors[j].get(), 221 dispatchMouseEvent(exitedAncestors[j].get(),
230 EventTypeNames::mouseleave, mouseEvent, enteredTarget, 222 EventTypeNames::mouseleave, mouseEvent, enteredTarget,
231 0, !exitedNodeHasCapturingAncestor); 223 0, !exitedNodeHasCapturingAncestor);
224 } else {
225 dispatchPointerEvent(exitedAncestors[j].get(),
226 m_pointerEventFactory.createPointerTransitionEvent(
227 pointerEvent, EventTypeNames::pointerleave, enteredTarget),
228 !exitedNodeHasCapturingAncestor);
232 } 229 }
233 } 230 }
234 231
235 // Dispatch pointerover/mouseover. 232 // Dispatch pointerover/mouseover.
236 if (isInDocument(enteredTarget)) { 233 if (isInDocument(enteredTarget)) {
237 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT ransitionEvent(
238 pointerEvent, EventTypeNames::pointerover, exitedTarget));
239 if (sendMouseEvent) { 234 if (sendMouseEvent) {
240 dispatchMouseEvent(enteredTarget, 235 dispatchMouseEvent(enteredTarget,
241 EventTypeNames::mouseover, mouseEvent, exitedTarget); 236 EventTypeNames::mouseover, mouseEvent, exitedTarget);
237 } else {
238 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin terTransitionEvent(
239 pointerEvent, EventTypeNames::pointerover, exitedTarget));
242 } 240 }
243 } 241 }
244 242
245 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because 243 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because
246 // the leave handlers might set a capturing enter handler. 244 // the leave handlers might set a capturing enter handler.
247 bool enteredNodeHasCapturingAncestor = false; 245 bool enteredNodeHasCapturingAncestor = false;
248 for (size_t i = 0; i < enteredAncestors.size(); i++) { 246 for (size_t i = 0; i < enteredAncestors.size(); i++) {
249 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) 247 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter)
250 || (RuntimeEnabledFeatures::pointerEventEnabled() 248 || (RuntimeEnabledFeatures::pointerEventEnabled()
251 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) 249 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter)))
252 enteredNodeHasCapturingAncestor = true; 250 enteredNodeHasCapturingAncestor = true;
253 } 251 }
254 252
255 // Dispatch pointerenter/mouseenter events, in parent-to-child order. 253 // Dispatch pointerenter/mouseenter events, in parent-to-child order.
256 for (size_t i = enteredAncestorIndex; i > 0; i--) { 254 for (size_t i = enteredAncestorIndex; i > 0; i--) {
257 dispatchPointerEvent(enteredAncestors[i-1].get(),
258 m_pointerEventFactory.createPointerTransitionEvent(
259 pointerEvent, EventTypeNames::pointerenter, exitedTarget),
260 !enteredNodeHasCapturingAncestor);
261 if (sendMouseEvent) { 255 if (sendMouseEvent) {
262 dispatchMouseEvent(enteredAncestors[i-1].get(), 256 dispatchMouseEvent(enteredAncestors[i-1].get(),
263 EventTypeNames::mouseenter, mouseEvent, exitedTarget, 257 EventTypeNames::mouseenter, mouseEvent, exitedTarget,
264 0, !enteredNodeHasCapturingAncestor); 258 0, !enteredNodeHasCapturingAncestor);
259 } else {
260 dispatchPointerEvent(enteredAncestors[i-1].get(),
261 m_pointerEventFactory.createPointerTransitionEvent(
262 pointerEvent, EventTypeNames::pointerenter, exitedTarget),
263 !enteredNodeHasCapturingAncestor);
265 } 264 }
266 } 265 }
267 } 266 }
268 267
269 void PointerEventManager::setNodeUnderPointer( 268 void PointerEventManager::setNodeUnderPointer(
270 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 269 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
271 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) 270 PassRefPtrWillBeRawPtr<EventTarget> prpTarget)
272 { 271 {
273 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 272 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
274 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 273 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 PassRefPtrWillBeRawPtr<Node> relatedTarget, 343 PassRefPtrWillBeRawPtr<Node> relatedTarget,
345 PassRefPtrWillBeRawPtr<AbstractView> view) 344 PassRefPtrWillBeRawPtr<AbstractView> view)
346 { 345 {
347 RefPtrWillBeRawPtr<Node> target = prpTarget; 346 RefPtrWillBeRawPtr<Node> target = prpTarget;
348 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 347 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
349 m_pointerEventFactory.create(mouseEventType, mouseEvent, 348 m_pointerEventFactory.create(mouseEventType, mouseEvent,
350 relatedTarget, view); 349 relatedTarget, view);
351 350
352 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); 351 processPendingPointerCapture(pointerEvent, target, mouseEvent, true);
353 352
354 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending 353 setNodeUnderPointer(pointerEvent, target);
355 // transition events that should be first removed from EventHandler.
356 // setNodeUnderPointer(pointerEvent, target);
357 354
358 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = 355 RefPtrWillBeRawPtr<EventTarget> effectiveTarget =
359 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); 356 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId());
360 357
361 WebInputEventResult result = 358 WebInputEventResult result =
362 dispatchPointerEvent(effectiveTarget, pointerEvent); 359 dispatchPointerEvent(effectiveTarget, pointerEvent);
363 360
364 if (result != WebInputEventResult::NotHandled 361 if (result != WebInputEventResult::NotHandled
365 && pointerEvent->type() == EventTypeNames::pointerdown) 362 && pointerEvent->type() == EventTypeNames::pointerdown)
366 m_preventMouseEventForPointerTypeMouse = true; 363 m_preventMouseEventForPointerTypeMouse = true;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; 415 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr;
419 const EventTargetAttributes &nodeUnderPointerAtt = 416 const EventTargetAttributes &nodeUnderPointerAtt =
420 m_nodeUnderPointer.contains(pointerId) 417 m_nodeUnderPointer.contains(pointerId)
421 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); 418 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes();
422 419
423 if (pointerCaptureTarget != pendingPointerCaptureTarget) { 420 if (pointerCaptureTarget != pendingPointerCaptureTarget) {
424 if (pendingPointerCaptureTarget != nodeUnderPointerAtt.target 421 if (pendingPointerCaptureTarget != nodeUnderPointerAtt.target
425 && nodeUnderPointerAtt.hasRecievedOverEvent) { 422 && nodeUnderPointerAtt.hasRecievedOverEvent) {
426 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr, 423 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr,
427 pointerEvent, mouseEvent, sendMouseEvent); 424 pointerEvent, mouseEvent, sendMouseEvent);
425 if (sendMouseEvent) {
426 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr,
427 pointerEvent);
428 }
428 } 429 }
429 if (pointerCaptureTarget) { 430 if (pointerCaptureTarget) {
430 // Re-target lostpointercapture to the document when the element is 431 // Re-target lostpointercapture to the document when the element is
431 // no longer participating in the tree. 432 // no longer participating in the tree.
432 EventTarget* target = pointerCaptureTarget.get(); 433 EventTarget* target = pointerCaptureTarget.get();
433 if (target->toNode() 434 if (target->toNode()
434 && !target->toNode()->inDocument()) { 435 && !target->toNode()->inDocument()) {
435 target = target->toNode()->ownerDocument(); 436 target = target->toNode()->ownerDocument();
436 } 437 }
437 if (target) { 438 if (target) {
(...skipping 18 matching lines...) Expand all
456 dispatchPointerEvent(pendingPointerCaptureTarget, 457 dispatchPointerEvent(pendingPointerCaptureTarget,
457 m_pointerEventFactory.createPointerCaptureEvent( 458 m_pointerEventFactory.createPointerCaptureEvent(
458 pointerEvent, EventTypeNames::gotpointercapture)); 459 pointerEvent, EventTypeNames::gotpointercapture));
459 } 460 }
460 if ((pendingPointerCaptureTarget == hitTestTarget 461 if ((pendingPointerCaptureTarget == hitTestTarget
461 || !pendingPointerCaptureTarget) 462 || !pendingPointerCaptureTarget)
462 && (nodeUnderPointerAtt.target != hitTestTarget 463 && (nodeUnderPointerAtt.target != hitTestTarget
463 || !nodeUnderPointerAtt.hasRecievedOverEvent)) { 464 || !nodeUnderPointerAtt.hasRecievedOverEvent)) {
464 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, 465 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent,
465 mouseEvent, sendMouseEvent); 466 mouseEvent, sendMouseEvent);
467 if (sendMouseEvent) {
468 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent);
469 }
466 } 470 }
467 } 471 }
468 } 472 }
469 473
470 void PointerEventManager::removeTargetFromPointerCapturingMapping( 474 void PointerEventManager::removeTargetFromPointerCapturingMapping(
471 PointerCapturingMap& map, const EventTarget* target) 475 PointerCapturingMap& map, const EventTarget* target)
472 { 476 {
473 // We could have kept a reverse mapping to make this deletion possibly 477 // We could have kept a reverse mapping to make this deletion possibly
474 // faster but it adds some code complication which might not be worth of 478 // faster but it adds some code complication which might not be worth of
475 // the performance improvement considering there might not be a lot of 479 // the performance improvement considering there might not be a lot of
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
531 { 535 {
532 #if ENABLE(OILPAN) 536 #if ENABLE(OILPAN)
533 visitor->trace(m_nodeUnderPointer); 537 visitor->trace(m_nodeUnderPointer);
534 visitor->trace(m_pointerCaptureTarget); 538 visitor->trace(m_pointerCaptureTarget);
535 visitor->trace(m_pendingPointerCaptureTarget); 539 visitor->trace(m_pendingPointerCaptureTarget);
536 #endif 540 #endif
537 } 541 }
538 542
539 543
540 } // namespace blink 544 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698