| 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/ElementTraversal.h" |
| 7 #include "core/dom/shadow/FlatTreeTraversal.h" | 8 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 8 #include "core/events/MouseEvent.h" | 9 #include "core/events/MouseEvent.h" |
| 10 #include "core/html/HTMLCanvasElement.h" |
| 9 #include "core/input/EventHandler.h" | 11 #include "core/input/EventHandler.h" |
| 10 | 12 |
| 11 namespace blink { | 13 namespace blink { |
| 12 | 14 |
| 13 namespace { | 15 namespace { |
| 14 | 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: |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 m_preventMouseEventForPointerTypeMouse = false; |
| 125 } | 127 } |
| 126 | 128 |
| 127 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, | 129 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, |
| 128 exitedNode, mouseEvent, true, isFrameBoundaryTransition); | 130 exitedNode, mouseEvent, true, isFrameBoundaryTransition); |
| 129 } | 131 } |
| 130 | 132 |
| 133 PlatformMouseEvent PointerEventManager::mouseEventWithRegion(Node* node, const P
latformMouseEvent& mouseEvent) |
| 134 { |
| 135 if (!node->isElementNode()) |
| 136 return mouseEvent; |
| 137 |
| 138 Element* element = toElement(node); |
| 139 if (!element->isInCanvasSubtree()) |
| 140 return mouseEvent; |
| 141 |
| 142 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel
f(*element); |
| 143 // In this case, the event target is canvas and mouse rerouting doesn't happ
en. |
| 144 if (canvas == element) |
| 145 return mouseEvent; |
| 146 String region = canvas->getIdFromControl(element); |
| 147 PlatformMouseEvent newMouseEvent = mouseEvent; |
| 148 newMouseEvent.setRegion(region); |
| 149 return newMouseEvent; |
| 150 } |
| 151 |
| 131 void PointerEventManager::sendNodeTransitionEvents( | 152 void PointerEventManager::sendNodeTransitionEvents( |
| 132 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, | 153 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, |
| 133 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, | 154 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, |
| 134 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 155 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
| 135 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) | 156 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
| 136 { | 157 { |
| 137 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; | 158 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; |
| 138 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; | 159 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; |
| 139 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 160 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
| 140 | 161 |
| 141 if (exitedTarget == enteredTarget) | 162 if (exitedTarget == enteredTarget) |
| 142 return; | 163 return; |
| 143 | 164 |
| 144 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId(
))) { | 165 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId(
))) { |
| 145 if (capturingTarget == exitedTarget) | 166 if (capturingTarget == exitedTarget) |
| 146 enteredTarget = nullptr; | 167 enteredTarget = nullptr; |
| 147 else if (capturingTarget == enteredTarget) | 168 else if (capturingTarget == enteredTarget) |
| 148 exitedTarget = nullptr; | 169 exitedTarget = nullptr; |
| 149 else | 170 else |
| 150 return; | 171 return; |
| 151 } | 172 } |
| 152 | 173 |
| 153 // Dispatch pointerout/mouseout events | 174 // Dispatch pointerout/mouseout events |
| 154 if (isInDocument(exitedTarget)) { | 175 if (isInDocument(exitedTarget)) { |
| 155 if (!sendMouseEvent) { | 176 if (!sendMouseEvent) { |
| 156 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erTransitionEvent( | 177 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erTransitionEvent( |
| 157 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 178 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
| 158 } else { | 179 } else { |
| 159 dispatchMouseEvent(exitedTarget, | 180 dispatchMouseEvent(exitedTarget, |
| 160 EventTypeNames::mouseout, mouseEvent, enteredTarget); | 181 EventTypeNames::mouseout, |
| 182 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 183 enteredTarget); |
| 161 } | 184 } |
| 162 } | 185 } |
| 163 | 186 |
| 164 // Create lists of all exited/entered ancestors, locate the common ancestor | 187 // Create lists of all exited/entered ancestors, locate the common ancestor |
| 165 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; | 188 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; |
| 166 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; | 189 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; |
| 167 if (isInDocument(exitedTarget)) { | 190 if (isInDocument(exitedTarget)) { |
| 168 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); | 191 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); |
| 169 exitedNode->updateDistribution(); | 192 exitedNode->updateDistribution(); |
| 170 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr
aversal::parent(*node)) | 193 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr
aversal::parent(*node)) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 | 242 |
| 220 // Dispatch pointerleave/mouseleave events, in child-to-parent order. | 243 // Dispatch pointerleave/mouseleave events, in child-to-parent order. |
| 221 for (size_t j = 0; j < exitedAncestorIndex; j++) { | 244 for (size_t j = 0; j < exitedAncestorIndex; j++) { |
| 222 if (!sendMouseEvent) { | 245 if (!sendMouseEvent) { |
| 223 dispatchPointerEvent(exitedAncestors[j].get(), | 246 dispatchPointerEvent(exitedAncestors[j].get(), |
| 224 m_pointerEventFactory.createPointerTransitionEvent( | 247 m_pointerEventFactory.createPointerTransitionEvent( |
| 225 pointerEvent, EventTypeNames::pointerleave, enteredTarget), | 248 pointerEvent, EventTypeNames::pointerleave, enteredTarget), |
| 226 !exitedNodeHasCapturingAncestor); | 249 !exitedNodeHasCapturingAncestor); |
| 227 } else { | 250 } else { |
| 228 dispatchMouseEvent(exitedAncestors[j].get(), | 251 dispatchMouseEvent(exitedAncestors[j].get(), |
| 229 EventTypeNames::mouseleave, mouseEvent, enteredTarget, | 252 EventTypeNames::mouseleave, |
| 230 0, !exitedNodeHasCapturingAncestor); | 253 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 254 enteredTarget, 0, !exitedNodeHasCapturingAncestor); |
| 231 } | 255 } |
| 232 } | 256 } |
| 233 | 257 |
| 234 // Dispatch pointerover/mouseover. | 258 // Dispatch pointerover/mouseover. |
| 235 if (isInDocument(enteredTarget)) { | 259 if (isInDocument(enteredTarget)) { |
| 236 if (!sendMouseEvent) { | 260 if (!sendMouseEvent) { |
| 237 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin
terTransitionEvent( | 261 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin
terTransitionEvent( |
| 238 pointerEvent, EventTypeNames::pointerover, exitedTarget)); | 262 pointerEvent, EventTypeNames::pointerover, exitedTarget)); |
| 239 } else { | 263 } else { |
| 240 dispatchMouseEvent(enteredTarget, | 264 dispatchMouseEvent(enteredTarget, |
| (...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 { | 594 { |
| 571 #if ENABLE(OILPAN) | 595 #if ENABLE(OILPAN) |
| 572 visitor->trace(m_nodeUnderPointer); | 596 visitor->trace(m_nodeUnderPointer); |
| 573 visitor->trace(m_pointerCaptureTarget); | 597 visitor->trace(m_pointerCaptureTarget); |
| 574 visitor->trace(m_pendingPointerCaptureTarget); | 598 visitor->trace(m_pendingPointerCaptureTarget); |
| 575 #endif | 599 #endif |
| 576 } | 600 } |
| 577 | 601 |
| 578 | 602 |
| 579 } // namespace blink | 603 } // namespace blink |
| OLD | NEW |