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 |