Chromium Code Reviews| 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 |