| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 RefPtrWillBeRawPtr<Node> targetNode = target->toNode(); | 53 RefPtrWillBeRawPtr<Node> targetNode = target->toNode(); |
| 52 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType
, | 54 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType
, |
| 53 targetNode->document().domWindow(), mouseEvent, detail, | 55 targetNode->document().domWindow(), mouseEvent, detail, |
| 54 relatedTarget ? relatedTarget->toNode() : nullptr); | 56 relatedTarget ? relatedTarget->toNode() : nullptr); |
| 55 DispatchEventResult dispatchResult = target->dispatchEvent(event); | 57 DispatchEventResult dispatchResult = target->dispatchEvent(event); |
| 56 return EventHandler::toWebInputEventResult(dispatchResult); | 58 return EventHandler::toWebInputEventResult(dispatchResult); |
| 57 } | 59 } |
| 58 return WebInputEventResult::NotHandled; | 60 return WebInputEventResult::NotHandled; |
| 59 } | 61 } |
| 60 | 62 |
| 63 PlatformMouseEvent mouseEventWithRegion(Node* node, const PlatformMouseEvent& mo
useEvent) |
| 64 { |
| 65 if (!node->isElementNode()) |
| 66 return mouseEvent; |
| 67 |
| 68 Element* element = toElement(node); |
| 69 if (!element->isInCanvasSubtree()) |
| 70 return mouseEvent; |
| 71 |
| 72 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel
f(*element); |
| 73 // In this case, the event target is canvas and mouse rerouting doesn't happ
en. |
| 74 if (canvas == element) |
| 75 return mouseEvent; |
| 76 String region = canvas->getIdFromControl(element); |
| 77 PlatformMouseEvent newMouseEvent = mouseEvent; |
| 78 newMouseEvent.setRegion(region); |
| 79 return newMouseEvent; |
| 80 } |
| 81 |
| 61 } // namespace | 82 } // namespace |
| 62 | 83 |
| 63 WebInputEventResult PointerEventManager::dispatchPointerEvent( | 84 WebInputEventResult PointerEventManager::dispatchPointerEvent( |
| 64 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, | 85 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, |
| 65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, | 86 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, |
| 66 bool checkForListener) | 87 bool checkForListener) |
| 67 { | 88 { |
| 68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; | 89 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; |
| 69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; | 90 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; |
| 70 | 91 |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 else | 173 else |
| 153 return; | 174 return; |
| 154 } | 175 } |
| 155 | 176 |
| 156 // Dispatch pointerout/mouseout events | 177 // Dispatch pointerout/mouseout events |
| 157 if (isInDocument(exitedTarget)) { | 178 if (isInDocument(exitedTarget)) { |
| 158 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr
ansitionEvent( | 179 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr
ansitionEvent( |
| 159 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 180 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
| 160 if (sendMouseEvent) { | 181 if (sendMouseEvent) { |
| 161 dispatchMouseEvent(exitedTarget, | 182 dispatchMouseEvent(exitedTarget, |
| 162 EventTypeNames::mouseout, mouseEvent, enteredTarget); | 183 EventTypeNames::mouseout, |
| 184 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 185 enteredTarget); |
| 163 } | 186 } |
| 164 } | 187 } |
| 165 | 188 |
| 166 // Create lists of all exited/entered ancestors, locate the common ancestor | 189 // Create lists of all exited/entered ancestors, locate the common ancestor |
| 167 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; | 190 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; |
| 168 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; | 191 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; |
| 169 if (isInDocument(exitedTarget)) { | 192 if (isInDocument(exitedTarget)) { |
| 170 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); | 193 RefPtrWillBeRawPtr<Node> exitedNode = exitedTarget->toNode(); |
| 171 exitedNode->updateDistribution(); | 194 exitedNode->updateDistribution(); |
| 172 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr
aversal::parent(*node)) | 195 for (RefPtrWillBeRawPtr<Node> node = exitedNode; node; node = FlatTreeTr
aversal::parent(*node)) |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 } | 243 } |
| 221 | 244 |
| 222 // Dispatch pointerleave/mouseleave events, in child-to-parent order. | 245 // Dispatch pointerleave/mouseleave events, in child-to-parent order. |
| 223 for (size_t j = 0; j < exitedAncestorIndex; j++) { | 246 for (size_t j = 0; j < exitedAncestorIndex; j++) { |
| 224 dispatchPointerEvent(exitedAncestors[j].get(), | 247 dispatchPointerEvent(exitedAncestors[j].get(), |
| 225 m_pointerEventFactory.createPointerTransitionEvent( | 248 m_pointerEventFactory.createPointerTransitionEvent( |
| 226 pointerEvent, EventTypeNames::pointerleave, enteredTarget), | 249 pointerEvent, EventTypeNames::pointerleave, enteredTarget), |
| 227 !exitedNodeHasCapturingAncestor); | 250 !exitedNodeHasCapturingAncestor); |
| 228 if (sendMouseEvent) { | 251 if (sendMouseEvent) { |
| 229 dispatchMouseEvent(exitedAncestors[j].get(), | 252 dispatchMouseEvent(exitedAncestors[j].get(), |
| 230 EventTypeNames::mouseleave, mouseEvent, enteredTarget, | 253 EventTypeNames::mouseleave, |
| 231 0, !exitedNodeHasCapturingAncestor); | 254 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 255 enteredTarget, 0, !exitedNodeHasCapturingAncestor); |
| 232 } | 256 } |
| 233 } | 257 } |
| 234 | 258 |
| 235 // Dispatch pointerover/mouseover. | 259 // Dispatch pointerover/mouseover. |
| 236 if (isInDocument(enteredTarget)) { | 260 if (isInDocument(enteredTarget)) { |
| 237 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT
ransitionEvent( | 261 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT
ransitionEvent( |
| 238 pointerEvent, EventTypeNames::pointerover, exitedTarget)); | 262 pointerEvent, EventTypeNames::pointerover, exitedTarget)); |
| 239 if (sendMouseEvent) { | 263 if (sendMouseEvent) { |
| 240 dispatchMouseEvent(enteredTarget, | 264 dispatchMouseEvent(enteredTarget, |
| 241 EventTypeNames::mouseover, mouseEvent, exitedTarget); | 265 EventTypeNames::mouseover, mouseEvent, exitedTarget); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 { | 555 { |
| 532 #if ENABLE(OILPAN) | 556 #if ENABLE(OILPAN) |
| 533 visitor->trace(m_nodeUnderPointer); | 557 visitor->trace(m_nodeUnderPointer); |
| 534 visitor->trace(m_pointerCaptureTarget); | 558 visitor->trace(m_pointerCaptureTarget); |
| 535 visitor->trace(m_pendingPointerCaptureTarget); | 559 visitor->trace(m_pendingPointerCaptureTarget); |
| 536 #endif | 560 #endif |
| 537 } | 561 } |
| 538 | 562 |
| 539 | 563 |
| 540 } // namespace blink | 564 } // namespace blink |
| OLD | NEW |