Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(169)

Side by Side Diff: third_party/WebKit/Source/core/input/PointerEventManager.cpp

Issue 2350433002: Extract more of the mouse logic from EventHandler (Closed)
Patch Set: Remove redundant condition Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698