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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 |