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

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

Powered by Google App Engine
This is Rietveld 408576698