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 |