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

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: Yet another rebase 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
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, NodeUnderPointerAttributes
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 (getCapturingNode(pointerId))
mustaq 2016/02/29 19:55:40 Avoid repeated calls to getCapturingNode.
Navid Zolghadr 2016/02/29 20:10:42 Done.
97 return getCapturingNode(pointerId);
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 (getCapturingNode(pointerEvent->pointerId())) {
mustaq 2016/02/29 19:55:40 Ditto.
Navid Zolghadr 2016/02/29 20:10:42 Done.
131 EventTarget* capturingNode = getCapturingNode(pointerEvent->pointerId()) ;
132 if (capturingNode == exitedTarget)
133 enteredTarget = nullptr;
134 else if (capturingNode == enteredTarget)
135 exitedTarget = nullptr;
136 else
137 return;
138 }
139
113 // Dispatch pointerout/mouseout events 140 // Dispatch pointerout/mouseout events
114 if (isInDocument(exitedTarget)) { 141 if (isInDocument(exitedTarget)) {
115 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create( 142 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.create(
116 pointerEvent, EventTypeNames::pointerout, enteredTarget)); 143 pointerEvent, EventTypeNames::pointerout, enteredTarget));
117 if (sendMouseEvent) { 144 if (sendMouseEvent) {
118 dispatchMouseEvent(exitedTarget, 145 dispatchMouseEvent(exitedTarget,
119 EventTypeNames::mouseout, mouseEvent, enteredTarget); 146 EventTypeNames::mouseout, mouseEvent, enteredTarget);
120 } 147 }
121 } 148 }
122 149
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 } 250 }
224 } 251 }
225 252
226 void PointerEventManager::setNodeUnderPointer( 253 void PointerEventManager::setNodeUnderPointer(
227 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent, 254 PassRefPtrWillBeRawPtr<PointerEvent> prpPointerEvent,
228 PassRefPtrWillBeRawPtr<EventTarget> prpTarget) 255 PassRefPtrWillBeRawPtr<EventTarget> prpTarget)
229 { 256 {
230 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent; 257 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = prpPointerEvent;
231 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 258 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
232 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) { 259 if (m_nodeUnderPointer.contains(pointerEvent->pointerId())) {
233 sendNodeTransitionEvents(m_nodeUnderPointer.get( 260 NodeUnderPointerAttributes node = m_nodeUnderPointer.get(
234 pointerEvent->pointerId()), target, pointerEvent); 261 pointerEvent->pointerId());
235 if (!target) 262 if (!target) {
236 m_nodeUnderPointer.remove(pointerEvent->pointerId()); 263 m_nodeUnderPointer.remove(pointerEvent->pointerId());
237 else 264 } else {
238 m_nodeUnderPointer.set(pointerEvent->pointerId(), target); 265 m_nodeUnderPointer.set(pointerEvent->pointerId(),
266 NodeUnderPointerAttributes(target, false));
267 }
268 sendNodeTransitionEvents(node.target, target, pointerEvent);
239 } else if (target) { 269 } else if (target) {
270 m_nodeUnderPointer.add(pointerEvent->pointerId(),
271 NodeUnderPointerAttributes(target, false));
240 sendNodeTransitionEvents(nullptr, target, pointerEvent); 272 sendNodeTransitionEvents(nullptr, target, pointerEvent);
241 m_nodeUnderPointer.add(pointerEvent->pointerId(), target);
242 } 273 }
243 } 274 }
244 275
245 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> target, 276 void PointerEventManager::sendTouchCancelPointerEvent(PassRefPtrWillBeRawPtr<Eve ntTarget> target,
246 const PlatformTouchPoint& point) 277 const PlatformTouchPoint& point)
247 { 278 {
248 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 279 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
249 m_pointerEventFactory.createPointerCancel(point); 280 m_pointerEventFactory.createPointerCancel(point);
250 281
282 processPendingPointerCapture(pointerEvent, target);
283
251 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing 284 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing
252 target->dispatchEvent(pointerEvent.get()); 285 dispatchPointerEvent(
286 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()),
287 pointerEvent.get());
253 288
254 m_pointerEventFactory.remove(pointerEvent);
255 setNodeUnderPointer(pointerEvent, nullptr); 289 setNodeUnderPointer(pointerEvent, nullptr);
290
291 removePointerEvent(pointerEvent);
256 } 292 }
257 293
258 WebInputEventResult PointerEventManager::sendTouchPointerEvent( 294 WebInputEventResult PointerEventManager::sendTouchPointerEvent(
259 PassRefPtrWillBeRawPtr<EventTarget> prpTarget, 295 PassRefPtrWillBeRawPtr<EventTarget> prpTarget,
260 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers, 296 const PlatformTouchPoint& touchPoint, PlatformEvent::Modifiers modifiers,
261 const double width, const double height, 297 const double width, const double height,
262 const double clientX, const double clientY) 298 const double clientX, const double clientY)
263 { 299 {
264 RefPtrWillBeRawPtr<EventTarget> target = prpTarget; 300 RefPtrWillBeRawPtr<EventTarget> target = prpTarget;
301
265 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 302 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
266 m_pointerEventFactory.create( 303 m_pointerEventFactory.create(
267 pointerEventNameForTouchPointState(touchPoint.state()), 304 pointerEventNameForTouchPointState(touchPoint.state()),
268 touchPoint, modifiers, width, height, clientX, clientY); 305 touchPoint, modifiers, width, height, clientX, clientY);
269 306
307 processPendingPointerCapture(pointerEvent, target);
308
270 setNodeUnderPointer(pointerEvent, target); 309 setNodeUnderPointer(pointerEvent, target);
271 310
272 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing 311 // TODO(nzolghadr): crbug.com/579553 dealing with implicit touch capturing v s pointer event capturing
273 WebInputEventResult result = dispatchPointerEvent(target, pointerEvent.get() ); 312 WebInputEventResult result = dispatchPointerEvent(
313 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()),
314 pointerEvent.get());
274 315
275 if (touchPoint.state() == PlatformTouchPoint::TouchReleased 316 if (touchPoint.state() == PlatformTouchPoint::TouchReleased
276 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) { 317 || touchPoint.state() == PlatformTouchPoint::TouchCancelled) {
277 m_pointerEventFactory.remove(pointerEvent);
278 setNodeUnderPointer(pointerEvent, nullptr); 318 setNodeUnderPointer(pointerEvent, nullptr);
319 removePointerEvent(pointerEvent);
279 } 320 }
280 321
322 if (pointerEvent->buttons() == 0)
mustaq 2016/02/29 19:55:40 Here |buttons| can be zero thru either finger lift
Navid Zolghadr 2016/02/29 20:10:41 I believe you are right. I can't remember of any r
323 implicitReleasePointerCapture(pointerEvent->pointerId());
324
281 return result; 325 return result;
282 } 326 }
283 327
284 WebInputEventResult PointerEventManager::sendMousePointerEvent( 328 WebInputEventResult PointerEventManager::sendMousePointerEvent(
285 PassRefPtrWillBeRawPtr<Node> target, const AtomicString& mouseEventType, 329 PassRefPtrWillBeRawPtr<Node> target, const AtomicString& mouseEventType,
286 int clickCount, const PlatformMouseEvent& mouseEvent, 330 int clickCount, const PlatformMouseEvent& mouseEvent,
287 PassRefPtrWillBeRawPtr<Node> relatedTarget, 331 PassRefPtrWillBeRawPtr<Node> relatedTarget,
288 PassRefPtrWillBeRawPtr<AbstractView> view) 332 PassRefPtrWillBeRawPtr<AbstractView> view)
289 { 333 {
290 RefPtrWillBeRawPtr<PointerEvent> pointerEvent = 334 RefPtrWillBeRawPtr<PointerEvent> pointerEvent =
291 m_pointerEventFactory.create(mouseEventType, mouseEvent, 335 m_pointerEventFactory.create(mouseEventType, mouseEvent,
292 relatedTarget, view); 336 relatedTarget, view);
293 337
294 RefPtrWillBeRawPtr<Node> effectiveTarget = 338 processPendingPointerCapture(pointerEvent, target, mouseEvent, true);
295 getEffectiveTargetForPointerEvent(target, pointerEvent); 339
340 // TODO(crbug.com/587955): We should call setNodeUnderPointer here but it ca uses sending
341 // transition events that should be first removed from EventHandler.
342
343 RefPtrWillBeRawPtr<EventTarget> effectiveTarget =
344 getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId());
296 345
297 WebInputEventResult result = 346 WebInputEventResult result =
298 dispatchPointerEvent(effectiveTarget, pointerEvent); 347 dispatchPointerEvent(effectiveTarget, pointerEvent);
299 348
300 if (result != WebInputEventResult::NotHandled 349 if (result != WebInputEventResult::NotHandled
301 && pointerEvent->type() == EventTypeNames::pointerdown) 350 && pointerEvent->type() == EventTypeNames::pointerdown)
302 m_preventMouseEventForPointerTypeMouse = true; 351 m_preventMouseEventForPointerTypeMouse = true;
303 352
304 if (!m_preventMouseEventForPointerTypeMouse) { 353 if (!m_preventMouseEventForPointerTypeMouse) {
305 result = EventHandler::mergeEventResult(result, 354 result = EventHandler::mergeEventResult(result,
306 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent, 355 dispatchMouseEvent(effectiveTarget, mouseEventType, mouseEvent,
307 nullptr, clickCount)); 356 nullptr, clickCount));
308 } 357 }
309 358
359 if (pointerEvent->buttons() == 0)
360 implicitReleasePointerCapture(pointerEvent->pointerId());
361
310 return result; 362 return result;
311 } 363 }
312 364
313 PointerEventManager::PointerEventManager() 365 PointerEventManager::PointerEventManager()
314 { 366 {
315 clear(); 367 clear();
316 } 368 }
317 369
318 PointerEventManager::~PointerEventManager() 370 PointerEventManager::~PointerEventManager()
319 { 371 {
320 } 372 }
321 373
322 void PointerEventManager::clear() 374 void PointerEventManager::clear()
323 { 375 {
324 m_preventMouseEventForPointerTypeMouse = false; 376 m_preventMouseEventForPointerTypeMouse = false;
325 m_pointerEventFactory.clear(); 377 m_pointerEventFactory.clear();
326 m_nodeUnderPointer.clear(); 378 m_nodeUnderPointer.clear();
327 } 379 }
328 380
329 void PointerEventManager::conditionallyEnableMouseEventForPointerTypeMouse( 381 void PointerEventManager::conditionallyEnableMouseEventForPointerTypeMouse(
330 unsigned modifiers) 382 unsigned modifiers)
331 { 383 {
332 384
333 if (MouseEvent::platformModifiersToButtons(modifiers) == 385 if (MouseEvent::platformModifiersToButtons(modifiers) ==
334 static_cast<unsigned short>(MouseEvent::Buttons::None)) 386 static_cast<unsigned short>(MouseEvent::Buttons::None))
335 m_preventMouseEventForPointerTypeMouse = false; 387 m_preventMouseEventForPointerTypeMouse = false;
336 } 388 }
337 389
390 void PointerEventManager::processPendingPointerCapture(
391 const PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent,
392 PassRefPtrWillBeRawPtr<EventTarget> hitTestTarget,
mustaq 2016/02/29 19:55:40 const ... hitTestTarget. Same for the local vars
Navid Zolghadr 2016/02/29 20:10:42 Sure.
393 const PlatformMouseEvent& mouseEvent, bool sendMouseEvent)
394 {
395 // TODO(nzolghadr): Process sending got/lostpointercapture
396 int pointerId = pointerEvent->pointerId();
397 bool hasPointerCaptureTarget = m_pointerCaptureTarget.contains(pointerId);
398 bool hasPendingPointerCaptureTarget = m_pendingPointerCaptureTarget.contains (pointerId);
399 RefPtrWillBeRawPtr<EventTarget> pointerCaptureTarget =
400 hasPointerCaptureTarget ? m_pointerCaptureTarget.get(pointerId) : nullpt r;
401 RefPtrWillBeRawPtr<EventTarget> pendingPointerCaptureTarget =
402 hasPendingPointerCaptureTarget ? m_pendingPointerCaptureTarget.get(point erId) : nullptr;
403
404 if (hasPendingPointerCaptureTarget
mustaq 2016/02/29 19:55:40 Your ordering is different from the spec algorithm
Navid Zolghadr 2016/02/29 20:10:42 It is because of the sendNodeTransitionEvents func
mustaq 2016/03/04 15:16:40 - We need to add a test that covers the independen
Navid Zolghadr 2016/03/04 15:46:02 I'm not quite sure what you want to test here. Do
405 && (pointerCaptureTarget != pendingPointerCaptureTarget)) {
406 if (!hasPointerCaptureTarget
407 && pendingPointerCaptureTarget != hitTestTarget
408 && m_nodeUnderPointer.contains(pointerId)
409 && m_nodeUnderPointer.get(pointerId).hasRecievedOverEvent) {
410 sendNodeTransitionEvents(hitTestTarget, nullptr, pointerEvent,
411 mouseEvent, sendMouseEvent);
412 }
413 }
414
415 // Set pointerCaptureTarget from pendingPointerCaptureTarget
416 if (!m_pendingPointerCaptureTarget.contains(pointerId))
mustaq 2016/02/29 19:55:40 if (!has...)
Navid Zolghadr 2016/02/29 20:10:41 Done.
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(PointerCapturi ngMap& map, EventTarget* target)
mustaq 2016/02/29 19:55:40 const EventTarget*
Navid Zolghadr 2016/02/29 20:10:41 Done.
431 {
432 // We could have kept a reverse mapping to make this deletion possibly
433 // faster but it adds some code complication which might not be worth of
434 // the performance improvement considering there might not be a lot of
435 // active pointer or pointer captures at the same time.
436 PointerCapturingMap tmp = map;
mustaq 2016/02/29 19:55:40 Why do you need tmp here?
Navid Zolghadr 2016/02/29 20:10:42 I was going over the map. So I assumed I cannot mo
Rick Byers 2016/03/01 16:58:35 I think you can (see the implementation of removeA
mustaq 2016/03/01 17:54:58 And in this case, you don't need to go further aft
Navid Zolghadr 2016/03/01 20:46:05 If I correctly understand you Mustaq, I don't thin
Navid Zolghadr 2016/03/02 16:54:49 I still could't figure out how not to create a tmp
mustaq 2016/03/02 21:12:32 I guess I was thinking about Java iterators which
Rick Byers 2016/03/03 16:35:45 Yeah sorry I mis-read the removeAll code. Anyway
mustaq 2016/03/03 17:42:48 I am fine with tmp, sorry for the fuss. It just h
437 for (PointerCapturingMap::iterator it = tmp.begin(); it != tmp.end(); ++it) {
438 if (it->value == target)
439 map.remove(it->key);
440 }
441 }
442
443 EventTarget* PointerEventManager::getCapturingNode(int pointerId)
444 {
445 if (m_pointerCaptureTarget.contains(pointerId))
446 return m_pointerCaptureTarget.get(pointerId);
447 return nullptr;
448 }
449
450 void PointerEventManager::removePointerEvent(
Rick Byers 2016/03/01 16:58:35 seems a little weird to me for this to take a Poin
mustaq 2016/03/01 17:54:57 I will take the blame for PointerEventFactory::rem
Navid Zolghadr 2016/03/01 20:46:05 Sure. Then I'll keep the int but with "removePoint
451 const PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent)
452 {
453 if (m_pointerEventFactory.remove(pointerEvent)) {
454 int pointerId = pointerEvent->pointerId();
455 m_pendingPointerCaptureTarget.remove(pointerId);
456 m_pointerCaptureTarget.remove(pointerId);
457 m_nodeUnderPointer.remove(pointerId);
458 }
459 }
460
461 void PointerEventManager::elementRemoved(EventTarget* target)
462 {
463 removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target);
464 removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, targe t);
465 // TODO(nzolghadr): Process sending lostpointercapture to the document
466 }
467
468 void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target)
469 {
470 if (m_pointerEventFactory.isActiveButtonsState(pointerId))
471 m_pendingPointerCaptureTarget.set(pointerId, target);
472 }
473
474 void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ et)
475 {
476 if (m_pointerCaptureTarget.contains(pointerId) && m_pointerCaptureTarget.ge t(pointerId) == target)
477 implicitReleasePointerCapture(pointerId);
478 }
479
480 void PointerEventManager::implicitReleasePointerCapture(int pointerId)
Rick Byers 2016/03/01 16:58:35 nit: rename this just releasePointerCapture since
Navid Zolghadr 2016/03/01 20:46:05 Is that okay to have the same name for both functi
Rick Byers 2016/03/03 16:35:45 Yep and overload seems fine to me (they're concept
481 {
482 if (m_pendingPointerCaptureTarget.contains(pointerId))
mustaq 2016/02/29 19:55:40 s/if/ASSERT/
Navid Zolghadr 2016/02/29 20:10:42 Done.
Navid Zolghadr 2016/03/02 16:54:49 I just remembered that this function is being call
mustaq 2016/03/02 21:12:32 Then both these release functions remove ids condi
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

Powered by Google App Engine
This is Rietveld 408576698