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

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

Issue 1635863006: Pointerevent capture APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 18 matching lines...) Expand all
29 ASSERT_NOT_REACHED(); 29 ASSERT_NOT_REACHED();
30 return emptyAtom; 30 return emptyAtom;
31 } 31 }
32 } 32 }
33 33
34 bool isInDocument(PassRefPtrWillBeRawPtr<EventTarget> n) 34 bool isInDocument(PassRefPtrWillBeRawPtr<EventTarget> n)
35 { 35 {
36 return n && n->toNode() && n->toNode()->inDocument(); 36 return n && n->toNode() && n->toNode()->inDocument();
37 } 37 }
38 38
39 WebInputEventResult dispatchPointerEvent(
40 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
41 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
42 bool checkForListener = false)
43 {
44 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
45 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
46 if (!RuntimeEnabledFeatures::pointerEventEnabled())
47 return WebInputEventResult::NotHandled;
48 if (!checkForListener || target->hasEventListeners(pointerEvent->type())) {
49 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ;
50 return EventHandler::toWebInputEventResult(dispatchResult);
51 }
52 return WebInputEventResult::NotHandled;
53 }
54
55 WebInputEventResult dispatchMouseEvent( 39 WebInputEventResult dispatchMouseEvent(
56 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, 40 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
57 const AtomicString& mouseEventType, 41 const AtomicString& mouseEventType,
58 const PlatformMouseEvent& mouseEvent, 42 const PlatformMouseEvent& mouseEvent,
59 PassRefPtrWillBeRawPtr<EventTarget> prpRelatedTarget, 43 PassRefPtrWillBeRawPtr<EventTarget> prpRelatedTarget,
60 int detail = 0, 44 int detail = 0,
61 bool checkForListener = false) 45 bool checkForListener = false)
62 { 46 {
63 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 47 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
64 RefPtrWillBeRawPtr<EventTarget> relatedTarget = prpRelatedTarget; 48 RefPtrWillBeRawPtr<EventTarget> relatedTarget = prpRelatedTarget;
65 if (target->toNode() 49 if (target->toNode()
66 && (!checkForListener || target->hasEventListeners(mouseEventType))) { 50 && (!checkForListener || target->hasEventListeners(mouseEventType))) {
67 RefPtrWillBeRawPtr<Node> targetNode = target->toNode(); 51 RefPtrWillBeRawPtr<Node> targetNode = target->toNode();
68 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType , 52 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(mouseEventType ,
69 targetNode->document().domWindow(), mouseEvent, detail, 53 targetNode->document().domWindow(), mouseEvent, detail,
70 relatedTarget ? relatedTarget->toNode() : nullptr); 54 relatedTarget ? relatedTarget->toNode() : nullptr);
71 DispatchEventResult dispatchResult = target->dispatchEvent(event); 55 DispatchEventResult dispatchResult = target->dispatchEvent(event);
72 return EventHandler::toWebInputEventResult(dispatchResult); 56 return EventHandler::toWebInputEventResult(dispatchResult);
73 } 57 }
74 return WebInputEventResult::NotHandled; 58 return WebInputEventResult::NotHandled;
75 } 59 }
76 60
77 } // namespace 61 } // namespace
78 62
79 PassRefPtrWillBeRawPtr<Node> PointerEventManager::getEffectiveTargetForPointerEv ent( 63 WebInputEventResult PointerEventManager::dispatchPointerEvent(
80 PassRefPtrWillBeRawPtr<Node> target, 64 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
81 PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent) 65 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
66 bool checkForListener)
82 { 67 {
83 // TODO(nzolghadr): Add APIs to set the capturing nodes and return the corre ct node here 68 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
84 (void) pointerEvent; 69 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
70
71 // Set whether node under pointer has received pointerover or not.
72 int pointerId = pointerEvent->pointerId();
73 if ((pointerEvent->type() == EventTypeNames::pointerout
74 || pointerEvent->type() == EventTypeNames::pointerover)
75 && m_nodeUnderPointer.contains(pointerId)) {
76 RefPtrWillBeRawPtr<EventTarget> targetUnderPointer =
77 m_nodeUnderPointer.get(pointerId).target;
78 if (targetUnderPointer == target) {
79 m_nodeUnderPointer.set(pointerId, EventTargetAttributes
80 (targetUnderPointer,
81 pointerEvent->type() == EventTypeNames::pointerover));
82 }
83 }
84 if (!RuntimeEnabledFeatures::pointerEventEnabled())
85 return WebInputEventResult::NotHandled;
86 if (!checkForListener || target->hasEventListeners(pointerEvent->type())) {
87 DispatchEventResult dispatchResult = target->dispatchEvent(pointerEvent) ;
88 return EventHandler::toWebInputEventResult(dispatchResult);
89 }
90 return WebInputEventResult::NotHandled;
91 }
92
93 PassRefPtrWillBeRawPtr<EventTarget> PointerEventManager::getEffectiveTargetForPo interEvent(
94 PassRefPtrWillBeRawPtr<EventTarget> target, int pointerId)
95 {
96 if (EventTarget* capturingTarget = getCapturingNode(pointerId))
97 return capturingTarget;
85 return target; 98 return target;
86 } 99 }
87 100
88 // Sends node transition events (pointer|mouse)(out|leave|over|enter) to the cor responding targets 101 // Sends node transition events (pointer|mouse)(out|leave|over|enter) to the cor responding targets
89 void PointerEventManager::sendNodeTransitionEvents( 102 void PointerEventManager::sendNodeTransitionEvents(
90 PassRefPtrWillBeRawPtr<Node> exitedNode, 103 PassRefPtrWillBeRawPtr<Node> exitedNode,
91 PassRefPtrWillBeRawPtr<Node> enteredNode, 104 PassRefPtrWillBeRawPtr<Node> enteredNode,
92 const PlatformMouseEvent& mouseEvent, 105 const PlatformMouseEvent& mouseEvent,
93 PassRefPtrWillBeRawPtr<AbstractView> view) 106 PassRefPtrWillBeRawPtr<AbstractView> view)
94 { 107 {
108 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
109 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent,
110 nullptr, view);
111 processPendingPointerCapture(pointerEvent, enteredNode, mouseEvent, true);
112
95 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents 113 // Pointer event type does not matter as it will be overridden in the sendNo deTransitionEvents
96 sendNodeTransitionEvents(exitedNode, enteredNode, 114 sendNodeTransitionEvents(exitedNode, enteredNode, pointerEvent, mouseEvent,
97 m_pointerEventFactory.create(EventTypeNames::mouseout, mouseEvent, nullp tr, view), 115 true);
98 mouseEvent, true);
99 } 116 }
100 117
101 void PointerEventManager::sendNodeTransitionEvents( 118 void PointerEventManager::sendNodeTransitionEvents(
102 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget, 119 PassRefPtrWillBeRawPtr<EventTarget> prpExitedTarget,
103 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget, 120 PassRefPtrWillBeRawPtr<EventTarget> prpEnteredTarget,
104 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 121 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
105 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) 122 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
106 { 123 {
107 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget; 124 RefPtrWillBeRawPtr<EventTarget> exitedTarget = prpExitedTarget;
108 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget; 125 RefPtrWillBeRawPtr<EventTarget> enteredTarget = prpEnteredTarget;
109 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 126 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
110 if (exitedTarget == enteredTarget) 127 if (exitedTarget == enteredTarget)
111 return; 128 return;
112 129
130 if (EventTarget* capturingTarget = getCapturingNode(pointerEvent->pointerId( ))) {
131 if (capturingTarget == exitedTarget)
132 enteredTarget = nullptr;
133 else if (capturingTarget == enteredTarget)
134 exitedTarget = nullptr;
135 else
136 return;
137 }
138
113 // Dispatch pointerout/mouseout events 139 // Dispatch pointerout/mouseout events
114 if (isInDocument(exitedTarget)) { 140 if (isInDocument(exitedTarget)) {
115 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create( 141 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create(
116 pointerEvent, EventTypeNames::pointerout, enteredTarget)); 142 pointerEvent, EventTypeNames::pointerout, enteredTarget));
117 if (sendMouseEvent) { 143 if (sendMouseEvent) {
118 dispatchMouseEvent(exitedTarget, 144 dispatchMouseEvent(exitedTarget,
119 EventTypeNames::mouseout, mouseEvent, enteredTarget); 145 EventTypeNames::mouseout, mouseEvent, enteredTarget);
120 } 146 }
121 } 147 }
122 148
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 } 249 }
224 } 250 }
225 251
226 void PointerEventManager::setNodeUnderPointer( 252 void PointerEventManager::setNodeUnderPointer(
227 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 253 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
228 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) 254 PassRefPtrWillBeRawPtr<EventTarget> prpTarget)
229 { 255 {
230 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 256 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
231 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 257 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
232 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { 258 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) {
233 sendNodeTransitionEvents(m_nodeUnderPointer.get( 259 EventTargetAttributes node = m_nodeUnderPointer.get(
234 pointerEvent->pointerId()), target, pointerEvent); 260 pointerEvent->pointerId());
235 if (!target) 261 if (!target) {
236 m_nodeUnderPointer.remove(pointerEvent->pointerId()); 262 m_nodeUnderPointer.remove(pointerEvent->pointerId());
237 else 263 } else {
238 m_nodeUnderPointer.set(pointerEvent->pointerId(), target); 264 m_nodeUnderPointer.set(pointerEvent->pointerId(),
265 EventTargetAttributes(target, false));
266 }
267 sendNodeTransitionEvents(node.target, target, pointerEvent);
239 } else if (target) { 268 } else if (target) {
269 m_nodeUnderPointer.add(pointerEvent->pointerId(),
270 EventTargetAttributes(target, false));
240 sendNodeTransitionEvents(nullptr, target, pointerEvent); 271 sendNodeTransitionEvents(nullptr, target, pointerEvent);
241 m_nodeUnderPointer.add(pointerEvent->pointerId(), target);
242 } 272 }
243 } 273 }
244 274
245 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> target, 275 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> target,
246 const PlatformTouchPoint& point) 276 const PlatformTouchPoint& point)
247 { 277 {
248 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 278 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
249 m_pointerEventFactory.createPointerCancel(point); 279 m_pointerEventFactory.createPointerCancel(point);
250 280
281 processPendingPointerCapture(pointerEvent, target);
282
251 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing 283 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing
252 target->dispatchEvent(pointerEvent.get()); 284 dispatchPointerEvent(
285 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()),
286 pointerEvent.get());
253 287
254 m_pointerEventFactory.remove(pointerEvent);
255 setNodeUnderPointer(pointerEvent, nullptr); 288 setNodeUnderPointer(pointerEvent, nullptr);
289
290 removePointer(pointerEvent);
256 } 291 }
257 292
258 WebInputEventResult PointerEventManager::sendTouchPointerEvent( 293 WebInputEventResult PointerEventManager::sendTouchPointerEvent(
259 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, 294 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
260 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, 295 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
261 const double width, const double height, 296 const double width, const double height,
262 const double clientX, const double clientY) 297 const double clientX, const double clientY)
263 { 298 {
264 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 299 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
300
265 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 301 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
266 m_pointerEventFactory.create( 302 m_pointerEventFactory.create(
267 pointerEventNameForTouchPointState(touchPoint.state()), 303 pointerEventNameForTouchPointState(touchPoint.state()),
268 touchPoint, modifiers, width, height, clientX, clientY); 304 touchPoint, modifiers, width, height, clientX, clientY);
269 305
306 processPendingPointerCapture(pointerEvent, target);
307
270 setNodeUnderPointer(pointerEvent, target); 308 setNodeUnderPointer(pointerEvent, target);
271 309
272 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing 310 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing
273 WebInputEventResult result = dispatchPointerEvent(target, pointerEvent.get() ); 311 WebInputEventResult result = dispatchPointerEvent(
312 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()),
313 pointerEvent.get());
274 314
275 if (touchPoint.state() == PlatformTouchPoint::TouchReleased 315 if (touchPoint.state() == PlatformTouchPoint::TouchReleased
276 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) { 316 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) {
277 m_pointerEventFactory.remove(pointerEvent);
278 setNodeUnderPointer(pointerEvent, nullptr); 317 setNodeUnderPointer(pointerEvent, nullptr);
318 removePointer(pointerEvent);
279 } 319 }
280 320
281 return result; 321 return result;
282 } 322 }
283 323
284 WebInputEventResult PointerEventManager::sendMousePointerEvent( 324 WebInputEventResult PointerEventManager::sendMousePointerEvent(
285 PassRefPtrWillBeRawPtr<Node> target, const AtomicString& mouseEventType, 325 PassRefPtrWillBeRawPtr<Node> target, const AtomicString& mouseEventType,
286 int clickCount, const PlatformMouseEvent& mouseEvent, 326 int clickCount, const PlatformMouseEvent& mouseEvent,
287 PassRefPtrWillBeRawPtr<Node> relatedTarget, 327 PassRefPtrWillBeRawPtr<Node> relatedTarget,
288 PassRefPtrWillBeRawPtr<AbstractView> view) 328 PassRefPtrWillBeRawPtr<AbstractView> view)
289 { 329 {
290 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 330 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
291 m_pointerEventFactory.create(mouseEventType, mouseEvent, 331 m_pointerEventFactory.create(mouseEventType, mouseEvent,
292 relatedTarget, view); 332 relatedTarget, view);
293 333
294 RefPtrWillBeRawPtr<Node> effectiveTarget = 334 processPendingPointerCapture(pointerEvent, target, mouseEvent, true);
295 getEffectiveTargetForPointerEvent(target, pointerEvent); 335
336 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending
337 // transition events that should be first removed from EventHandler.
338
339 RefPtrWillBeRawPtr<EventTarget> effectiveTarget =
340 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId());
296 341
297 WebInputEventResult result = 342 WebInputEventResult result =
298 dispatchPointerEvent(effectiveTarget, pointerEvent); 343 dispatchPointerEvent(effectiveTarget, pointerEvent);
299 344
300 if (result != WebInputEventResult::NotHandled 345 if (result != WebInputEventResult::NotHandled
301 && pointerEvent->type() == EventTypeNames::pointerdown) 346 && pointerEvent->type() == EventTypeNames::pointerdown)
302 m_preventMouseEventForPointerTypeMouse = true; 347 m_preventMouseEventForPointerTypeMouse = true;
303 348
304 if (!m_preventMouseEventForPointerTypeMouse) { 349 if (!m_preventMouseEventForPointerTypeMouse) {
305 result = EventHandler::mergeEventResult(result, 350 result = EventHandler::mergeEventResult(result,
306 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, 351 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent,
307 nullptr, clickCount)); 352 nullptr, clickCount));
308 } 353 }
309 354
355 if (pointerEvent->buttons() == 0)
356 releasePointerCapture(pointerEvent->pointerId());
357
310 return result; 358 return result;
311 } 359 }
312 360
313 PointerEventManager::PointerEventManager() 361 PointerEventManager::PointerEventManager()
314 { 362 {
315 clear(); 363 clear();
316 } 364 }
317 365
318 PointerEventManager::~PointerEventManager() 366 PointerEventManager::~PointerEventManager()
319 { 367 {
320 } 368 }
321 369
322 void PointerEventManager::clear() 370 void PointerEventManager::clear()
323 { 371 {
324 m_preventMouseEventForPointerTypeMouse = false; 372 m_preventMouseEventForPointerTypeMouse = false;
325 m_pointerEventFactory.clear(); 373 m_pointerEventFactory.clear();
326 m_nodeUnderPointer.clear(); 374 m_nodeUnderPointer.clear();
327 } 375 }
328 376
329 void PointerEventManager::conditionallyEnableMouseEventForPointerTypeMouse( 377 void PointerEventManager::conditionallyEnableMouseEventForPointerTypeMouse(
330 unsigned modifiers) 378 unsigned modifiers)
331 { 379 {
332 380
333 if (MouseEvent::platformModifiersToButtons(modifiers) == 381 if (MouseEvent::platformModifiersToButtons(modifiers) ==
334 static_cast<unsigned short>(MouseEvent::Buttons::None)) 382 static_cast<unsigned short>(MouseEvent::Buttons::None))
335 m_preventMouseEventForPointerTypeMouse = false; 383 m_preventMouseEventForPointerTypeMouse = false;
336 } 384 }
337 385
386 void PointerEventManager::processPendingPointerCapture(
387 const PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
388 const PassRefPtrWillBeRawPtr<EventTarget> prpHitTestTarget,
389 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
390 {
391 // TODO(nzolghadr): Process sending got/lostpointercapture
392 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
393 RefPtrWillBeRawPtr<EventTarget> hitTestTarget = prpHitTestTarget;
394 int pointerId = pointerEvent->pointerId();
395 bool hasPointerCaptureTarget = m_pointerCaptureTarget.contains(pointerId);
396 bool hasPendingPointerCaptureTarget = m_pendingPointerCaptureTarget.contains (pointerId);
397 const RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget =
398 hasPointerCaptureTarget ? m_pointerCaptureTarget.get(pointerId) : nullpt r;
399 const RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget =
400 hasPendingPointerCaptureTarget ? m_pendingPointerCaptureTarget.get(point erId) : nullptr;
401
402 if (hasPendingPointerCaptureTarget
403 && (pointerCaptureTarget != pendingPointerCaptureTarget)) {
404 if (!hasPointerCaptureTarget
405 && pendingPointerCaptureTarget != hitTestTarget
406 && m_nodeUnderPointer.contains(pointerId)
407 && m_nodeUnderPointer.get(pointerId).hasRecievedOverEvent) {
408 sendNodeTransitionEvents(hitTestTarget, nullptr, pointerEvent,
409 mouseEvent, sendMouseEvent);
410 }
411 }
412
413 // Set pointerCaptureTarget from pendingPointerCaptureTarget. This does
414 // affect the behavior of sendNodeTransitionEvents function. So the
415 // ordering of the surrounding blocks of code is important.
416 if (!hasPendingPointerCaptureTarget)
417 m_pointerCaptureTarget.remove(pointerId);
418 else
419 m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get( pointerId));
420
421 if (hasPointerCaptureTarget && (pointerCaptureTarget != pendingPointerCaptur eTarget)) {
422 if (!hasPendingPointerCaptureTarget && pointerCaptureTarget != hitTestTa rget) {
423 sendNodeTransitionEvents(nullptr, hitTestTarget, pointerEvent,
424 mouseEvent, sendMouseEvent);
425 }
426 }
427
428 }
429
430 void PointerEventManager::removeTargetFromPointerCapturingMapping(
431 PointerCapturingMap& map, const EventTarget* target)
432 {
433 // We could have kept a reverse mapping to make this deletion possibly
434 // faster but it adds some code complication which might not be worth of
435 // the performance improvement considering there might not be a lot of
436 // active pointer or pointer captures at the same time.
437 PointerCapturingMap tmp = map;
438 for (PointerCapturingMap::iterator it = tmp.begin(); it != tmp.end(); ++it) {
439 if (it->value == target)
440 map.remove(it->key);
441 }
442 }
443
444 EventTarget* PointerEventManager::getCapturingNode(int pointerId)
445 {
446 if (m_pointerCaptureTarget.contains(pointerId))
447 return m_pointerCaptureTarget.get(pointerId);
448 return nullptr;
449 }
450
451 void PointerEventManager::removePointer(
452 const PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent)
453 {
454 if (m_pointerEventFactory.remove(pointerEvent)) {
455 int pointerId = pointerEvent->pointerId();
456 m_pendingPointerCaptureTarget.remove(pointerId);
457 m_pointerCaptureTarget.remove(pointerId);
458 m_nodeUnderPointer.remove(pointerId);
459 }
460 }
461
462 void PointerEventManager::elementRemoved(EventTarget* target)
463 {
464 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target);
465 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t);
466 // TODO(nzolghadr): Process sending lostpointercapture to the document
467 }
468
469 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target)
470 {
471 if (m_pointerEventFactory.isActiveButtonsState(pointerId))
472 m_pendingPointerCaptureTarget.set(pointerId, target);
473 }
474
475 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et)
476 {
477 if (m_pointerCaptureTarget.get(pointerId) == target)
478 releasePointerCapture(pointerId);
479 }
480
481 void PointerEventManager::releasePointerCapture(int pointerId)
482 {
483 m_pendingPointerCaptureTarget.remove(pointerId);
484 }
485
486 bool PointerEventManager::isActive(const int pointerId)
487 {
488 return m_pointerEventFactory.isActive(pointerId);
489 }
490
338 DEFINE_TRACE(PointerEventManager) 491 DEFINE_TRACE(PointerEventManager)
339 { 492 {
340 #if ENABLE(OILPAN) 493 #if ENABLE(OILPAN)
341 visitor->trace(m_nodeUnderPointer); 494 visitor->trace(m_nodeUnderPointer);
495 visitor->trace(m_pointerCaptureTarget);
496 visitor->trace(m_pendingPointerCaptureTarget);
342 #endif 497 #endif
343 } 498 }
344 499
345 500
346 } // namespace blink 501 } // 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