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

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

Issue 2650403006: Remove PlatformMouseEvent and use WebMouseEvent instead (Closed)
Patch Set: Created 3 years, 10 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/DocumentUserGestureToken.h" 7 #include "core/dom/DocumentUserGestureToken.h"
8 #include "core/dom/ElementTraversal.h" 8 #include "core/dom/ElementTraversal.h"
9 #include "core/dom/shadow/FlatTreeTraversal.h" 9 #include "core/dom/shadow/FlatTreeTraversal.h"
10 #include "core/events/MouseEvent.h" 10 #include "core/events/MouseEvent.h"
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent( 173 EventTarget* PointerEventManager::getEffectiveTargetForPointerEvent(
174 EventTarget* target, 174 EventTarget* target,
175 int pointerId) { 175 int pointerId) {
176 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) 176 if (EventTarget* capturingTarget = getCapturingNode(pointerId))
177 return capturingTarget; 177 return capturingTarget;
178 return target; 178 return target;
179 } 179 }
180 180
181 void PointerEventManager::sendMouseAndPointerBoundaryEvents( 181 void PointerEventManager::sendMouseAndPointerBoundaryEvents(
182 Node* enteredNode, 182 Node* enteredNode,
183 const PlatformMouseEvent& mouseEvent) { 183 const String& canvasRegionId,
184 const WebMouseEvent& mouseEvent) {
184 // Mouse event type does not matter as this pointerevent will only be used 185 // Mouse event type does not matter as this pointerevent will only be used
185 // to create boundary pointer events and its type will be overridden in 186 // to create boundary pointer events and its type will be overridden in
186 // |sendBoundaryEvents| function. 187 // |sendBoundaryEvents| function.
187 PointerEvent* dummyPointerEvent = m_pointerEventFactory.create( 188 PointerEvent* dummyPointerEvent = m_pointerEventFactory.create(
188 EventTypeNames::mousedown, mouseEvent, Vector<PlatformMouseEvent>(), 189 EventTypeNames::mousedown, mouseEvent, Vector<WebMouseEvent>(),
189 m_frame->document()->domWindow()); 190 m_frame->document()->domWindow());
190 191
191 // TODO(crbug/545647): This state should reset with pointercancel too. 192 // TODO(crbug/545647): This state should reset with pointercancel too.
192 // This function also gets called for compat mouse events of touch at this 193 // This function also gets called for compat mouse events of touch at this
193 // stage. So if the event is not frame boundary transition it is only a 194 // stage. So if the event is not frame boundary transition it is only a
194 // compatibility mouse event and we do not need to change pointer event 195 // compatibility mouse event and we do not need to change pointer event
195 // behavior regarding preventMouseEvent state in that case. 196 // behavior regarding preventMouseEvent state in that case.
196 if (dummyPointerEvent->buttons() == 0 && dummyPointerEvent->isPrimary()) { 197 if (dummyPointerEvent->buttons() == 0 && dummyPointerEvent->isPrimary()) {
197 m_preventMouseEventForPointerType[toPointerTypeIndex( 198 m_preventMouseEventForPointerType[toPointerTypeIndex(
198 mouseEvent.pointerProperties().pointerType)] = false; 199 mouseEvent.pointerType)] = false;
199 } 200 }
200 201
201 processCaptureAndPositionOfPointerEvent(dummyPointerEvent, enteredNode, 202 processCaptureAndPositionOfPointerEvent(dummyPointerEvent, enteredNode,
202 mouseEvent, true); 203 canvasRegionId, mouseEvent, true);
203 } 204 }
204 205
205 void PointerEventManager::sendBoundaryEvents(EventTarget* exitedTarget, 206 void PointerEventManager::sendBoundaryEvents(EventTarget* exitedTarget,
206 EventTarget* enteredTarget, 207 EventTarget* enteredTarget,
207 PointerEvent* pointerEvent) { 208 PointerEvent* pointerEvent) {
208 PointerEventBoundaryEventDispatcher boundaryEventDispatcher(this, 209 PointerEventBoundaryEventDispatcher boundaryEventDispatcher(this,
209 pointerEvent); 210 pointerEvent);
210 boundaryEventDispatcher.sendBoundaryEvents(exitedTarget, enteredTarget); 211 boundaryEventDispatcher.sendBoundaryEvents(exitedTarget, enteredTarget);
211 } 212 }
212 213
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 processCaptureAndPositionOfPointerEvent(pointerEvent, nullptr); 433 processCaptureAndPositionOfPointerEvent(pointerEvent, nullptr);
433 434
434 removePointer(pointerEvent); 435 removePointer(pointerEvent);
435 } 436 }
436 437
437 return result; 438 return result;
438 } 439 }
439 440
440 WebInputEventResult PointerEventManager::sendMousePointerEvent( 441 WebInputEventResult PointerEventManager::sendMousePointerEvent(
441 Node* target, 442 Node* target,
443 const String& canvasRegionId,
442 const AtomicString& mouseEventType, 444 const AtomicString& mouseEventType,
443 const PlatformMouseEvent& mouseEvent, 445 const WebMouseEvent& mouseEvent,
444 const Vector<PlatformMouseEvent>& coalescedEvents) { 446 const Vector<WebMouseEvent>& coalescedEvents) {
445 PointerEvent* pointerEvent = 447 PointerEvent* pointerEvent =
446 m_pointerEventFactory.create(mouseEventType, mouseEvent, coalescedEvents, 448 m_pointerEventFactory.create(mouseEventType, mouseEvent, coalescedEvents,
447 m_frame->document()->domWindow()); 449 m_frame->document()->domWindow());
448 450
449 // This is for when the mouse is released outside of the page. 451 // This is for when the mouse is released outside of the page.
450 if (pointerEvent->type() == EventTypeNames::pointermove && 452 if (pointerEvent->type() == EventTypeNames::pointermove &&
451 !pointerEvent->buttons()) { 453 !pointerEvent->buttons()) {
452 releasePointerCapture(pointerEvent->pointerId()); 454 releasePointerCapture(pointerEvent->pointerId());
453 // Send got/lostpointercapture rightaway if necessary. 455 // Send got/lostpointercapture rightaway if necessary.
454 processPendingPointerCapture(pointerEvent); 456 processPendingPointerCapture(pointerEvent);
455 457
456 if (pointerEvent->isPrimary()) { 458 if (pointerEvent->isPrimary()) {
457 m_preventMouseEventForPointerType[toPointerTypeIndex( 459 m_preventMouseEventForPointerType[toPointerTypeIndex(
458 mouseEvent.pointerProperties().pointerType)] = false; 460 mouseEvent.pointerType)] = false;
459 } 461 }
460 } 462 }
461 463
462 EventTarget* pointerEventTarget = processCaptureAndPositionOfPointerEvent( 464 EventTarget* pointerEventTarget = processCaptureAndPositionOfPointerEvent(
463 pointerEvent, target, mouseEvent, true); 465 pointerEvent, target, canvasRegionId, mouseEvent, true);
464 466
465 EventTarget* effectiveTarget = getEffectiveTargetForPointerEvent( 467 EventTarget* effectiveTarget = getEffectiveTargetForPointerEvent(
466 pointerEventTarget, pointerEvent->pointerId()); 468 pointerEventTarget, pointerEvent->pointerId());
467 469
468 WebInputEventResult result = 470 WebInputEventResult result =
469 dispatchPointerEvent(effectiveTarget, pointerEvent); 471 dispatchPointerEvent(effectiveTarget, pointerEvent);
470 472
471 if (result != WebInputEventResult::NotHandled && 473 if (result != WebInputEventResult::NotHandled &&
472 pointerEvent->type() == EventTypeNames::pointerdown && 474 pointerEvent->type() == EventTypeNames::pointerdown &&
473 pointerEvent->isPrimary()) { 475 pointerEvent->isPrimary()) {
474 m_preventMouseEventForPointerType[toPointerTypeIndex( 476 m_preventMouseEventForPointerType[toPointerTypeIndex(
475 mouseEvent.pointerProperties().pointerType)] = true; 477 mouseEvent.pointerType)] = true;
476 } 478 }
477 479
478 if (pointerEvent->isPrimary() && 480 if (pointerEvent->isPrimary() &&
479 !m_preventMouseEventForPointerType[toPointerTypeIndex( 481 !m_preventMouseEventForPointerType[toPointerTypeIndex(
480 mouseEvent.pointerProperties().pointerType)]) { 482 mouseEvent.pointerType)]) {
481 EventTarget* mouseTarget = effectiveTarget; 483 EventTarget* mouseTarget = effectiveTarget;
482 // Event path could be null if pointer event is not dispatched and 484 // Event path could be null if pointer event is not dispatched and
483 // that happens for example when pointer event feature is not enabled. 485 // that happens for example when pointer event feature is not enabled.
484 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) { 486 if (!isInDocument(mouseTarget) && pointerEvent->hasEventPath()) {
485 for (const auto& context : 487 for (const auto& context :
486 pointerEvent->eventPath().nodeEventContexts()) { 488 pointerEvent->eventPath().nodeEventContexts()) {
487 if (isInDocument(context.node())) { 489 if (isInDocument(context.node())) {
488 mouseTarget = context.node(); 490 mouseTarget = context.node();
489 break; 491 break;
490 } 492 }
491 } 493 }
492 } 494 }
493 result = EventHandlingUtil::mergeEventResult( 495 result = EventHandlingUtil::mergeEventResult(
494 result, m_mouseEventManager->dispatchMouseEvent( 496 result,
495 mouseTarget, mouseEventType, mouseEvent, nullptr)); 497 m_mouseEventManager->dispatchMouseEvent(
498 mouseTarget, mouseEventType, mouseEvent, canvasRegionId, nullptr));
496 } 499 }
497 500
498 if (pointerEvent->type() == EventTypeNames::pointerup || 501 if (pointerEvent->type() == EventTypeNames::pointerup ||
499 pointerEvent->type() == EventTypeNames::pointercancel) { 502 pointerEvent->type() == EventTypeNames::pointercancel) {
500 releasePointerCapture(pointerEvent->pointerId()); 503 releasePointerCapture(pointerEvent->pointerId());
501 // Send got/lostpointercapture rightaway if necessary. 504 // Send got/lostpointercapture rightaway if necessary.
502 processPendingPointerCapture(pointerEvent); 505 processPendingPointerCapture(pointerEvent);
503 506
504 if (pointerEvent->isPrimary()) { 507 if (pointerEvent->isPrimary()) {
505 m_preventMouseEventForPointerType[toPointerTypeIndex( 508 m_preventMouseEventForPointerType[toPointerTypeIndex(
506 mouseEvent.pointerProperties().pointerType)] = false; 509 mouseEvent.pointerType)] = false;
507 } 510 }
508 } 511 }
509 512
510 return result; 513 return result;
511 } 514 }
512 515
513 bool PointerEventManager::getPointerCaptureState( 516 bool PointerEventManager::getPointerCaptureState(
514 int pointerId, 517 int pointerId,
515 EventTarget** pointerCaptureTarget, 518 EventTarget** pointerCaptureTarget,
516 EventTarget** pendingPointerCaptureTarget) { 519 EventTarget** pendingPointerCaptureTarget) {
(...skipping 10 matching lines...) Expand all
527 *pointerCaptureTarget = pointerCaptureTargetTemp; 530 *pointerCaptureTarget = pointerCaptureTargetTemp;
528 if (pendingPointerCaptureTarget) 531 if (pendingPointerCaptureTarget)
529 *pendingPointerCaptureTarget = pendingPointercaptureTargetTemp; 532 *pendingPointerCaptureTarget = pendingPointercaptureTargetTemp;
530 533
531 return pointerCaptureTargetTemp != pendingPointercaptureTargetTemp; 534 return pointerCaptureTargetTemp != pendingPointercaptureTargetTemp;
532 } 535 }
533 536
534 EventTarget* PointerEventManager::processCaptureAndPositionOfPointerEvent( 537 EventTarget* PointerEventManager::processCaptureAndPositionOfPointerEvent(
535 PointerEvent* pointerEvent, 538 PointerEvent* pointerEvent,
536 EventTarget* hitTestTarget, 539 EventTarget* hitTestTarget,
537 const PlatformMouseEvent& mouseEvent, 540 const String& canvasRegionId,
541 const WebMouseEvent& mouseEvent,
538 bool sendMouseEvent) { 542 bool sendMouseEvent) {
539 processPendingPointerCapture(pointerEvent); 543 processPendingPointerCapture(pointerEvent);
540 544
541 PointerCapturingMap::const_iterator it = 545 PointerCapturingMap::const_iterator it =
542 m_pointerCaptureTarget.find(pointerEvent->pointerId()); 546 m_pointerCaptureTarget.find(pointerEvent->pointerId());
543 if (EventTarget* pointercaptureTarget = 547 if (EventTarget* pointercaptureTarget =
544 (it != m_pointerCaptureTarget.end()) ? it->value : nullptr) 548 (it != m_pointerCaptureTarget.end()) ? it->value : nullptr)
545 hitTestTarget = pointercaptureTarget; 549 hitTestTarget = pointercaptureTarget;
546 550
547 setNodeUnderPointer(pointerEvent, hitTestTarget); 551 setNodeUnderPointer(pointerEvent, hitTestTarget);
548 if (sendMouseEvent) { 552 if (sendMouseEvent) {
549 m_mouseEventManager->setNodeUnderMouse( 553 m_mouseEventManager->setNodeUnderMouse(
550 hitTestTarget ? hitTestTarget->toNode() : nullptr, mouseEvent); 554 hitTestTarget ? hitTestTarget->toNode() : nullptr, canvasRegionId,
555 mouseEvent);
551 } 556 }
552 return hitTestTarget; 557 return hitTestTarget;
553 } 558 }
554 559
555 void PointerEventManager::processPendingPointerCapture( 560 void PointerEventManager::processPendingPointerCapture(
556 PointerEvent* pointerEvent) { 561 PointerEvent* pointerEvent) {
557 EventTarget* pointerCaptureTarget; 562 EventTarget* pointerCaptureTarget;
558 EventTarget* pendingPointerCaptureTarget; 563 EventTarget* pendingPointerCaptureTarget;
559 const int pointerId = pointerEvent->pointerId(); 564 const int pointerId = pointerEvent->pointerId();
560 const bool isCaptureChanged = getPointerCaptureState( 565 const bool isCaptureChanged = getPointerCaptureState(
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 if (firstId > uniqueTouchEventId) 698 if (firstId > uniqueTouchEventId)
694 return false; 699 return false;
695 m_touchIdsForCanceledPointerdowns.takeFirst(); 700 m_touchIdsForCanceledPointerdowns.takeFirst();
696 if (firstId == uniqueTouchEventId) 701 if (firstId == uniqueTouchEventId)
697 return true; 702 return true;
698 } 703 }
699 return false; 704 return false;
700 } 705 }
701 706
702 } // namespace blink 707 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698