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

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

Issue 1774913004: Firing got/lost pointer capture events (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add the extra test Created 4 years, 9 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
« no previous file with comments | « third_party/WebKit/Source/core/input/PointerEventManager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/shadow/FlatTreeTraversal.h" 7 #include "core/dom/shadow/FlatTreeTraversal.h"
8 #include "core/events/MouseEvent.h" 8 #include "core/events/MouseEvent.h"
9 #include "core/input/EventHandler.h" 9 #include "core/input/EventHandler.h"
10 10
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 62
63 WebInputEventResult PointerEventManager::dispatchPointerEvent( 63 WebInputEventResult PointerEventManager::dispatchPointerEvent(
64 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, 64 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
66 bool checkForListener) 66 bool checkForListener)
67 { 67 {
68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
70 70
71 // Set whether node under pointer has received pointerover or not. 71 // Set whether node under pointer has received pointerover or not.
72 int pointerId = pointerEvent->pointerId(); 72 const int pointerId = pointerEvent->pointerId();
73 if ((pointerEvent->type() == EventTypeNames::pointerout 73 const AtomicString& pointerType = pointerEvent->type();
Rick Byers 2016/03/14 19:19:15 nit: maybe call this 'eventType'? 'pointerType' s
Navid Zolghadr 2016/03/14 19:31:20 Done.
74 || pointerEvent->type() == EventTypeNames::pointerover) 74 if ((pointerType == EventTypeNames::pointerout
75 || pointerType == EventTypeNames::pointerover)
75 && m_nodeUnderPointer.contains(pointerId)) { 76 && m_nodeUnderPointer.contains(pointerId)) {
76 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer = 77 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer =
77 m_nodeUnderPointer.get(pointerId).target; 78 m_nodeUnderPointer.get(pointerId).target;
78 if (targetUnderPointer == target) { 79 if (targetUnderPointer == target) {
79 m_nodeUnderPointer.set(pointerId, EventTargetAttributes 80 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
80 (targetUnderPointer, 81 (targetUnderPointer,
81 pointerEvent->type() == EventTypeNames::pointerover)); 82 pointerType == EventTypeNames::pointerover));
82 } 83 }
83 } 84 }
85
86 // TODO(crbug.com/587955): The following is a hack to work around this bug
87 if (pointerId == 1) {
88 if (pointerType == EventTypeNames::pointerover) {
89 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
90 (target, true));
91 }
92 if (pointerType == EventTypeNames::pointerout
93 && m_nodeUnderPointer.get(pointerId).target == target) {
94 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
95 (target, false));
96 }
97 }
98
84 if (!RuntimeEnabledFeatures::pointerEventEnabled()) 99 if (!RuntimeEnabledFeatures::pointerEventEnabled())
85 return WebInputEventResult::NotHandled; 100 return WebInputEventResult::NotHandled;
86 if (!checkForListener || target->hasEventListeners(pointerEvent->type())) { 101 if (!checkForListener || target->hasEventListeners(pointerType)) {
87 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ; 102 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ;
88 return EventHandler::toWebInputEventResult(dispatchResult); 103 return EventHandler::toWebInputEventResult(dispatchResult);
89 } 104 }
90 return WebInputEventResult::NotHandled; 105 return WebInputEventResult::NotHandled;
91 } 106 }
92 107
93 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent( 108 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent(
94 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId) 109 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId)
95 { 110 {
96 if (EventTarget* capturingTarget = getCapturingNode(pointerId)) 111 if (EventTarget* capturingTarget = getCapturingNode(pointerId))
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 if (capturingTarget == exitedTarget) 148 if (capturingTarget == exitedTarget)
134 enteredTarget = nullptr; 149 enteredTarget = nullptr;
135 else if (capturingTarget == enteredTarget) 150 else if (capturingTarget == enteredTarget)
136 exitedTarget = nullptr; 151 exitedTarget = nullptr;
137 else 152 else
138 return; 153 return;
139 } 154 }
140 155
141 // Dispatch pointerout/mouseout events 156 // Dispatch pointerout/mouseout events
142 if (isInDocument(exitedTarget)) { 157 if (isInDocument(exitedTarget)) {
143 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create( 158 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPointerTr ansitionEvent(
144 pointerEvent, EventTypeNames::pointerout, enteredTarget)); 159 pointerEvent, EventTypeNames::pointerout, enteredTarget));
145 if (sendMouseEvent) { 160 if (sendMouseEvent) {
146 dispatchMouseEvent(exitedTarget, 161 dispatchMouseEvent(exitedTarget,
147 EventTypeNames::mouseout, mouseEvent, enteredTarget); 162 EventTypeNames::mouseout, mouseEvent, enteredTarget);
148 } 163 }
149 } 164 }
150 165
151 // Create lists of all exited/entered ancestors, locate the common ancestor 166 // Create lists of all exited/entered ancestors, locate the common ancestor
152 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors; 167 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> exitedAncestors;
153 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors; 168 WillBeHeapVector<RefPtrWillBeMember<Node>, 32> enteredAncestors;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 for (size_t j = 0; j < exitedAncestors.size(); j++) { 215 for (size_t j = 0; j < exitedAncestors.size(); j++) {
201 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave) 216 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse leave)
202 || (RuntimeEnabledFeatures::pointerEventEnabled() 217 || (RuntimeEnabledFeatures::pointerEventEnabled()
203 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave))) 218 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po interleave)))
204 exitedNodeHasCapturingAncestor = true; 219 exitedNodeHasCapturingAncestor = true;
205 } 220 }
206 221
207 // Dispatch pointerleave/mouseleave events, in child-to-parent order. 222 // Dispatch pointerleave/mouseleave events, in child-to-parent order.
208 for (size_t j = 0; j < exitedAncestorIndex; j++) { 223 for (size_t j = 0; j < exitedAncestorIndex; j++) {
209 dispatchPointerEvent(exitedAncestors[j].get(), 224 dispatchPointerEvent(exitedAncestors[j].get(),
210 m_pointerEventFactory.create( 225 m_pointerEventFactory.createPointerTransitionEvent(
211 pointerEvent, EventTypeNames::pointerleave, enteredTarget), 226 pointerEvent, EventTypeNames::pointerleave, enteredTarget),
212 !exitedNodeHasCapturingAncestor); 227 !exitedNodeHasCapturingAncestor);
213 if (sendMouseEvent) { 228 if (sendMouseEvent) {
214 dispatchMouseEvent(exitedAncestors[j].get(), 229 dispatchMouseEvent(exitedAncestors[j].get(),
215 EventTypeNames::mouseleave, mouseEvent, enteredTarget, 230 EventTypeNames::mouseleave, mouseEvent, enteredTarget,
216 0, !exitedNodeHasCapturingAncestor); 231 0, !exitedNodeHasCapturingAncestor);
217 } 232 }
218 } 233 }
219 234
220 // Dispatch pointerover/mouseover. 235 // Dispatch pointerover/mouseover.
221 if (isInDocument(enteredTarget)) { 236 if (isInDocument(enteredTarget)) {
222 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.create( 237 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPointerT ransitionEvent(
223 pointerEvent, EventTypeNames::pointerover, exitedTarget)); 238 pointerEvent, EventTypeNames::pointerover, exitedTarget));
224 if (sendMouseEvent) { 239 if (sendMouseEvent) {
225 dispatchMouseEvent(enteredTarget, 240 dispatchMouseEvent(enteredTarget,
226 EventTypeNames::mouseover, mouseEvent, exitedTarget); 241 EventTypeNames::mouseover, mouseEvent, exitedTarget);
227 } 242 }
228 } 243 }
229 244
230 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because 245 // Defer locating capturing pointeenter/mouseenter listener until /after/ di spatching the leave events because
231 // the leave handlers might set a capturing enter handler. 246 // the leave handlers might set a capturing enter handler.
232 bool enteredNodeHasCapturingAncestor = false; 247 bool enteredNodeHasCapturingAncestor = false;
233 for (size_t i = 0; i < enteredAncestors.size(); i++) { 248 for (size_t i = 0; i < enteredAncestors.size(); i++) {
234 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter) 249 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous eenter)
235 || (RuntimeEnabledFeatures::pointerEventEnabled() 250 || (RuntimeEnabledFeatures::pointerEventEnabled()
236 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter))) 251 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p ointerenter)))
237 enteredNodeHasCapturingAncestor = true; 252 enteredNodeHasCapturingAncestor = true;
238 } 253 }
239 254
240 // Dispatch pointerenter/mouseenter events, in parent-to-child order. 255 // Dispatch pointerenter/mouseenter events, in parent-to-child order.
241 for (size_t i = enteredAncestorIndex; i > 0; i--) { 256 for (size_t i = enteredAncestorIndex; i > 0; i--) {
242 dispatchPointerEvent(enteredAncestors[i-1].get(), 257 dispatchPointerEvent(enteredAncestors[i-1].get(),
243 m_pointerEventFactory.create( 258 m_pointerEventFactory.createPointerTransitionEvent(
244 pointerEvent, EventTypeNames::pointerenter, exitedTarget), 259 pointerEvent, EventTypeNames::pointerenter, exitedTarget),
245 !enteredNodeHasCapturingAncestor); 260 !enteredNodeHasCapturingAncestor);
246 if (sendMouseEvent) { 261 if (sendMouseEvent) {
247 dispatchMouseEvent(enteredAncestors[i-1].get(), 262 dispatchMouseEvent(enteredAncestors[i-1].get(),
248 EventTypeNames::mouseenter, mouseEvent, exitedTarget, 263 EventTypeNames::mouseenter, mouseEvent, exitedTarget,
249 0, !enteredNodeHasCapturingAncestor); 264 0, !enteredNodeHasCapturingAncestor);
250 } 265 }
251 } 266 }
252 } 267 }
253 268
254 void PointerEventManager::setNodeUnderPointer( 269 void PointerEventManager::setNodeUnderPointer(
255 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 270 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
256 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) 271 PassRefPtrWillBeRawPtr<EventTarget> prpTarget)
257 { 272 {
258 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 273 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
259 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 274 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
260 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { 275 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) {
261 EventTargetAttributes node = m_nodeUnderPointer.get( 276 EventTargetAttributes node = m_nodeUnderPointer.get(
262 pointerEvent->pointerId()); 277 pointerEvent->pointerId());
263 if (!target) { 278 if (!target) {
264 m_nodeUnderPointer.remove(pointerEvent->pointerId()); 279 m_nodeUnderPointer.remove(pointerEvent->pointerId());
265 } else { 280 } else if (target
281 != m_nodeUnderPointer.get(pointerEvent->pointerId()).target) {
266 m_nodeUnderPointer.set(pointerEvent->pointerId(), 282 m_nodeUnderPointer.set(pointerEvent->pointerId(),
267 EventTargetAttributes(target, false)); 283 EventTargetAttributes(target, false));
268 } 284 }
269 sendNodeTransitionEvents(node.target, target, pointerEvent); 285 sendNodeTransitionEvents(node.target, target, pointerEvent);
270 } else if (target) { 286 } else if (target) {
271 m_nodeUnderPointer.add(pointerEvent->pointerId(), 287 m_nodeUnderPointer.add(pointerEvent->pointerId(),
272 EventTargetAttributes(target, false)); 288 EventTargetAttributes(target, false));
273 sendNodeTransitionEvents(nullptr, target, pointerEvent); 289 sendNodeTransitionEvents(nullptr, target, pointerEvent);
274 } 290 }
275 } 291 }
276 292
277 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> prpTarget, const PlatformTouchPoint& point) 293 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> prpTarget, const PlatformTouchPoint& point)
278 { 294 {
279 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 295 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
280 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.create PointerCancel(point); 296 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = m_pointerEventFactory.create PointerCancelEvent(point);
281 297
282 processPendingPointerCapture(pointerEvent, target); 298 processPendingPointerCapture(pointerEvent, target);
283 299
284 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing 300 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing
285 dispatchPointerEvent( 301 dispatchPointerEvent(
286 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), 302 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()),
287 pointerEvent.get()); 303 pointerEvent.get());
288 304
289 setNodeUnderPointer(pointerEvent, nullptr); 305 setNodeUnderPointer(pointerEvent, nullptr);
290 306
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 { 346 {
331 RefPtrWillBeRawPtr<Node> target = prpTarget; 347 RefPtrWillBeRawPtr<Node> target = prpTarget;
332 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 348 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
333 m_pointerEventFactory.create(mouseEventType, mouseEvent, 349 m_pointerEventFactory.create(mouseEventType, mouseEvent,
334 relatedTarget, view); 350 relatedTarget, view);
335 351
336 processPendingPointerCapture(pointerEvent, target, mouseEvent, true); 352 processPendingPointerCapture(pointerEvent, target, mouseEvent, true);
337 353
338 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending 354 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending
339 // transition events that should be first removed from EventHandler. 355 // transition events that should be first removed from EventHandler.
356 // setNodeUnderPointer(pointerEvent, target);
340 357
341 RefPtrWillBeRawPtr<EventTarget> effectiveTarget = 358 RefPtrWillBeRawPtr<EventTarget> effectiveTarget =
342 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()); 359 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId());
343 360
344 WebInputEventResult result = 361 WebInputEventResult result =
345 dispatchPointerEvent(effectiveTarget, pointerEvent); 362 dispatchPointerEvent(effectiveTarget, pointerEvent);
346 363
347 if (result != WebInputEventResult::NotHandled 364 if (result != WebInputEventResult::NotHandled
348 && pointerEvent->type() == EventTypeNames::pointerdown) 365 && pointerEvent->type() == EventTypeNames::pointerdown)
349 m_preventMouseEventForPointerTypeMouse = true; 366 m_preventMouseEventForPointerTypeMouse = true;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 if (MouseEvent::platformModifiersToButtons(modifiers) == 400 if (MouseEvent::platformModifiersToButtons(modifiers) ==
384 static_cast<unsigned short>(MouseEvent::Buttons::None)) 401 static_cast<unsigned short>(MouseEvent::Buttons::None))
385 m_preventMouseEventForPointerTypeMouse = false; 402 m_preventMouseEventForPointerTypeMouse = false;
386 } 403 }
387 404
388 void PointerEventManager::processPendingPointerCapture( 405 void PointerEventManager::processPendingPointerCapture(
389 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 406 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
390 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget, 407 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget,
391 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) 408 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
392 { 409 {
393 // TODO(nzolghadr): Process sending got/lostpointercapture
394 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 410 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
395 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget; 411 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget;
396 int pointerId = pointerEvent->pointerId(); 412 int pointerId = pointerEvent->pointerId();
397 bool hasPointerCaptureTarget = m_pointerCaptureTarget.contains(pointerId);
398 bool hasPendingPointerCaptureTarget = m_pendingPointerCaptureTarget.contains (pointerId);
399 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget = 413 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget =
400 hasPointerCaptureTarget ? m_pointerCaptureTarget.get(pointerId) : nullpt r; 414 m_pointerCaptureTarget.contains(pointerId)
415 ? m_pointerCaptureTarget.get(pointerId) : nullptr;
401 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget = 416 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget =
402 hasPendingPointerCaptureTarget ? m_pendingPointerCaptureTarget.get(point erId) : nullptr; 417 m_pendingPointerCaptureTarget.contains(pointerId)
418 ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr;
419 const EventTargetAttributes &nodeUnderPointerAtt =
420 m_nodeUnderPointer.contains(pointerId)
421 ? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes();
403 422
404 if (hasPendingPointerCaptureTarget 423 if (pointerCaptureTarget != pendingPointerCaptureTarget) {
405 && (pointerCaptureTarget != pendingPointerCaptureTarget)) { 424 if (pendingPointerCaptureTarget != nodeUnderPointerAtt.target
406 if (!hasPointerCaptureTarget 425 && nodeUnderPointerAtt.hasRecievedOverEvent) {
407 && pendingPointerCaptureTarget != hitTestTarget 426 sendNodeTransitionEvents(nodeUnderPointerAtt.target, nullptr,
408 && m_nodeUnderPointer.contains(pointerId) 427 pointerEvent, mouseEvent, sendMouseEvent);
409 && m_nodeUnderPointer.get(pointerId).hasRecievedOverEvent) { 428 }
410 sendNodeTransitionEvents(hitTestTarget, nullptr, pointerEvent, 429 if (pointerCaptureTarget) {
411 mouseEvent, sendMouseEvent); 430 // Re-target lostpointercapture to the document when the element is
431 // no longer participating in the tree.
432 EventTarget* target = pointerCaptureTarget.get();
433 if (target->toNode()
434 && !target->toNode()->inDocument()) {
435 target = target->toNode()->ownerDocument();
436 }
437 if (target) {
438 dispatchPointerEvent(target,
439 m_pointerEventFactory.createPointerCaptureEvent(
440 pointerEvent, EventTypeNames::lostpointercapture));
441 }
412 } 442 }
413 } 443 }
414 444
415 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does 445 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does
416 // affect the behavior of sendNodeTransitionEvents function. So the 446 // affect the behavior of sendNodeTransitionEvents function. So the
417 // ordering of the surrounding blocks of code is important. 447 // ordering of the surrounding blocks of code for sending transition events
418 if (!hasPendingPointerCaptureTarget) 448 // are important.
449 if (pendingPointerCaptureTarget)
450 m_pointerCaptureTarget.set(pointerId, pendingPointerCaptureTarget);
451 else
419 m_pointerCaptureTarget.remove(pointerId); 452 m_pointerCaptureTarget.remove(pointerId);
420 else
421 m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get( pointerId));
422 453
423 if (hasPointerCaptureTarget && (pointerCaptureTarget != pendingPointerCaptur eTarget)) { 454 if (pointerCaptureTarget != pendingPointerCaptureTarget) {
424 if (!hasPendingPointerCaptureTarget && pointerCaptureTarget != hitTestTa rget) { 455 if (pendingPointerCaptureTarget) {
456 dispatchPointerEvent(pendingPointerCaptureTarget,
457 m_pointerEventFactory.createPointerCaptureEvent(
458 pointerEvent, EventTypeNames::gotpointercapture));
459 }
460 if ((pendingPointerCaptureTarget == hitTestTarget
461 || !pendingPointerCaptureTarget)
462 && (nodeUnderPointerAtt.target != hitTestTarget
463 || !nodeUnderPointerAtt.hasRecievedOverEvent)) {
425 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent, 464 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent,
426 mouseEvent, sendMouseEvent); 465 mouseEvent, sendMouseEvent);
427 } 466 }
428 } 467 }
429
430 } 468 }
431 469
432 void PointerEventManager::removeTargetFromPointerCapturingMapping( 470 void PointerEventManager::removeTargetFromPointerCapturingMapping(
433 PointerCapturingMap& map, const EventTarget* target) 471 PointerCapturingMap& map, const EventTarget* target)
434 { 472 {
435 // We could have kept a reverse mapping to make this deletion possibly 473 // We could have kept a reverse mapping to make this deletion possibly
436 // faster but it adds some code complication which might not be worth of 474 // faster but it adds some code complication which might not be worth of
437 // the performance improvement considering there might not be a lot of 475 // the performance improvement considering there might not be a lot of
438 // active pointer or pointer captures at the same time. 476 // active pointer or pointer captures at the same time.
439 PointerCapturingMap tmp = map; 477 PointerCapturingMap tmp = map;
(...skipping 17 matching lines...) Expand all
457 if (m_pointerEventFactory.remove(pointerEvent)) { 495 if (m_pointerEventFactory.remove(pointerEvent)) {
458 int pointerId = pointerEvent->pointerId(); 496 int pointerId = pointerEvent->pointerId();
459 m_pendingPointerCaptureTarget.remove(pointerId); 497 m_pendingPointerCaptureTarget.remove(pointerId);
460 m_pointerCaptureTarget.remove(pointerId); 498 m_pointerCaptureTarget.remove(pointerId);
461 m_nodeUnderPointer.remove(pointerId); 499 m_nodeUnderPointer.remove(pointerId);
462 } 500 }
463 } 501 }
464 502
465 void PointerEventManager::elementRemoved(EventTarget* target) 503 void PointerEventManager::elementRemoved(EventTarget* target)
466 { 504 {
467 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target);
468 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t); 505 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t);
469 // TODO(nzolghadr): Process sending lostpointercapture to the document
470 } 506 }
471 507
472 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) 508 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target)
473 { 509 {
474 if (m_pointerEventFactory.isActiveButtonsState(pointerId)) 510 if (m_pointerEventFactory.isActiveButtonsState(pointerId))
475 m_pendingPointerCaptureTarget.set(pointerId, target); 511 m_pendingPointerCaptureTarget.set(pointerId, target);
476 } 512 }
477 513
478 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et) 514 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et)
479 { 515 {
(...skipping 15 matching lines...) Expand all
495 { 531 {
496 #if ENABLE(OILPAN) 532 #if ENABLE(OILPAN)
497 visitor->trace(m_nodeUnderPointer); 533 visitor->trace(m_nodeUnderPointer);
498 visitor->trace(m_pointerCaptureTarget); 534 visitor->trace(m_pointerCaptureTarget);
499 visitor->trace(m_pendingPointerCaptureTarget); 535 visitor->trace(m_pendingPointerCaptureTarget);
500 #endif 536 #endif
501 } 537 }
502 538
503 539
504 } // namespace blink 540 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/input/PointerEventManager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698