| 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/ElementTraversal.h" | 7 #include "core/dom/ElementTraversal.h" |
| 8 #include "core/dom/shadow/FlatTreeTraversal.h" | 8 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 9 #include "core/events/MouseEvent.h" | 9 #include "core/events/MouseEvent.h" |
| 10 #include "core/frame/FrameView.h" | 10 #include "core/frame/FrameView.h" |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 140 } | 140 } |
| 141 | 141 |
| 142 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( | 142 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( |
| 143 EventTarget* target, int pointerId) | 143 EventTarget* target, int pointerId) |
| 144 { | 144 { |
| 145 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) | 145 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) |
| 146 return capturingTarget; | 146 return capturingTarget; |
| 147 return target; | 147 return target; |
| 148 } | 148 } |
| 149 | 149 |
| 150 void PointerEventManager::sendMouseAndPossiblyPointerBoundaryEvents( | 150 void PointerEventManager::sendMouseAndPointerBoundaryEvents( |
| 151 Node* exitedNode, | |
| 152 Node* enteredNode, | 151 Node* enteredNode, |
| 153 const PlatformMouseEvent& mouseEvent, | 152 const PlatformMouseEvent& mouseEvent) |
| 154 bool isFrameBoundaryTransition) | |
| 155 { | 153 { |
| 156 // Mouse event type does not matter as this pointerevent will only be used | 154 // Mouse event type does not matter as this pointerevent will only be used |
| 157 // to create boundary pointer events and its type will be overridden in | 155 // to create boundary pointer events and its type will be overridden in |
| 158 // |sendBoundaryEvents| function. | 156 // |sendBoundaryEvents| function. |
| 159 PointerEvent* dummyPointerEvent = | 157 PointerEvent* dummyPointerEvent = |
| 160 m_pointerEventFactory.create(EventTypeNames::mousedown, mouseEvent, | 158 m_pointerEventFactory.create(EventTypeNames::mousedown, mouseEvent, |
| 161 m_frame->document()->domWindow()); | 159 m_frame->document()->domWindow()); |
| 162 | 160 |
| 163 // TODO(crbug/545647): This state should reset with pointercancel too. | 161 // TODO(crbug/545647): This state should reset with pointercancel too. |
| 164 // This function also gets called for compat mouse events of touch at this | 162 // This function also gets called for compat mouse events of touch at this |
| 165 // stage. So if the event is not frame boundary transition it is only a | 163 // stage. So if the event is not frame boundary transition it is only a |
| 166 // compatibility mouse event and we do not need to change pointer event | 164 // compatibility mouse event and we do not need to change pointer event |
| 167 // behavior regarding preventMouseEvent state in that case. | 165 // behavior regarding preventMouseEvent state in that case. |
| 168 if (isFrameBoundaryTransition && dummyPointerEvent->buttons() == 0 | 166 if (dummyPointerEvent->buttons() == 0 && dummyPointerEvent->isPrimary()) { |
| 169 && dummyPointerEvent->isPrimary()) { | |
| 170 m_preventMouseEventForPointerType[toPointerTypeIndex( | 167 m_preventMouseEventForPointerType[toPointerTypeIndex( |
| 171 mouseEvent.pointerProperties().pointerType)] = false; | 168 mouseEvent.pointerProperties().pointerType)] = false; |
| 172 } | 169 } |
| 173 | 170 |
| 174 processCaptureAndPositionOfPointerEvent(dummyPointerEvent, enteredNode, | 171 processCaptureAndPositionOfPointerEvent(dummyPointerEvent, enteredNode, |
| 175 exitedNode, mouseEvent, true, isFrameBoundaryTransition); | 172 mouseEvent, true); |
| 176 } | 173 } |
| 177 | 174 |
| 178 void PointerEventManager::sendBoundaryEvents( | 175 void PointerEventManager::sendBoundaryEvents( |
| 179 EventTarget* exitedTarget, | 176 EventTarget* exitedTarget, |
| 180 EventTarget* enteredTarget, | 177 EventTarget* enteredTarget, |
| 181 PointerEvent* pointerEvent) | 178 PointerEvent* pointerEvent) |
| 182 { | 179 { |
| 183 if (RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { | 180 if (RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { |
| 184 if (exitedTarget == enteredTarget) | 181 if (exitedTarget == enteredTarget) |
| 185 return; | 182 return; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 processCaptureAndPositionOfPointerEvent(pointerEvent, nullptr); | 396 processCaptureAndPositionOfPointerEvent(pointerEvent, nullptr); |
| 400 | 397 |
| 401 removePointer(pointerEvent); | 398 removePointer(pointerEvent); |
| 402 } | 399 } |
| 403 | 400 |
| 404 return result; | 401 return result; |
| 405 } | 402 } |
| 406 | 403 |
| 407 WebInputEventResult PointerEventManager::sendMousePointerEvent( | 404 WebInputEventResult PointerEventManager::sendMousePointerEvent( |
| 408 Node* target, const AtomicString& mouseEventType, | 405 Node* target, const AtomicString& mouseEventType, |
| 409 int clickCount, const PlatformMouseEvent& mouseEvent, | 406 const PlatformMouseEvent& mouseEvent) |
| 410 Node* lastNodeUnderMouse, | |
| 411 Node** newNodeUnderMouse) | |
| 412 { | 407 { |
| 413 PointerEvent* pointerEvent = | 408 PointerEvent* pointerEvent = |
| 414 m_pointerEventFactory.create(mouseEventType, mouseEvent, | 409 m_pointerEventFactory.create(mouseEventType, mouseEvent, |
| 415 m_frame->document()->domWindow()); | 410 m_frame->document()->domWindow()); |
| 416 | 411 |
| 417 // This is for when the mouse is released outside of the page. | 412 // This is for when the mouse is released outside of the page. |
| 418 if (pointerEvent->type() == EventTypeNames::pointermove | 413 if (pointerEvent->type() == EventTypeNames::pointermove |
| 419 && !pointerEvent->buttons()) { | 414 && !pointerEvent->buttons()) { |
| 420 | 415 |
| 421 releasePointerCapture(pointerEvent->pointerId()); | 416 releasePointerCapture(pointerEvent->pointerId()); |
| 422 // Send got/lostpointercapture rightaway if necessary. | 417 // Send got/lostpointercapture rightaway if necessary. |
| 423 processPendingPointerCapture(pointerEvent); | 418 processPendingPointerCapture(pointerEvent); |
| 424 | 419 |
| 425 if (pointerEvent->isPrimary()) { | 420 if (pointerEvent->isPrimary()) { |
| 426 m_preventMouseEventForPointerType[toPointerTypeIndex( | 421 m_preventMouseEventForPointerType[toPointerTypeIndex( |
| 427 mouseEvent.pointerProperties().pointerType)] = false; | 422 mouseEvent.pointerProperties().pointerType)] = false; |
| 428 } | 423 } |
| 429 } | 424 } |
| 430 | 425 |
| 431 EventTarget* pointerEventTarget = processCaptureAndPositionOfPointerEvent(po
interEvent, target, | 426 EventTarget* pointerEventTarget = processCaptureAndPositionOfPointerEvent( |
| 432 lastNodeUnderMouse, mouseEvent, true, true); | 427 pointerEvent, target, mouseEvent, true); |
| 433 | |
| 434 if (pointerEventTarget) { | |
| 435 // This is to prevent incorrect boundary events if capturing transition
was | |
| 436 // delayed. | |
| 437 *newNodeUnderMouse = pointerEventTarget->toNode(); | |
| 438 DCHECK(*newNodeUnderMouse); | |
| 439 } | |
| 440 | 428 |
| 441 EventTarget* effectiveTarget = | 429 EventTarget* effectiveTarget = |
| 442 getEffectiveTargetForPointerEvent(pointerEventTarget, pointerEvent->poin
terId()); | 430 getEffectiveTargetForPointerEvent(pointerEventTarget, pointerEvent->poin
terId()); |
| 443 | 431 |
| 444 WebInputEventResult result = | 432 WebInputEventResult result = |
| 445 dispatchPointerEvent(effectiveTarget, pointerEvent); | 433 dispatchPointerEvent(effectiveTarget, pointerEvent); |
| 446 | 434 |
| 447 if (result != WebInputEventResult::NotHandled | 435 if (result != WebInputEventResult::NotHandled |
| 448 && pointerEvent->type() == EventTypeNames::pointerdown | 436 && pointerEvent->type() == EventTypeNames::pointerdown |
| 449 && pointerEvent->isPrimary()) { | 437 && pointerEvent->isPrimary()) { |
| 450 m_preventMouseEventForPointerType[toPointerTypeIndex( | 438 m_preventMouseEventForPointerType[toPointerTypeIndex( |
| 451 mouseEvent.pointerProperties().pointerType)] = true; | 439 mouseEvent.pointerProperties().pointerType)] = true; |
| 452 } | 440 } |
| 453 | 441 |
| 454 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe
rTypeIndex( | 442 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe
rTypeIndex( |
| 455 mouseEvent.pointerProperties().pointerType)]) { | 443 mouseEvent.pointerProperties().pointerType)]) { |
| 456 EventTarget* mouseTarget = effectiveTarget; | 444 EventTarget* mouseTarget = effectiveTarget; |
| 457 // Event path could be null if pointer event is not dispatched and | 445 // Event path could be null if pointer event is not dispatched and |
| 458 // that happens for example when pointer event feature is not enabled. | 446 // that happens for example when pointer event feature is not enabled. |
| 459 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) { | 447 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) { |
| 460 for (size_t i = 0; i < pointerEvent->eventPath().size(); i++) { | 448 for (size_t i = 0; i < pointerEvent->eventPath().size(); i++) { |
| 461 if (isInDocument(pointerEvent->eventPath()[i].node())) { | 449 if (isInDocument(pointerEvent->eventPath()[i].node())) { |
| 462 mouseTarget = pointerEvent->eventPath()[i].node(); | 450 mouseTarget = pointerEvent->eventPath()[i].node(); |
| 463 break; | 451 break; |
| 464 } | 452 } |
| 465 } | 453 } |
| 466 } | 454 } |
| 467 result = EventHandlingUtil::mergeEventResult(result, | 455 result = EventHandlingUtil::mergeEventResult(result, |
| 468 m_mouseEventManager->dispatchMouseEvent(mouseTarget, mouseEventType, | 456 m_mouseEventManager->dispatchMouseEvent(mouseTarget, mouseEventType, |
| 469 mouseEvent, nullptr, clickCount)); | 457 mouseEvent, nullptr)); |
| 470 } | 458 } |
| 471 | 459 |
| 472 if (pointerEvent->type() == EventTypeNames::pointerup | 460 if (pointerEvent->type() == EventTypeNames::pointerup |
| 473 || pointerEvent->type() == EventTypeNames::pointercancel) { | 461 || pointerEvent->type() == EventTypeNames::pointercancel) { |
| 474 | 462 |
| 475 releasePointerCapture(pointerEvent->pointerId()); | 463 releasePointerCapture(pointerEvent->pointerId()); |
| 476 // Send got/lostpointercapture rightaway if necessary. | 464 // Send got/lostpointercapture rightaway if necessary. |
| 477 processPendingPointerCapture(pointerEvent); | 465 processPendingPointerCapture(pointerEvent); |
| 478 | 466 |
| 479 if (pointerEvent->isPrimary()) { | 467 if (pointerEvent->isPrimary()) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 522 *pointerCaptureTarget = pointerCaptureTargetTemp; | 510 *pointerCaptureTarget = pointerCaptureTargetTemp; |
| 523 if (pendingPointerCaptureTarget) | 511 if (pendingPointerCaptureTarget) |
| 524 *pendingPointerCaptureTarget = pendingPointercaptureTargetTemp; | 512 *pendingPointerCaptureTarget = pendingPointercaptureTargetTemp; |
| 525 | 513 |
| 526 return pointerCaptureTargetTemp != pendingPointercaptureTargetTemp; | 514 return pointerCaptureTargetTemp != pendingPointercaptureTargetTemp; |
| 527 } | 515 } |
| 528 | 516 |
| 529 EventTarget* PointerEventManager::processCaptureAndPositionOfPointerEvent( | 517 EventTarget* PointerEventManager::processCaptureAndPositionOfPointerEvent( |
| 530 PointerEvent* pointerEvent, | 518 PointerEvent* pointerEvent, |
| 531 EventTarget* hitTestTarget, | 519 EventTarget* hitTestTarget, |
| 532 EventTarget* lastNodeUnderMouse, | |
| 533 const PlatformMouseEvent& mouseEvent, | 520 const PlatformMouseEvent& mouseEvent, |
| 534 bool sendMouseEvent, bool setPointerPosition) | 521 bool sendMouseEvent) |
| 535 { | 522 { |
| 536 if (setPointerPosition) { | 523 processPendingPointerCapture(pointerEvent); |
| 537 processPendingPointerCapture(pointerEvent); | |
| 538 | 524 |
| 539 if (!RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { | 525 if (!RuntimeEnabledFeatures::pointerEventV1SpecCapturingEnabled()) { |
| 540 PointerCapturingMap::const_iterator it = m_pointerCaptureTarget.find
(pointerEvent->pointerId()); | 526 PointerCapturingMap::const_iterator it = m_pointerCaptureTarget.find(poi
nterEvent->pointerId()); |
| 541 if (EventTarget* pointercaptureTarget = (it != m_pointerCaptureTarge
t.end()) ? it->value : nullptr) | 527 if (EventTarget* pointercaptureTarget = (it != m_pointerCaptureTarget.en
d()) ? it->value : nullptr) |
| 542 hitTestTarget = pointercaptureTarget; | 528 hitTestTarget = pointercaptureTarget; |
| 543 } | 529 } |
| 544 | 530 |
| 545 setNodeUnderPointer(pointerEvent, hitTestTarget); | 531 setNodeUnderPointer(pointerEvent, hitTestTarget); |
| 532 |
| 533 if (sendMouseEvent) { |
| 534 m_mouseEventManager->setNodeUnderMouse( |
| 535 hitTestTarget ? hitTestTarget->toNode() : nullptr, mouseEvent); |
| 546 } | 536 } |
| 547 if (sendMouseEvent) { | 537 |
| 548 // lastNodeUnderMouse is needed here because it is still stored in Event
Handler. | |
| 549 m_mouseEventManager->sendBoundaryEvents(lastNodeUnderMouse, | |
| 550 hitTestTarget, mouseEvent); | |
| 551 } | |
| 552 return hitTestTarget; | 538 return hitTestTarget; |
| 553 } | 539 } |
| 554 | 540 |
| 555 void PointerEventManager::processPendingPointerCapture( | 541 void PointerEventManager::processPendingPointerCapture( |
| 556 PointerEvent* pointerEvent) | 542 PointerEvent* pointerEvent) |
| 557 { | 543 { |
| 558 EventTarget* pointerCaptureTarget; | 544 EventTarget* pointerCaptureTarget; |
| 559 EventTarget* pendingPointerCaptureTarget; | 545 EventTarget* pendingPointerCaptureTarget; |
| 560 const int pointerId = pointerEvent->pointerId(); | 546 const int pointerId = pointerEvent->pointerId(); |
| 561 const bool isCaptureChanged = getPointerCaptureState( | 547 const bool isCaptureChanged = getPointerCaptureState( |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 699 visitor->trace(m_frame); | 685 visitor->trace(m_frame); |
| 700 visitor->trace(m_nodeUnderPointer); | 686 visitor->trace(m_nodeUnderPointer); |
| 701 visitor->trace(m_pointerCaptureTarget); | 687 visitor->trace(m_pointerCaptureTarget); |
| 702 visitor->trace(m_pendingPointerCaptureTarget); | 688 visitor->trace(m_pendingPointerCaptureTarget); |
| 703 visitor->trace(m_touchEventManager); | 689 visitor->trace(m_touchEventManager); |
| 704 visitor->trace(m_mouseEventManager); | 690 visitor->trace(m_mouseEventManager); |
| 705 } | 691 } |
| 706 | 692 |
| 707 | 693 |
| 708 } // namespace blink | 694 } // namespace blink |
| OLD | NEW |