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

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

Powered by Google App Engine
This is Rietveld 408576698