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

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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 // compatibility mouse event and we do not need to change pointer event 123 // compatibility mouse event and we do not need to change pointer event
122 // behavior regarding preventMouseEvent state in that case. 124 // behavior regarding preventMouseEvent state in that case.
123 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0) { 125 if (isFrameBoundaryTransition && pointerEvent->buttons() == 0) {
124 m_preventMouseEventForPointerTypeMouse = false; 126 m_preventMouseEventForPointerTypeMouse = false;
125 } 127 }
126 128
127 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode, 129 processCaptureAndPositionOfPointerEvent(pointerEvent, enteredNode,
128 exitedNode, mouseEvent, true, isFrameBoundaryTransition); 130 exitedNode, mouseEvent, true, isFrameBoundaryTransition);
129 } 131 }
130 132
133 PlatformMouseEvent PointerEventManager::mouseEventWithRegion(Node* node, const P latformMouseEvent& mouseEvent)
134 {
135 if (!node->isElementNode())
136 return mouseEvent;
137
138 Element* element = toElement(node);
139 if (!element->isInCanvasSubtree())
140 return mouseEvent;
141
142 HTMLCanvasElement* canvas = Traversal<HTMLCanvasElement>::firstAncestorOrSel f(*element);
143 // In this case, the event target is canvas and mouse rerouting doesn't happ en.
144 if (canvas == element)
145 return mouseEvent;
146 String region = canvas->getIdFromControl(element);
147 PlatformMouseEvent newMouseEvent = mouseEvent;
148 newMouseEvent.setRegion(region);
149 return newMouseEvent;
150 }
151
131 void PointerEventManager::sendNodeTransitionEvents( 152 void PointerEventManager::sendNodeTransitionEvents(
132 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, 153 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget,
133 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, 154 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget,
134 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 155 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
135 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) 156 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
136 { 157 {
137 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; 158 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget;
138 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; 159 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget;
139 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 160 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
140 161
141 if (exitedTarget == enteredTarget) 162 if (exitedTarget == enteredTarget)
142 return; 163 return;
143 164
144 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId( ))) { 165 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId( ))) {
145 if (capturingTarget == exitedTarget) 166 if (capturingTarget == exitedTarget)
146 enteredTarget = nullptr; 167 enteredTarget = nullptr;
147 else if (capturingTarget == enteredTarget) 168 else if (capturingTarget == enteredTarget)
148 exitedTarget = nullptr; 169 exitedTarget = nullptr;
149 else 170 else
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