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

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

Issue 1989623002: Suppressed MEs for gestures from cancelled PEs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed a comment. Created 4 years, 6 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 436 matching lines...) Expand 10 before | Expand all | Expand 10 after
447 } 447 }
448 } else { 448 } else {
449 // Set the target of pointer event to the captured node as this 449 // Set the target of pointer event to the captured node as this
450 // pointer is captured otherwise it would have gone to the if block 450 // pointer is captured otherwise it would have gone to the if block
451 // and perform a hit-test. 451 // and perform a hit-test.
452 touchInfo.touchNode = m_pendingPointerCaptureTarget 452 touchInfo.touchNode = m_pendingPointerCaptureTarget
453 .get(pointerId)->toNode(); 453 .get(pointerId)->toNode();
454 touchInfo.targetFrame = touchInfo.touchNode->document().frame(); 454 touchInfo.targetFrame = touchInfo.touchNode->document().frame();
455 } 455 }
456 456
457 WebInputEventResult result = WebInputEventResult::NotHandled;
458
459 // Do not send pointer events for stationary touches or null targetFrame 457 // Do not send pointer events for stationary touches or null targetFrame
460 if (touchInfo.touchNode 458 if (touchInfo.touchNode
461 && touchPoint.state() != PlatformTouchPoint::TouchStationary 459 && touchPoint.state() != PlatformTouchPoint::TouchStationary
462 && !m_inCanceledStateForPointerTypeTouch) { 460 && !m_inCanceledStateForPointerTypeTouch) {
463 FloatPoint pagePoint = touchInfo.targetFrame->view() 461 FloatPoint pagePoint = touchInfo.targetFrame->view()
464 ->rootFrameToContents(touchInfo.point.pos()); 462 ->rootFrameToContents(touchInfo.point.pos());
465 float scaleFactor = 1.0f / touchInfo.targetFrame->pageZoomFactor(); 463 float scaleFactor = 1.0f / touchInfo.targetFrame->pageZoomFactor();
466 FloatPoint scrollPosition = touchInfo.targetFrame->view()->scrollPos ition(); 464 FloatPoint scrollPosition = touchInfo.targetFrame->view()->scrollPos ition();
467 FloatPoint framePoint = pagePoint.scaledBy(scaleFactor); 465 FloatPoint framePoint = pagePoint.scaledBy(scaleFactor);
468 framePoint.moveBy(scrollPosition.scaledBy(-scaleFactor)); 466 framePoint.moveBy(scrollPosition.scaledBy(-scaleFactor));
469 PointerEvent* pointerEvent = m_pointerEventFactory.create( 467 PointerEvent* pointerEvent = m_pointerEventFactory.create(
470 pointerEventNameForTouchPointState(touchPoint.state()), 468 pointerEventNameForTouchPointState(touchPoint.state()),
471 touchPoint, event.getModifiers(), 469 touchPoint, event.getModifiers(),
472 touchPoint.radius().scaledBy(scaleFactor), 470 touchPoint.radius().scaledBy(scaleFactor),
473 framePoint, 471 framePoint,
474 touchInfo.touchNode ? 472 touchInfo.touchNode ?
475 touchInfo.touchNode->document().domWindow() : nullptr); 473 touchInfo.touchNode->document().domWindow() : nullptr);
476 474
477 result = sendTouchPointerEvent(touchInfo.touchNode, pointerEvent); 475 WebInputEventResult result = sendTouchPointerEvent(touchInfo.touchNo de, pointerEvent);
476
477 // If a pointerdown has been canceled, queue the unique id to allow
478 // suppressing mouse events from gesture events. For mouse events
479 // fired from GestureTap & GestureLongPress (which are triggered by
480 // single touches only), it is enough to queue the ids only for
481 // primary pointers.
482 // TODO(mustaq): What about other cases (e.g. GestureTwoFingerTap)?
483 if (result != WebInputEventResult::NotHandled
484 && pointerEvent->type() == EventTypeNames::pointerdown
485 && pointerEvent->isPrimary()) {
486 m_touchIdsForCanceledPointerdowns.append(event.uniqueTouchEventI d());
487 }
478 } 488 }
479 // TODO(crbug.com/507408): Right now we add the touch point only if 489
480 // its pointer event is NotHandled (e.g. preventDefault is called in 490 touchInfos.append(touchInfo);
481 // the pointer event listener). This behavior needs to change as it
482 // may create some inconsistent touch event sequence.
483 if (result == WebInputEventResult::NotHandled) {
484 touchInfos.append(touchInfo);
485 }
486 } 491 }
487 } 492 }
488 493
489 WebInputEventResult PointerEventManager::sendTouchPointerEvent( 494 WebInputEventResult PointerEventManager::sendTouchPointerEvent(
490 EventTarget* target, PointerEvent* pointerEvent) 495 EventTarget* target, PointerEvent* pointerEvent)
491 { 496 {
492 if (m_inCanceledStateForPointerTypeTouch) 497 if (m_inCanceledStateForPointerTypeTouch)
493 return WebInputEventResult::NotHandled; 498 return WebInputEventResult::NotHandled;
494 499
495 processCaptureAndPositionOfPointerEvent(pointerEvent, target); 500 processCaptureAndPositionOfPointerEvent(pointerEvent, target);
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 { 597 {
593 } 598 }
594 599
595 void PointerEventManager::clear() 600 void PointerEventManager::clear()
596 { 601 {
597 for (auto& entry : m_preventMouseEventForPointerType) 602 for (auto& entry : m_preventMouseEventForPointerType)
598 entry = false; 603 entry = false;
599 m_touchEventManager.clear(); 604 m_touchEventManager.clear();
600 m_inCanceledStateForPointerTypeTouch = false; 605 m_inCanceledStateForPointerTypeTouch = false;
601 m_pointerEventFactory.clear(); 606 m_pointerEventFactory.clear();
607 m_touchIdsForCanceledPointerdowns.clear();
602 m_nodeUnderPointer.clear(); 608 m_nodeUnderPointer.clear();
603 m_pointerCaptureTarget.clear(); 609 m_pointerCaptureTarget.clear();
604 m_pendingPointerCaptureTarget.clear(); 610 m_pendingPointerCaptureTarget.clear();
605 } 611 }
606 612
607 void PointerEventManager::processCaptureAndPositionOfPointerEvent( 613 void PointerEventManager::processCaptureAndPositionOfPointerEvent(
608 PointerEvent* pointerEvent, 614 PointerEvent* pointerEvent,
609 EventTarget* hitTestTarget, 615 EventTarget* hitTestTarget,
610 EventTarget* lastNodeUnderMouse, 616 EventTarget* lastNodeUnderMouse,
611 const PlatformMouseEvent& mouseEvent, 617 const PlatformMouseEvent& mouseEvent,
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 const int pointerId) const 772 const int pointerId) const
767 { 773 {
768 return m_pointerEventFactory.getPointerType(pointerId); 774 return m_pointerEventFactory.getPointerType(pointerId);
769 } 775 }
770 776
771 bool PointerEventManager::isAnyTouchActive() const 777 bool PointerEventManager::isAnyTouchActive() const
772 { 778 {
773 return m_touchEventManager.isAnyTouchActive(); 779 return m_touchEventManager.isAnyTouchActive();
774 } 780 }
775 781
782 bool PointerEventManager::primaryPointerdownCanceled(uint32_t uniqueTouchEventId )
783 {
784 while (!m_touchIdsForCanceledPointerdowns.isEmpty()) {
dtapuska 2016/06/03 15:02:11 Can we add a comment that we never expect wrap aro
mustaq 2016/06/03 20:34:45 Done (but didn't mention you would be dead :-P).
785 uint32_t firstId = m_touchIdsForCanceledPointerdowns.first();
786 if (firstId > uniqueTouchEventId)
787 return false;
788 m_touchIdsForCanceledPointerdowns.takeFirst();
789 if (firstId == uniqueTouchEventId)
790 return true;
791 }
792 return false;
793 }
794
776 DEFINE_TRACE(PointerEventManager) 795 DEFINE_TRACE(PointerEventManager)
777 { 796 {
778 visitor->trace(m_frame); 797 visitor->trace(m_frame);
779 visitor->trace(m_nodeUnderPointer); 798 visitor->trace(m_nodeUnderPointer);
780 visitor->trace(m_pointerCaptureTarget); 799 visitor->trace(m_pointerCaptureTarget);
781 visitor->trace(m_pendingPointerCaptureTarget); 800 visitor->trace(m_pendingPointerCaptureTarget);
782 visitor->trace(m_touchEventManager); 801 visitor->trace(m_touchEventManager);
783 } 802 }
784 803
785 804
786 } // namespace blink 805 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698