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 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
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 // Set whether node under pointer has received pointerover or not. | 71 // Set whether node under pointer has received pointerover or not. |
72 int pointerId = pointerEvent->pointerId(); | 72 const int pointerId = pointerEvent->pointerId(); |
73 if ((pointerEvent->type() == EventTypeNames::pointerout | 73 const AtomicString& pointerType = pointerEvent->type(); |
Rick Byers
2016/03/14 19:19:15
nit: maybe call this 'eventType'? 'pointerType' s
Navid Zolghadr
2016/03/14 19:31:20
Done.
| |
74 || pointerEvent->type() == EventTypeNames::pointerover) | 74 if ((pointerType == EventTypeNames::pointerout |
75 || pointerType == EventTypeNames::pointerover) | |
75 && m_nodeUnderPointer.contains(pointerId)) { | 76 && m_nodeUnderPointer.contains(pointerId)) { |
76 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer = | 77 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer = |
77 m_nodeUnderPointer.get(pointerId).target; | 78 m_nodeUnderPointer.get(pointerId).target; |
78 if (targetUnderPointer == target) { | 79 if (targetUnderPointer == target) { |
79 m_nodeUnderPointer.set(pointerId, EventTargetAttributes | 80 m_nodeUnderPointer.set(pointerId, EventTargetAttributes |
80 (targetUnderPointer, | 81 (targetUnderPointer, |
81 pointerEvent->type() == EventTypeNames::pointerover)); | 82 pointerType == EventTypeNames::pointerover)); |
82 } | 83 } |
83 } | 84 } |
85 | |
86 // TODO(crbug.com/587955): The following is a hack to work around this bug | |
87 if (pointerId == 1) { | |
88 if (pointerType == EventTypeNames::pointerover) { | |
89 m_nodeUnderPointer.set(pointerId, EventTargetAttributes | |
90 (target, true)); | |
91 } | |
92 if (pointerType == EventTypeNames::pointerout | |
93 && m_nodeUnderPointer.get(pointerId).target == target) { | |
94 m_nodeUnderPointer.set(pointerId, EventTargetAttributes | |
95 (target, false)); | |
96 } | |
97 } | |
98 | |
84 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 99 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
85 return WebInputEventResult::NotHandled; | 100 return WebInputEventResult::NotHandled; |
86 if (!checkForListener || target->hasEventListeners(pointerEvent->type())) { | 101 if (!checkForListener || target->hasEventListeners(pointerType)) { |
87 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; | 102 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; |
88 return EventHandler::toWebInputEventResult(dispatchResult); | 103 return EventHandler::toWebInputEventResult(dispatchResult); |
89 } | 104 } |
90 return WebInputEventResult::NotHandled; | 105 return WebInputEventResult::NotHandled; |
91 } | 106 } |
92 | 107 |
93 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( | 108 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( |
94 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) | 109 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) |
95 { | 110 { |
96 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 111 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 if (capturingTarget == exitedTarget) | 148 if (capturingTarget == exitedTarget) |
134 enteredTarget = nullptr; | 149 enteredTarget = nullptr; |
135 else if (capturingTarget == enteredTarget) | 150 else if (capturingTarget == enteredTarget) |
136 exitedTarget = nullptr; | 151 exitedTarget = nullptr; |
137 else | 152 else |
138 return; | 153 return; |
139 } | 154 } |
140 | 155 |
141 // Dispatch pointerout/mouseout events | 156 // Dispatch pointerout/mouseout events |
142 if (isInDocument(exitedTarget)) { | 157 if (isInDocument(exitedTarget)) { |
143 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create( | 158 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr ansitionEvent( |
144 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 159 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
145 if (sendMouseEvent) { | 160 if (sendMouseEvent) { |
146 dispatchMouseEvent(exitedTarget, | 161 dispatchMouseEvent(exitedTarget, |
147 EventTypeNames::mouseout, mouseEvent, enteredTarget); | 162 EventTypeNames::mouseout, mouseEvent, enteredTarget); |
148 } | 163 } |
149 } | 164 } |
150 | 165 |
151 // Create lists of all exited/entered ancestors, locate the common ancestor | 166 // Create lists of all exited/entered ancestors, locate the common ancestor |
152 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; | 167 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; |
153 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; | 168 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
200 for (size_t j = 0; j < exitedAncestors.size(); j++) { | 215 for (size_t j = 0; j < exitedAncestors.size(); j++) { |
201 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) | 216 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) |
202 || (RuntimeEnabledFeatures::pointerEventEnabled() | 217 || (RuntimeEnabledFeatures::pointerEventEnabled() |
203 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) | 218 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) |
204 exitedNodeHasCapturingAncestor = true; | 219 exitedNodeHasCapturingAncestor = true; |
205 } | 220 } |
206 | 221 |
207 // Dispatch pointerleave/mouseleave events, in child-to-parent order. | 222 // Dispatch pointerleave/mouseleave events, in child-to-parent order. |
208 for (size_t j = 0; j < exitedAncestorIndex; j++) { | 223 for (size_t j = 0; j < exitedAncestorIndex; j++) { |
209 dispatchPointerEvent(exitedAncestors[j].get(), | 224 dispatchPointerEvent(exitedAncestors[j].get(), |
210 m_pointerEventFactory.create( | 225 m_pointerEventFactory.createPointerTransitionEvent( |
211 pointerEvent, EventTypeNames::pointerleave, enteredTarget), | 226 pointerEvent, EventTypeNames::pointerleave, enteredTarget), |
212 !exitedNodeHasCapturingAncestor); | 227 !exitedNodeHasCapturingAncestor); |
213 if (sendMouseEvent) { | 228 if (sendMouseEvent) { |
214 dispatchMouseEvent(exitedAncestors[j].get(), | 229 dispatchMouseEvent(exitedAncestors[j].get(), |
215 EventTypeNames::mouseleave, mouseEvent, enteredTarget, | 230 EventTypeNames::mouseleave, mouseEvent, enteredTarget, |
216 0, !exitedNodeHasCapturingAncestor); | 231 0, !exitedNodeHasCapturingAncestor); |
217 } | 232 } |
218 } | 233 } |
219 | 234 |
220 // Dispatch pointerover/mouseover. | 235 // Dispatch pointerover/mouseover. |
221 if (isInDocument(enteredTarget)) { | 236 if (isInDocument(enteredTarget)) { |
222 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.create( | 237 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT ransitionEvent( |
223 pointerEvent, EventTypeNames::pointerover, exitedTarget)); | 238 pointerEvent, EventTypeNames::pointerover, exitedTarget)); |
224 if (sendMouseEvent) { | 239 if (sendMouseEvent) { |
225 dispatchMouseEvent(enteredTarget, | 240 dispatchMouseEvent(enteredTarget, |
226 EventTypeNames::mouseover, mouseEvent, exitedTarget); | 241 EventTypeNames::mouseover, mouseEvent, exitedTarget); |
227 } | 242 } |
228 } | 243 } |
229 | 244 |
230 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because | 245 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because |
231 // the leave handlers might set a capturing enter handler. | 246 // the leave handlers might set a capturing enter handler. |
232 bool enteredNodeHasCapturingAncestor = false; | 247 bool enteredNodeHasCapturingAncestor = false; |
233 for (size_t i = 0; i < enteredAncestors.size(); i++) { | 248 for (size_t i = 0; i < enteredAncestors.size(); i++) { |
234 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) | 249 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) |
235 || (RuntimeEnabledFeatures::pointerEventEnabled() | 250 || (RuntimeEnabledFeatures::pointerEventEnabled() |
236 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) | 251 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) |
237 enteredNodeHasCapturingAncestor = true; | 252 enteredNodeHasCapturingAncestor = true; |
238 } | 253 } |
239 | 254 |
240 // Dispatch pointerenter/mouseenter events, in parent-to-child order. | 255 // Dispatch pointerenter/mouseenter events, in parent-to-child order. |
241 for (size_t i = enteredAncestorIndex; i > 0; i--) { | 256 for (size_t i = enteredAncestorIndex; i > 0; i--) { |
242 dispatchPointerEvent(enteredAncestors[i-1].get(), | 257 dispatchPointerEvent(enteredAncestors[i-1].get(), |
243 m_pointerEventFactory.create( | 258 m_pointerEventFactory.createPointerTransitionEvent( |
244 pointerEvent, EventTypeNames::pointerenter, exitedTarget), | 259 pointerEvent, EventTypeNames::pointerenter, exitedTarget), |
245 !enteredNodeHasCapturingAncestor); | 260 !enteredNodeHasCapturingAncestor); |
246 if (sendMouseEvent) { | 261 if (sendMouseEvent) { |
247 dispatchMouseEvent(enteredAncestors[i-1].get(), | 262 dispatchMouseEvent(enteredAncestors[i-1].get(), |
248 EventTypeNames::mouseenter, mouseEvent, exitedTarget, | 263 EventTypeNames::mouseenter, mouseEvent, exitedTarget, |
249 0, !enteredNodeHasCapturingAncestor); | 264 0, !enteredNodeHasCapturingAncestor); |
250 } | 265 } |
251 } | 266 } |
252 } | 267 } |
253 | 268 |
254 void PointerEventManager::setNodeUnderPointer( | 269 void PointerEventManager::setNodeUnderPointer( |
255 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 270 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
256 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) | 271 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) |
257 { | 272 { |
258 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 273 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
259 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 274 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; |
260 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { | 275 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { |
261 EventTargetAttributes node = m_nodeUnderPointer.get( | 276 EventTargetAttributes node = m_nodeUnderPointer.get( |
262 pointerEvent->pointerId()); | 277 pointerEvent->pointerId()); |
263 if (!target) { | 278 if (!target) { |
264 m_nodeUnderPointer.remove(pointerEvent->pointerId()); | 279 m_nodeUnderPointer.remove(pointerEvent->pointerId()); |
265 } else { | 280 } else if (target |
281 != m_nodeUnderPointer.get(pointerEvent->pointerId()).target) { | |
266 m_nodeUnderPointer.set(pointerEvent->pointerId(), | 282 m_nodeUnderPointer.set(pointerEvent->pointerId(), |
267 EventTargetAttributes(target, false)); | 283 EventTargetAttributes(target, false)); |
268 } | 284 } |
269 sendNodeTransitionEvents(node.target, target, pointerEvent); | 285 sendNodeTransitionEvents(node.target, target, pointerEvent); |
270 } else if (target) { | 286 } else if (target) { |
271 m_nodeUnderPointer.add(pointerEvent->pointerId(), | 287 m_nodeUnderPointer.add(pointerEvent->pointerId(), |
272 EventTargetAttributes(target, false)); | 288 EventTargetAttributes(target, false)); |
273 sendNodeTransitionEvents(nullptr, target, pointerEvent); | 289 sendNodeTransitionEvents(nullptr, target, pointerEvent); |
274 } | 290 } |
275 } | 291 } |
276 | 292 |
277 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> prpTarget, const PlatformTouchPoint& point) | 293 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> prpTarget, const PlatformTouchPoint& point) |
278 { | 294 { |
279 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 295 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; |
280 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.create PointerCancel(point); | 296 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.create PointerCancelEvent(point); |
281 | 297 |
282 processPendingPointerCapture(pointerEvent, target); | 298 processPendingPointerCapture(pointerEvent, target); |
283 | 299 |
284 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing | 300 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing |
285 dispatchPointerEvent( | 301 dispatchPointerEvent( |
286 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), | 302 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), |
287 pointerEvent.get()); | 303 pointerEvent.get()); |
288 | 304 |
289 setNodeUnderPointer(pointerEvent, nullptr); | 305 setNodeUnderPointer(pointerEvent, nullptr); |
290 | 306 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 { | 346 { |
331 RefPtrWillBeRawPtr<Node> target = prpTarget; | 347 RefPtrWillBeRawPtr<Node> target = prpTarget; |
332 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 348 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = |
333 m_pointerEventFactory.create(mouseEventType, mouseEvent, | 349 m_pointerEventFactory.create(mouseEventType, mouseEvent, |
334 relatedTarget, view); | 350 relatedTarget, view); |
335 | 351 |
336 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); | 352 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); |
337 | 353 |
338 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending | 354 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending |
339 // transition events that should be first removed from EventHandler. | 355 // transition events that should be first removed from EventHandler. |
356 // setNodeUnderPointer(pointerEvent, target); | |
340 | 357 |
341 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = | 358 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = |
342 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); | 359 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); |
343 | 360 |
344 WebInputEventResult result = | 361 WebInputEventResult result = |
345 dispatchPointerEvent(effectiveTarget, pointerEvent); | 362 dispatchPointerEvent(effectiveTarget, pointerEvent); |
346 | 363 |
347 if (result != WebInputEventResult::NotHandled | 364 if (result != WebInputEventResult::NotHandled |
348 && pointerEvent->type() == EventTypeNames::pointerdown) | 365 && pointerEvent->type() == EventTypeNames::pointerdown) |
349 m_preventMouseEventForPointerTypeMouse = true; | 366 m_preventMouseEventForPointerTypeMouse = true; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
383 if (MouseEvent::platformModifiersToButtons(modifiers) == | 400 if (MouseEvent::platformModifiersToButtons(modifiers) == |
384 static_cast<unsigned short>(MouseEvent::Buttons::None)) | 401 static_cast<unsigned short>(MouseEvent::Buttons::None)) |
385 m_preventMouseEventForPointerTypeMouse = false; | 402 m_preventMouseEventForPointerTypeMouse = false; |
386 } | 403 } |
387 | 404 |
388 void PointerEventManager::processPendingPointerCapture( | 405 void PointerEventManager::processPendingPointerCapture( |
389 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 406 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
390 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, | 407 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, |
391 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) | 408 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
392 { | 409 { |
393 // TODO(nzolghadr): Process sending got/lostpointercapture | |
394 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 410 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
395 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; | 411 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; |
396 int pointerId = pointerEvent->pointerId(); | 412 int pointerId = pointerEvent->pointerId(); |
397 bool hasPointerCaptureTarget = m_pointerCaptureTarget.contains(pointerId); | |
398 bool hasPendingPointerCaptureTarget = m_pendingPointerCaptureTarget.contains (pointerId); | |
399 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = | 413 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = |
400 hasPointerCaptureTarget ? m_pointerCaptureTarget.get(pointerId) : nullpt r; | 414 m_pointerCaptureTarget.contains(pointerId) |
415 ? m_pointerCaptureTarget.get(pointerId) : nullptr; | |
401 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = | 416 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = |
402 hasPendingPointerCaptureTarget ? m_pendingPointerCaptureTarget.get(point erId) : nullptr; | 417 m_pendingPointerCaptureTarget.contains(pointerId) |
418 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; | |
419 const EventTargetAttributes &nodeUnderPointerAtt = | |
420 m_nodeUnderPointer.contains(pointerId) | |
421 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); | |
403 | 422 |
404 if (hasPendingPointerCaptureTarget | 423 if (pointerCaptureTarget != pendingPointerCaptureTarget) { |
405 && (pointerCaptureTarget != pendingPointerCaptureTarget)) { | 424 if (pendingPointerCaptureTarget != nodeUnderPointerAtt.target |
406 if (!hasPointerCaptureTarget | 425 && nodeUnderPointerAtt.hasRecievedOverEvent) { |
407 && pendingPointerCaptureTarget != hitTestTarget | 426 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr, |
408 && m_nodeUnderPointer.contains(pointerId) | 427 pointerEvent, mouseEvent, sendMouseEvent); |
409 && m_nodeUnderPointer.get(pointerId).hasRecievedOverEvent) { | 428 } |
410 sendNodeTransitionEvents(hitTestTarget, nullptr, pointerEvent, | 429 if (pointerCaptureTarget) { |
411 mouseEvent, sendMouseEvent); | 430 // Re-target lostpointercapture to the document when the element is |
431 // no longer participating in the tree. | |
432 EventTarget* target = pointerCaptureTarget.get(); | |
433 if (target->toNode() | |
434 && !target->toNode()->inDocument()) { | |
435 target = target->toNode()->ownerDocument(); | |
436 } | |
437 if (target) { | |
438 dispatchPointerEvent(target, | |
439 m_pointerEventFactory.createPointerCaptureEvent( | |
440 pointerEvent, EventTypeNames::lostpointercapture)); | |
441 } | |
412 } | 442 } |
413 } | 443 } |
414 | 444 |
415 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does | 445 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does |
416 // affect the behavior of sendNodeTransitionEvents function. So the | 446 // affect the behavior of sendNodeTransitionEvents function. So the |
417 // ordering of the surrounding blocks of code is important. | 447 // ordering of the surrounding blocks of code for sending transition events |
418 if (!hasPendingPointerCaptureTarget) | 448 // are important. |
449 if (pendingPointerCaptureTarget) | |
450 m_pointerCaptureTarget.set(pointerId, pendingPointerCaptureTarget); | |
451 else | |
419 m_pointerCaptureTarget.remove(pointerId); | 452 m_pointerCaptureTarget.remove(pointerId); |
420 else | |
421 m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get( pointerId)); | |
422 | 453 |
423 if (hasPointerCaptureTarget && (pointerCaptureTarget != pendingPointerCaptur eTarget)) { | 454 if (pointerCaptureTarget != pendingPointerCaptureTarget) { |
424 if (!hasPendingPointerCaptureTarget && pointerCaptureTarget != hitTestTa rget) { | 455 if (pendingPointerCaptureTarget) { |
456 dispatchPointerEvent(pendingPointerCaptureTarget, | |
457 m_pointerEventFactory.createPointerCaptureEvent( | |
458 pointerEvent, EventTypeNames::gotpointercapture)); | |
459 } | |
460 if ((pendingPointerCaptureTarget == hitTestTarget | |
461 || !pendingPointerCaptureTarget) | |
462 && (nodeUnderPointerAtt.target != hitTestTarget | |
463 || !nodeUnderPointerAtt.hasRecievedOverEvent)) { | |
425 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, | 464 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, |
426 mouseEvent, sendMouseEvent); | 465 mouseEvent, sendMouseEvent); |
427 } | 466 } |
428 } | 467 } |
429 | |
430 } | 468 } |
431 | 469 |
432 void PointerEventManager::removeTargetFromPointerCapturingMapping( | 470 void PointerEventManager::removeTargetFromPointerCapturingMapping( |
433 PointerCapturingMap& map, const EventTarget* target) | 471 PointerCapturingMap& map, const EventTarget* target) |
434 { | 472 { |
435 // We could have kept a reverse mapping to make this deletion possibly | 473 // We could have kept a reverse mapping to make this deletion possibly |
436 // faster but it adds some code complication which might not be worth of | 474 // faster but it adds some code complication which might not be worth of |
437 // the performance improvement considering there might not be a lot of | 475 // the performance improvement considering there might not be a lot of |
438 // active pointer or pointer captures at the same time. | 476 // active pointer or pointer captures at the same time. |
439 PointerCapturingMap tmp = map; | 477 PointerCapturingMap tmp = map; |
(...skipping 17 matching lines...) Expand all Loading... | |
457 if (m_pointerEventFactory.remove(pointerEvent)) { | 495 if (m_pointerEventFactory.remove(pointerEvent)) { |
458 int pointerId = pointerEvent->pointerId(); | 496 int pointerId = pointerEvent->pointerId(); |
459 m_pendingPointerCaptureTarget.remove(pointerId); | 497 m_pendingPointerCaptureTarget.remove(pointerId); |
460 m_pointerCaptureTarget.remove(pointerId); | 498 m_pointerCaptureTarget.remove(pointerId); |
461 m_nodeUnderPointer.remove(pointerId); | 499 m_nodeUnderPointer.remove(pointerId); |
462 } | 500 } |
463 } | 501 } |
464 | 502 |
465 void PointerEventManager::elementRemoved(EventTarget* target) | 503 void PointerEventManager::elementRemoved(EventTarget* target) |
466 { | 504 { |
467 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target); | |
468 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t); | 505 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t); |
469 // TODO(nzolghadr): Process sending lostpointercapture to the document | |
470 } | 506 } |
471 | 507 |
472 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) | 508 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) |
473 { | 509 { |
474 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) | 510 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) |
475 m_pendingPointerCaptureTarget.set(pointerId, target); | 511 m_pendingPointerCaptureTarget.set(pointerId, target); |
476 } | 512 } |
477 | 513 |
478 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et) | 514 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et) |
479 { | 515 { |
(...skipping 15 matching lines...) Expand all Loading... | |
495 { | 531 { |
496 #if ENABLE(OILPAN) | 532 #if ENABLE(OILPAN) |
497 visitor->trace(m_nodeUnderPointer); | 533 visitor->trace(m_nodeUnderPointer); |
498 visitor->trace(m_pointerCaptureTarget); | 534 visitor->trace(m_pointerCaptureTarget); |
499 visitor->trace(m_pendingPointerCaptureTarget); | 535 visitor->trace(m_pendingPointerCaptureTarget); |
500 #endif | 536 #endif |
501 } | 537 } |
502 | 538 |
503 | 539 |
504 } // namespace blink | 540 } // namespace blink |
OLD | NEW |