Chromium Code Reviews| 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/shadow/FlatTreeTraversal.h" | 7 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 8 #include "core/events/MouseEvent.h" | 8 #include "core/events/MouseEvent.h" |
| 9 #include "core/input/EventHandler.h" | 9 #include "core/input/EventHandler.h" |
| 10 | 10 |
| 11 namespace blink { | 11 namespace blink { |
| 12 | 12 |
| 13 namespace { | 13 namespace { |
| 14 | 14 |
| 15 inline size_t toPointerIndex(WebPointerProperties::PointerType t) { return stati c_cast<size_t>(t); } | |
|
mustaq
2016/04/07 19:30:02
toPointerTypeIndex? Or I guess toInt is even bette
Navid Zolghadr
2016/04/08 17:38:44
It was toInt but Dave also suggested we are using
| |
| 16 | |
| 15 const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint::Touch State state) | 17 const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint::Touch State state) |
| 16 { | 18 { |
| 17 switch (state) { | 19 switch (state) { |
| 18 case PlatformTouchPoint::TouchReleased: | 20 case PlatformTouchPoint::TouchReleased: |
| 19 return EventTypeNames::pointerup; | 21 return EventTypeNames::pointerup; |
| 20 case PlatformTouchPoint::TouchCancelled: | 22 case PlatformTouchPoint::TouchCancelled: |
| 21 return EventTypeNames::pointercancel; | 23 return EventTypeNames::pointercancel; |
| 22 case PlatformTouchPoint::TouchPressed: | 24 case PlatformTouchPoint::TouchPressed: |
| 23 return EventTypeNames::pointerdown; | 25 return EventTypeNames::pointerdown; |
| 24 case PlatformTouchPoint::TouchMoved: | 26 case PlatformTouchPoint::TouchMoved: |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents | 115 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents |
| 114 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 116 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = |
| 115 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, | 117 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, |
| 116 nullptr, view); | 118 nullptr, view); |
| 117 | 119 |
| 118 // TODO(crbug/545647): This state should reset with pointercancel too. | 120 // TODO(crbug/545647): This state should reset with pointercancel too. |
| 119 // This function also gets called for compat mouse events of touch at this | 121 // This function also gets called for compat mouse events of touch at this |
| 120 // stage. So if the event is not frame boundary transition it is only a | 122 // stage. So if the event is not frame boundary transition it is only a |
| 121 // compatibility mouse event and we do not need to change pointer event | 123 // compatibility mouse event and we do not need to change pointer event |
| 122 // behavior regarding preventMouseEvent state in that case. | 124 // behavior regarding preventMouseEvent state in that case. |
| 123 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0) { | 125 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0 |
| 124 m_preventMouseEventForPointerTypeMouse = false; | 126 && pointerEvent->isPrimary()) { |
| 127 m_preventMouseEventForPointerType[toPointerIndex( | |
| 128 mouseEvent.pointerProperties().pointerType)] = false; | |
| 125 } | 129 } |
| 126 | 130 |
| 127 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, | 131 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, |
| 128 exitedNode, mouseEvent, true, isFrameBoundaryTransition); | 132 exitedNode, mouseEvent, true, isFrameBoundaryTransition); |
| 129 } | 133 } |
| 130 | 134 |
| 131 void PointerEventManager::sendNodeTransitionEvents( | 135 void PointerEventManager::sendNodeTransitionEvents( |
| 132 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, | 136 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, |
| 133 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, | 137 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, |
| 134 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 138 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 349 PassRefPtrWillBeRawPtr<Node> lastNodeUnderMouse) | 353 PassRefPtrWillBeRawPtr<Node> lastNodeUnderMouse) |
| 350 { | 354 { |
| 351 RefPtrWillBeRawPtr<Node> target = prpTarget; | 355 RefPtrWillBeRawPtr<Node> target = prpTarget; |
| 352 | 356 |
| 353 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = | 357 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = |
| 354 m_pointerEventFactory.create(mouseEventType, mouseEvent, | 358 m_pointerEventFactory.create(mouseEventType, mouseEvent, |
| 355 relatedTarget, view); | 359 relatedTarget, view); |
| 356 | 360 |
| 357 // This is for when the mouse is released outside of the page. | 361 // This is for when the mouse is released outside of the page. |
| 358 if (pointerEvent->type() == EventTypeNames::pointermove | 362 if (pointerEvent->type() == EventTypeNames::pointermove |
| 359 && !pointerEvent->buttons()) { | 363 && !pointerEvent->buttons() |
| 360 m_preventMouseEventForPointerTypeMouse = false; | 364 && pointerEvent->isPrimary()) { |
| 365 m_preventMouseEventForPointerType[toPointerIndex( | |
| 366 mouseEvent.pointerProperties().pointerType)] = false; | |
| 361 } | 367 } |
| 362 | 368 |
| 363 processCaptureAndPositionOfPointerEvent(pointerEvent, target, | 369 processCaptureAndPositionOfPointerEvent(pointerEvent, target, |
| 364 lastNodeUnderMouse, mouseEvent, true, true); | 370 lastNodeUnderMouse, mouseEvent, true, true); |
| 365 | 371 |
| 366 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = | 372 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = |
| 367 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); | 373 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); |
| 368 | 374 |
| 369 WebInputEventResult result = | 375 WebInputEventResult result = |
| 370 dispatchPointerEvent(effectiveTarget, pointerEvent); | 376 dispatchPointerEvent(effectiveTarget, pointerEvent); |
| 371 | 377 |
| 372 if (result != WebInputEventResult::NotHandled | 378 if (result != WebInputEventResult::NotHandled |
| 373 && pointerEvent->type() == EventTypeNames::pointerdown) | 379 && pointerEvent->type() == EventTypeNames::pointerdown |
| 374 m_preventMouseEventForPointerTypeMouse = true; | 380 && pointerEvent->isPrimary()) { |
| 381 m_preventMouseEventForPointerType[toPointerIndex( | |
| 382 mouseEvent.pointerProperties().pointerType)] = true; | |
| 383 } | |
| 375 | 384 |
| 376 if (!m_preventMouseEventForPointerTypeMouse) { | 385 if (pointerEvent->isPrimary() && !m_preventMouseEventForPointerType[toPointe rIndex( |
| 386 mouseEvent.pointerProperties().pointerType)]) { | |
| 377 result = EventHandler::mergeEventResult(result, | 387 result = EventHandler::mergeEventResult(result, |
| 378 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, | 388 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, |
| 379 nullptr, clickCount)); | 389 nullptr, clickCount)); |
| 380 } | 390 } |
| 381 | 391 |
| 382 if (pointerEvent->buttons() == 0) { | 392 if (pointerEvent->buttons() == 0) { |
| 383 releasePointerCapture(pointerEvent->pointerId()); | 393 releasePointerCapture(pointerEvent->pointerId()); |
| 384 m_preventMouseEventForPointerTypeMouse = false; | 394 if (pointerEvent->isPrimary()) { |
| 395 m_preventMouseEventForPointerType[toPointerIndex( | |
| 396 mouseEvent.pointerProperties().pointerType)] = false; | |
| 397 } | |
| 385 } | 398 } |
| 386 | 399 |
| 387 return result; | 400 return result; |
| 388 } | 401 } |
| 389 | 402 |
| 390 PointerEventManager::PointerEventManager() | 403 PointerEventManager::PointerEventManager() |
| 391 { | 404 { |
| 392 clear(); | 405 clear(); |
| 393 } | 406 } |
| 394 | 407 |
| 395 PointerEventManager::~PointerEventManager() | 408 PointerEventManager::~PointerEventManager() |
| 396 { | 409 { |
| 397 } | 410 } |
| 398 | 411 |
| 399 void PointerEventManager::clear() | 412 void PointerEventManager::clear() |
| 400 { | 413 { |
| 401 m_preventMouseEventForPointerTypeMouse = false; | 414 for (auto& entry : m_preventMouseEventForPointerType) |
| 415 entry = false; | |
| 402 m_pointerEventFactory.clear(); | 416 m_pointerEventFactory.clear(); |
| 403 m_nodeUnderPointer.clear(); | 417 m_nodeUnderPointer.clear(); |
| 404 } | 418 } |
| 405 | 419 |
| 406 void PointerEventManager::processCaptureAndPositionOfPointerEvent( | 420 void PointerEventManager::processCaptureAndPositionOfPointerEvent( |
| 407 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 421 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
| 408 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, | 422 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, |
| 409 const PassRefPtrWillBeRawPtr<EventTarget> lastNodeUnderMouse, | 423 const PassRefPtrWillBeRawPtr<EventTarget> lastNodeUnderMouse, |
| 410 const PlatformMouseEvent& mouseEvent, | 424 const PlatformMouseEvent& mouseEvent, |
| 411 bool sendMouseEvent, bool setPointerPosition) | 425 bool sendMouseEvent, bool setPointerPosition) |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 570 { | 584 { |
| 571 #if ENABLE(OILPAN) | 585 #if ENABLE(OILPAN) |
| 572 visitor->trace(m_nodeUnderPointer); | 586 visitor->trace(m_nodeUnderPointer); |
| 573 visitor->trace(m_pointerCaptureTarget); | 587 visitor->trace(m_pointerCaptureTarget); |
| 574 visitor->trace(m_pendingPointerCaptureTarget); | 588 visitor->trace(m_pendingPointerCaptureTarget); |
| 575 #endif | 589 #endif |
| 576 } | 590 } |
| 577 | 591 |
| 578 | 592 |
| 579 } // namespace blink | 593 } // namespace blink |
| OLD | NEW |