Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(181)

Side by Side Diff: third_party/WebKit/Source/core/input/PointerEventManager.cpp

Issue 1815093002: Canvas2d: fix event.region being null on mouseleave/out events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 30 matching lines...) Expand all
49 Node* targetNode = target->toNode(); 51 Node* targetNode = target->toNode();
50 MouseEvent* event = MouseEvent::create(mouseEventType, 52 MouseEvent* event = MouseEvent::create(mouseEventType,
51 targetNode->document().domWindow(), mouseEvent, detail, 53 targetNode->document().domWindow(), mouseEvent, detail,
52 relatedTarget ? relatedTarget->toNode() : nullptr); 54 relatedTarget ? relatedTarget->toNode() : nullptr);
53 DispatchEventResult dispatchResult = target->dispatchEvent(event); 55 DispatchEventResult dispatchResult = target->dispatchEvent(event);
54 return EventHandler::toWebInputEventResult(dispatchResult); 56 return EventHandler::toWebInputEventResult(dispatchResult);
55 } 57 }
56 return WebInputEventResult::NotHandled; 58 return WebInputEventResult::NotHandled;
57 } 59 }
58 60
61 PlatformMouseEvent mouseEventWithRegion(Node* node, const PlatformMouseEvent& mo useEvent)
62 {
63 if (!node->isElementNode())
64 return mouseEvent;
65
66 Element* element = toElement(node);
67 if (!element->isInCanvasSubtree())
68 return mouseEvent;
69
70 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element);
71 // In this case, the event target is canvas and mouse rerouting doesn't happ en.
72 if (canvas == element)
73 return mouseEvent;
74 String region = canvas->getIdFromControl(element);
75 PlatformMouseEvent newMouseEvent = mouseEvent;
76 newMouseEvent.setRegion(region);
77 return newMouseEvent;
78 }
79
59 } // namespace 80 } // namespace
60 81
61 WebInputEventResult PointerEventManager::dispatchPointerEvent( 82 WebInputEventResult PointerEventManager::dispatchPointerEvent(
62 EventTarget* target, 83 EventTarget* target,
63 PointerEvent* pointerEvent, 84 PointerEvent* pointerEvent,
64 bool checkForListener) 85 bool checkForListener)
65 { 86 {
66 if (!target) 87 if (!target)
67 return WebInputEventResult::NotHandled; 88 return WebInputEventResult::NotHandled;
68 89
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 return; 162 return;
142 } 163 }
143 164
144 // Dispatch pointerout/mouseout events 165 // Dispatch pointerout/mouseout events
145 if (isInDocument(exitedTarget)) { 166 if (isInDocument(exitedTarget)) {
146 if (!sendMouseEvent) { 167 if (!sendMouseEvent) {
147 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint erTransitionEvent( 168 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint erTransitionEvent(
148 pointerEvent, EventTypeNames::pointerout, enteredTarget)); 169 pointerEvent, EventTypeNames::pointerout, enteredTarget));
149 } else { 170 } else {
150 dispatchMouseEvent(exitedTarget, 171 dispatchMouseEvent(exitedTarget,
151 EventTypeNames::mouseout, mouseEvent, enteredTarget); 172 EventTypeNames::mouseout,
173 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent),
174 enteredTarget);
152 } 175 }
153 } 176 }
154 177
155 // Create lists of all exited/entered ancestors, locate the common ancestor 178 // Create lists of all exited/entered ancestors, locate the common ancestor
156 HeapVector<Member<Node>, 32> exitedAncestors; 179 HeapVector<Member<Node>, 32> exitedAncestors;
157 HeapVector<Member<Node>, 32> enteredAncestors; 180 HeapVector<Member<Node>, 32> enteredAncestors;
158 if (isInDocument(exitedTarget)) { 181 if (isInDocument(exitedTarget)) {
159 Node* exitedNode = exitedTarget->toNode(); 182 Node* exitedNode = exitedTarget->toNode();
160 exitedNode->updateDistribution(); 183 exitedNode->updateDistribution();
161 for (Node* node = exitedNode; node; node = FlatTreeTraversal::parent(*no de)) 184 for (Node* node = exitedNode; node; node = FlatTreeTraversal::parent(*no de))
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 233
211 // Dispatch pointerleave/mouseleave events, in child-to-parent order. 234 // Dispatch pointerleave/mouseleave events, in child-to-parent order.
212 for (size_t j = 0; j < exitedAncestorIndex; j++) { 235 for (size_t j = 0; j < exitedAncestorIndex; j++) {
213 if (!sendMouseEvent) { 236 if (!sendMouseEvent) {
214 dispatchPointerEvent(exitedAncestors[j].get(), 237 dispatchPointerEvent(exitedAncestors[j].get(),
215 m_pointerEventFactory.createPointerTransitionEvent( 238 m_pointerEventFactory.createPointerTransitionEvent(
216 pointerEvent, EventTypeNames::pointerleave, enteredTarget), 239 pointerEvent, EventTypeNames::pointerleave, enteredTarget),
217 !exitedNodeHasCapturingAncestor); 240 !exitedNodeHasCapturingAncestor);
218 } else { 241 } else {
219 dispatchMouseEvent(exitedAncestors[j].get(), 242 dispatchMouseEvent(exitedAncestors[j].get(),
220 EventTypeNames::mouseleave, mouseEvent, enteredTarget, 243 EventTypeNames::mouseleave,
221 0, !exitedNodeHasCapturingAncestor); 244 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent),
245 enteredTarget, 0, !exitedNodeHasCapturingAncestor);
222 } 246 }
223 } 247 }
224 248
225 // Dispatch pointerover/mouseover. 249 // Dispatch pointerover/mouseover.
226 if (isInDocument(enteredTarget)) { 250 if (isInDocument(enteredTarget)) {
227 if (!sendMouseEvent) { 251 if (!sendMouseEvent) {
228 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin terTransitionEvent( 252 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin terTransitionEvent(
229 pointerEvent, EventTypeNames::pointerover, exitedTarget)); 253 pointerEvent, EventTypeNames::pointerover, exitedTarget));
230 } else { 254 } else {
231 dispatchMouseEvent(enteredTarget, 255 dispatchMouseEvent(enteredTarget,
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
570 594
571 DEFINE_TRACE(PointerEventManager) 595 DEFINE_TRACE(PointerEventManager)
572 { 596 {
573 visitor->trace(m_nodeUnderPointer); 597 visitor->trace(m_nodeUnderPointer);
574 visitor->trace(m_pointerCaptureTarget); 598 visitor->trace(m_pointerCaptureTarget);
575 visitor->trace(m_pendingPointerCaptureTarget); 599 visitor->trace(m_pendingPointerCaptureTarget);
576 } 600 }
577 601
578 602
579 } // namespace blink 603 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698