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(); |
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 if is a hack to work around this bu g | |
mustaq
2016/03/10 19:28:19
nit: remove "if"
Navid Zolghadr
2016/03/10 20:27:35
Sure.
| |
87 if (pointerType == EventTypeNames::pointerover && pointerId == 1) { | |
88 m_nodeUnderPointer.set(pointerId, EventTargetAttributes | |
89 (target, true)); | |
90 } | |
mustaq
2016/03/10 19:28:19
This deserves a comment: why not resetting the bit
Navid Zolghadr
2016/03/10 20:27:35
Since it was a hack anyways and should be removed
mustaq
2016/03/10 21:06:57
This is significant enough to call for a test. I u
| |
91 | |
84 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 92 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
85 return WebInputEventResult::NotHandled; | 93 return WebInputEventResult::NotHandled; |
86 if (!checkForListener || target->hasEventListeners(pointerEvent->type())) { | 94 if (!checkForListener || target->hasEventListeners(pointerType)) { |
87 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; | 95 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; |
88 return EventHandler::toWebInputEventResult(dispatchResult); | 96 return EventHandler::toWebInputEventResult(dispatchResult); |
89 } | 97 } |
90 return WebInputEventResult::NotHandled; | 98 return WebInputEventResult::NotHandled; |
91 } | 99 } |
92 | 100 |
93 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( | 101 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( |
94 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) | 102 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) |
95 { | 103 { |
96 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 104 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 if (capturingTarget == exitedTarget) | 141 if (capturingTarget == exitedTarget) |
134 enteredTarget = nullptr; | 142 enteredTarget = nullptr; |
135 else if (capturingTarget == enteredTarget) | 143 else if (capturingTarget == enteredTarget) |
136 exitedTarget = nullptr; | 144 exitedTarget = nullptr; |
137 else | 145 else |
138 return; | 146 return; |
139 } | 147 } |
140 | 148 |
141 // Dispatch pointerout/mouseout events | 149 // Dispatch pointerout/mouseout events |
142 if (isInDocument(exitedTarget)) { | 150 if (isInDocument(exitedTarget)) { |
143 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create( | 151 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr ansition( |
144 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 152 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
145 if (sendMouseEvent) { | 153 if (sendMouseEvent) { |
146 dispatchMouseEvent(exitedTarget, | 154 dispatchMouseEvent(exitedTarget, |
147 EventTypeNames::mouseout, mouseEvent, enteredTarget); | 155 EventTypeNames::mouseout, mouseEvent, enteredTarget); |
148 } | 156 } |
149 } | 157 } |
150 | 158 |
151 // Create lists of all exited/entered ancestors, locate the common ancestor | 159 // Create lists of all exited/entered ancestors, locate the common ancestor |
152 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; | 160 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; |
153 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; | 161 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++) { | 208 for (size_t j = 0; j < exitedAncestors.size(); j++) { |
201 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) | 209 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) |
202 || (RuntimeEnabledFeatures::pointerEventEnabled() | 210 || (RuntimeEnabledFeatures::pointerEventEnabled() |
203 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) | 211 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) |
204 exitedNodeHasCapturingAncestor = true; | 212 exitedNodeHasCapturingAncestor = true; |
205 } | 213 } |
206 | 214 |
207 // Dispatch pointerleave/mouseleave events, in child-to-parent order. | 215 // Dispatch pointerleave/mouseleave events, in child-to-parent order. |
208 for (size_t j = 0; j < exitedAncestorIndex; j++) { | 216 for (size_t j = 0; j < exitedAncestorIndex; j++) { |
209 dispatchPointerEvent(exitedAncestors[j].get(), | 217 dispatchPointerEvent(exitedAncestors[j].get(), |
210 m_pointerEventFactory.create( | 218 m_pointerEventFactory.createPointerTransition( |
211 pointerEvent, EventTypeNames::pointerleave, enteredTarget), | 219 pointerEvent, EventTypeNames::pointerleave, enteredTarget), |
212 !exitedNodeHasCapturingAncestor); | 220 !exitedNodeHasCapturingAncestor); |
213 if (sendMouseEvent) { | 221 if (sendMouseEvent) { |
214 dispatchMouseEvent(exitedAncestors[j].get(), | 222 dispatchMouseEvent(exitedAncestors[j].get(), |
215 EventTypeNames::mouseleave, mouseEvent, enteredTarget, | 223 EventTypeNames::mouseleave, mouseEvent, enteredTarget, |
216 0, !exitedNodeHasCapturingAncestor); | 224 0, !exitedNodeHasCapturingAncestor); |
217 } | 225 } |
218 } | 226 } |
219 | 227 |
220 // Dispatch pointerover/mouseover. | 228 // Dispatch pointerover/mouseover. |
221 if (isInDocument(enteredTarget)) { | 229 if (isInDocument(enteredTarget)) { |
222 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.create( | 230 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT ransition( |
223 pointerEvent, EventTypeNames::pointerover, exitedTarget)); | 231 pointerEvent, EventTypeNames::pointerover, exitedTarget)); |
224 if (sendMouseEvent) { | 232 if (sendMouseEvent) { |
225 dispatchMouseEvent(enteredTarget, | 233 dispatchMouseEvent(enteredTarget, |
226 EventTypeNames::mouseover, mouseEvent, exitedTarget); | 234 EventTypeNames::mouseover, mouseEvent, exitedTarget); |
227 } | 235 } |
228 } | 236 } |
229 | 237 |
230 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because | 238 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because |
231 // the leave handlers might set a capturing enter handler. | 239 // the leave handlers might set a capturing enter handler. |
232 bool enteredNodeHasCapturingAncestor = false; | 240 bool enteredNodeHasCapturingAncestor = false; |
233 for (size_t i = 0; i < enteredAncestors.size(); i++) { | 241 for (size_t i = 0; i < enteredAncestors.size(); i++) { |
234 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) | 242 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) |
235 || (RuntimeEnabledFeatures::pointerEventEnabled() | 243 || (RuntimeEnabledFeatures::pointerEventEnabled() |
236 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) | 244 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) |
237 enteredNodeHasCapturingAncestor = true; | 245 enteredNodeHasCapturingAncestor = true; |
238 } | 246 } |
239 | 247 |
240 // Dispatch pointerenter/mouseenter events, in parent-to-child order. | 248 // Dispatch pointerenter/mouseenter events, in parent-to-child order. |
241 for (size_t i = enteredAncestorIndex; i > 0; i--) { | 249 for (size_t i = enteredAncestorIndex; i > 0; i--) { |
242 dispatchPointerEvent(enteredAncestors[i-1].get(), | 250 dispatchPointerEvent(enteredAncestors[i-1].get(), |
243 m_pointerEventFactory.create( | 251 m_pointerEventFactory.createPointerTransition( |
244 pointerEvent, EventTypeNames::pointerenter, exitedTarget), | 252 pointerEvent, EventTypeNames::pointerenter, exitedTarget), |
245 !enteredNodeHasCapturingAncestor); | 253 !enteredNodeHasCapturingAncestor); |
246 if (sendMouseEvent) { | 254 if (sendMouseEvent) { |
247 dispatchMouseEvent(enteredAncestors[i-1].get(), | 255 dispatchMouseEvent(enteredAncestors[i-1].get(), |
248 EventTypeNames::mouseenter, mouseEvent, exitedTarget, | 256 EventTypeNames::mouseenter, mouseEvent, exitedTarget, |
249 0, !enteredNodeHasCapturingAncestor); | 257 0, !enteredNodeHasCapturingAncestor); |
250 } | 258 } |
251 } | 259 } |
252 } | 260 } |
253 | 261 |
254 void PointerEventManager::setNodeUnderPointer( | 262 void PointerEventManager::setNodeUnderPointer( |
255 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 263 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
256 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) | 264 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) |
257 { | 265 { |
258 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 266 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
259 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 267 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; |
260 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { | 268 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { |
261 EventTargetAttributes node = m_nodeUnderPointer.get( | 269 EventTargetAttributes node = m_nodeUnderPointer.get( |
262 pointerEvent->pointerId()); | 270 pointerEvent->pointerId()); |
263 if (!target) { | 271 if (!target) { |
264 m_nodeUnderPointer.remove(pointerEvent->pointerId()); | 272 m_nodeUnderPointer.remove(pointerEvent->pointerId()); |
265 } else { | 273 } else if (target |
274 != m_nodeUnderPointer.get(pointerEvent->pointerId()).target) { | |
266 m_nodeUnderPointer.set(pointerEvent->pointerId(), | 275 m_nodeUnderPointer.set(pointerEvent->pointerId(), |
267 EventTargetAttributes(target, false)); | 276 EventTargetAttributes(target, false)); |
268 } | 277 } |
269 sendNodeTransitionEvents(node.target, target, pointerEvent); | 278 sendNodeTransitionEvents(node.target, target, pointerEvent); |
270 } else if (target) { | 279 } else if (target) { |
271 m_nodeUnderPointer.add(pointerEvent->pointerId(), | 280 m_nodeUnderPointer.add(pointerEvent->pointerId(), |
272 EventTargetAttributes(target, false)); | 281 EventTargetAttributes(target, false)); |
273 sendNodeTransitionEvents(nullptr, target, pointerEvent); | 282 sendNodeTransitionEvents(nullptr, target, pointerEvent); |
274 } | 283 } |
275 } | 284 } |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 { | 339 { |
331 RefPtrWillBeRawPtr<Node> target = prpTarget; | 340 RefPtrWillBeRawPtr<Node> target = prpTarget; |
332 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 341 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = |
333 m_pointerEventFactory.create(mouseEventType, mouseEvent, | 342 m_pointerEventFactory.create(mouseEventType, mouseEvent, |
334 relatedTarget, view); | 343 relatedTarget, view); |
335 | 344 |
336 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); | 345 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); |
337 | 346 |
338 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending | 347 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending |
339 // transition events that should be first removed from EventHandler. | 348 // transition events that should be first removed from EventHandler. |
349 // setNodeUnderPointer(pointerEvent, target); | |
340 | 350 |
341 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = | 351 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = |
342 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); | 352 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); |
343 | 353 |
344 WebInputEventResult result = | 354 WebInputEventResult result = |
345 dispatchPointerEvent(effectiveTarget, pointerEvent); | 355 dispatchPointerEvent(effectiveTarget, pointerEvent); |
346 | 356 |
347 if (result != WebInputEventResult::NotHandled | 357 if (result != WebInputEventResult::NotHandled |
348 && pointerEvent->type() == EventTypeNames::pointerdown) | 358 && pointerEvent->type() == EventTypeNames::pointerdown) |
349 m_preventMouseEventForPointerTypeMouse = true; | 359 m_preventMouseEventForPointerTypeMouse = true; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
383 if (MouseEvent::platformModifiersToButtons(modifiers) == | 393 if (MouseEvent::platformModifiersToButtons(modifiers) == |
384 static_cast<unsigned short>(MouseEvent::Buttons::None)) | 394 static_cast<unsigned short>(MouseEvent::Buttons::None)) |
385 m_preventMouseEventForPointerTypeMouse = false; | 395 m_preventMouseEventForPointerTypeMouse = false; |
386 } | 396 } |
387 | 397 |
388 void PointerEventManager::processPendingPointerCapture( | 398 void PointerEventManager::processPendingPointerCapture( |
389 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 399 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
390 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, | 400 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, |
391 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) | 401 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
392 { | 402 { |
393 // TODO(nzolghadr): Process sending got/lostpointercapture | |
394 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 403 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
395 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; | 404 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; |
396 int pointerId = pointerEvent->pointerId(); | 405 int pointerId = pointerEvent->pointerId(); |
397 bool hasPointerCaptureTarget = m_pointerCaptureTarget.contains(pointerId); | |
398 bool hasPendingPointerCaptureTarget = m_pendingPointerCaptureTarget.contains (pointerId); | |
399 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = | 406 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = |
400 hasPointerCaptureTarget ? m_pointerCaptureTarget.get(pointerId) : nullpt r; | 407 m_pointerCaptureTarget.contains(pointerId) |
408 ? m_pointerCaptureTarget.get(pointerId) : nullptr; | |
401 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = | 409 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = |
402 hasPendingPointerCaptureTarget ? m_pendingPointerCaptureTarget.get(point erId) : nullptr; | 410 m_pendingPointerCaptureTarget.contains(pointerId) |
411 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; | |
412 const EventTargetAttributes &nodeUnderPointerAtt = | |
413 m_nodeUnderPointer.contains(pointerId) | |
414 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); | |
403 | 415 |
404 if (hasPendingPointerCaptureTarget | 416 if (pointerCaptureTarget != pendingPointerCaptureTarget) { |
405 && (pointerCaptureTarget != pendingPointerCaptureTarget)) { | 417 if (pendingPointerCaptureTarget != nodeUnderPointerAtt.target |
406 if (!hasPointerCaptureTarget | 418 && nodeUnderPointerAtt.hasRecievedOverEvent) { |
407 && pendingPointerCaptureTarget != hitTestTarget | 419 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr, |
408 && m_nodeUnderPointer.contains(pointerId) | 420 pointerEvent, mouseEvent, sendMouseEvent); |
409 && m_nodeUnderPointer.get(pointerId).hasRecievedOverEvent) { | 421 } |
410 sendNodeTransitionEvents(hitTestTarget, nullptr, pointerEvent, | 422 if (pointerCaptureTarget) { |
411 mouseEvent, sendMouseEvent); | 423 // Re-target lostpointercapture to the document when the element is |
424 // no longer participating in the tree. | |
425 EventTarget* target = pointerCaptureTarget.get(); | |
426 if (target->toNode() | |
427 && !target->toNode()->inDocument()) { | |
428 target = target->toNode()->ownerDocument(); | |
429 } | |
430 if (target) { | |
431 dispatchPointerEvent(target, | |
432 m_pointerEventFactory.createPointerCapture( | |
433 pointerEvent, EventTypeNames::lostpointercapture)); | |
434 } | |
412 } | 435 } |
413 } | 436 } |
414 | 437 |
415 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does | 438 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does |
416 // affect the behavior of sendNodeTransitionEvents function. So the | 439 // affect the behavior of sendNodeTransitionEvents function. So the |
417 // ordering of the surrounding blocks of code is important. | 440 // ordering of the surrounding blocks of code for sending transition events |
418 if (!hasPendingPointerCaptureTarget) | 441 // are important. |
442 if (pendingPointerCaptureTarget) | |
443 m_pointerCaptureTarget.set(pointerId, pendingPointerCaptureTarget); | |
444 else | |
419 m_pointerCaptureTarget.remove(pointerId); | 445 m_pointerCaptureTarget.remove(pointerId); |
420 else | |
421 m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get( pointerId)); | |
422 | 446 |
423 if (hasPointerCaptureTarget && (pointerCaptureTarget != pendingPointerCaptur eTarget)) { | 447 if (pointerCaptureTarget != pendingPointerCaptureTarget) { |
424 if (!hasPendingPointerCaptureTarget && pointerCaptureTarget != hitTestTa rget) { | 448 if (pendingPointerCaptureTarget) { |
449 dispatchPointerEvent(pendingPointerCaptureTarget, | |
450 m_pointerEventFactory.createPointerCapture( | |
451 pointerEvent, EventTypeNames::gotpointercapture)); | |
452 } | |
453 if ((pendingPointerCaptureTarget == hitTestTarget | |
454 || !pendingPointerCaptureTarget) | |
455 && (nodeUnderPointerAtt.target != hitTestTarget | |
456 || !nodeUnderPointerAtt.hasRecievedOverEvent)) { | |
425 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, | 457 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, |
426 mouseEvent, sendMouseEvent); | 458 mouseEvent, sendMouseEvent); |
427 } | 459 } |
428 } | 460 } |
429 | |
430 } | 461 } |
431 | 462 |
432 void PointerEventManager::removeTargetFromPointerCapturingMapping( | 463 void PointerEventManager::removeTargetFromPointerCapturingMapping( |
433 PointerCapturingMap& map, const EventTarget* target) | 464 PointerCapturingMap& map, const EventTarget* target) |
434 { | 465 { |
435 // We could have kept a reverse mapping to make this deletion possibly | 466 // 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 | 467 // 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 | 468 // the performance improvement considering there might not be a lot of |
438 // active pointer or pointer captures at the same time. | 469 // active pointer or pointer captures at the same time. |
439 PointerCapturingMap tmp = map; | 470 PointerCapturingMap tmp = map; |
(...skipping 17 matching lines...) Expand all Loading... | |
457 if (m_pointerEventFactory.remove(pointerEvent)) { | 488 if (m_pointerEventFactory.remove(pointerEvent)) { |
458 int pointerId = pointerEvent->pointerId(); | 489 int pointerId = pointerEvent->pointerId(); |
459 m_pendingPointerCaptureTarget.remove(pointerId); | 490 m_pendingPointerCaptureTarget.remove(pointerId); |
460 m_pointerCaptureTarget.remove(pointerId); | 491 m_pointerCaptureTarget.remove(pointerId); |
461 m_nodeUnderPointer.remove(pointerId); | 492 m_nodeUnderPointer.remove(pointerId); |
462 } | 493 } |
463 } | 494 } |
464 | 495 |
465 void PointerEventManager::elementRemoved(EventTarget* target) | 496 void PointerEventManager::elementRemoved(EventTarget* target) |
466 { | 497 { |
467 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target); | |
468 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t); | 498 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t); |
469 // TODO(nzolghadr): Process sending lostpointercapture to the document | |
470 } | 499 } |
471 | 500 |
472 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) | 501 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) |
473 { | 502 { |
474 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) | 503 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) |
475 m_pendingPointerCaptureTarget.set(pointerId, target); | 504 m_pendingPointerCaptureTarget.set(pointerId, target); |
476 } | 505 } |
477 | 506 |
478 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et) | 507 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et) |
479 { | 508 { |
(...skipping 15 matching lines...) Expand all Loading... | |
495 { | 524 { |
496 #if ENABLE(OILPAN) | 525 #if ENABLE(OILPAN) |
497 visitor->trace(m_nodeUnderPointer); | 526 visitor->trace(m_nodeUnderPointer); |
498 visitor->trace(m_pointerCaptureTarget); | 527 visitor->trace(m_pointerCaptureTarget); |
499 visitor->trace(m_pendingPointerCaptureTarget); | 528 visitor->trace(m_pendingPointerCaptureTarget); |
500 #endif | 529 #endif |
501 } | 530 } |
502 | 531 |
503 | 532 |
504 } // namespace blink | 533 } // namespace blink |
OLD | NEW |