Index: third_party/WebKit/Source/core/input/PointerEventManager.cpp |
diff --git a/third_party/WebKit/Source/core/input/PointerEventManager.cpp b/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
index 3fe3d505ceb762ad2aa1113063f61d54fca70961..75dd2416a58f27bdc838978e100bf34bde0d733b 100644 |
--- a/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
+++ b/third_party/WebKit/Source/core/input/PointerEventManager.cpp |
@@ -5,7 +5,6 @@ |
#include "core/input/PointerEventManager.h" |
#include "core/dom/ElementTraversal.h" |
-#include "core/dom/ExecutionContextTask.h" |
#include "core/dom/shadow/FlatTreeTraversal.h" |
#include "core/events/MouseEvent.h" |
#include "core/frame/FrameView.h" |
@@ -370,7 +369,7 @@ void PointerEventManager::blockTouchPointers() |
getEffectiveTargetForPointerEvent(target, pointerEvent->pointerId()), |
pointerEvent); |
- modifyPendingPointerCapture(pointerEvent->pointerId(), nullptr); |
+ releasePointerCapture(pointerEvent->pointerId()); |
// Sending the leave/out events and lostpointercapture |
// because the next touch event will have a different id. So delayed |
@@ -516,7 +515,7 @@ WebInputEventResult PointerEventManager::sendTouchPointerEvent( |
if (pointerEvent->type() == EventTypeNames::pointerup |
|| pointerEvent->type() == EventTypeNames::pointercancel) { |
- modifyPendingPointerCapture(pointerEvent->pointerId(), nullptr); |
+ releasePointerCapture(pointerEvent->pointerId()); |
// Sending the leave/out events and lostpointercapture |
// because the next touch event will have a different id. So delayed |
@@ -582,7 +581,7 @@ WebInputEventResult PointerEventManager::sendMousePointerEvent( |
} |
if (pointerEvent->buttons() == 0) { |
- modifyPendingPointerCapture(pointerEvent->pointerId(), nullptr); |
+ releasePointerCapture(pointerEvent->pointerId()); |
if (pointerEvent->isPrimary()) { |
m_preventMouseEventForPointerType[toPointerTypeIndex( |
mouseEvent.pointerProperties().pointerType)] = false; |
@@ -616,25 +615,6 @@ void PointerEventManager::clear() |
m_pendingPointerCaptureTarget.clear(); |
} |
-bool PointerEventManager::getPointerCaptureState(int pointerId, |
- EventTarget** pointerCaptureTarget, |
- EventTarget** pendingPointerCaptureTarget) |
-{ |
- PointerCapturingMap::iterator it; |
- |
- it = m_pointerCaptureTarget.find(pointerId); |
- EventTarget* pointercaptureTargetTemp = (it != m_pointerCaptureTarget.end()) ? it->value : nullptr; |
- it = m_pendingPointerCaptureTarget.find(pointerId); |
- EventTarget* pendingPointercaptureTargetTemp = (it != m_pendingPointerCaptureTarget.end()) ? it->value : nullptr; |
- |
- if (pointerCaptureTarget) |
- *pointerCaptureTarget = pointercaptureTargetTemp; |
- if (pendingPointerCaptureTarget) |
- *pendingPointerCaptureTarget = pendingPointercaptureTargetTemp; |
- |
- return pointercaptureTargetTemp != pendingPointercaptureTargetTemp; |
-} |
- |
void PointerEventManager::processCaptureAndPositionOfPointerEvent( |
PointerEvent* pointerEvent, |
EventTarget* hitTestTarget, |
@@ -659,56 +639,23 @@ void PointerEventManager::processCaptureAndPositionOfPointerEvent( |
} |
} |
-void PointerEventManager::immediatelyProcessPendingPointerCapture(int pointerId) |
-{ |
- EventTarget* pointerCaptureTarget; |
- EventTarget* pendingPointerCaptureTarget; |
- const bool isCaptureChanged = getPointerCaptureState(pointerId, |
- &pointerCaptureTarget, &pendingPointerCaptureTarget); |
- |
- if (!isCaptureChanged) |
- return; |
- |
- if (pointerCaptureTarget) { |
- // Re-target lostpointercapture to the document when the element is |
- // no longer participating in the tree. |
- EventTarget* target = pointerCaptureTarget; |
- if (target->toNode() |
- && !target->toNode()->isConnected()) { |
- target = target->toNode()->ownerDocument(); |
- } |
- dispatchPointerEvent(target, |
- m_pointerEventFactory.createPointerCaptureEvent( |
- pointerId, EventTypeNames::lostpointercapture)); |
- } |
- dispatchPointerEvent(pendingPointerCaptureTarget, |
- m_pointerEventFactory.createPointerCaptureEvent( |
- pointerId, EventTypeNames::gotpointercapture)); |
- |
- // Setting |m_pointerCaptureTarget| comes at the end to prevent the infinite |
- // loop if js calls set/releasepointercapture in got/lostpointercapture |
- // handlers. |
- if (pendingPointerCaptureTarget) |
- m_pointerCaptureTarget.set(pointerId, pendingPointerCaptureTarget); |
- else |
- m_pointerCaptureTarget.remove(pointerId); |
-} |
- |
-// TODO(crbug.com/629921): This function should be merged with |immediatelyProcessPendingPointerCapture| |
-// when we stop hit-testing while a pointer is captured. |
bool PointerEventManager::processPendingPointerCapture( |
PointerEvent* pointerEvent, |
EventTarget* hitTestTarget, |
const PlatformMouseEvent& mouseEvent, bool sendMouseEvent) |
{ |
int pointerId = pointerEvent->pointerId(); |
- EventTarget* pointerCaptureTarget; |
- EventTarget* pendingPointerCaptureTarget; |
- const bool isCaptureChanged = getPointerCaptureState(pointerId, |
- &pointerCaptureTarget, &pendingPointerCaptureTarget); |
+ EventTarget* pointerCaptureTarget = |
+ m_pointerCaptureTarget.contains(pointerId) |
+ ? m_pointerCaptureTarget.get(pointerId) : nullptr; |
+ EventTarget* pendingPointerCaptureTarget = |
+ m_pendingPointerCaptureTarget.contains(pointerId) |
+ ? m_pendingPointerCaptureTarget.get(pointerId) : nullptr; |
const EventTargetAttributes &nodeUnderPointerAtt = |
m_nodeUnderPointer.contains(pointerId) |
? m_nodeUnderPointer.get(pointerId) : EventTargetAttributes(); |
+ const bool isCaptureChanged = |
+ pointerCaptureTarget != pendingPointerCaptureTarget; |
if (isCaptureChanged) { |
if ((hitTestTarget != nodeUnderPointerAtt.target |
@@ -734,7 +681,7 @@ bool PointerEventManager::processPendingPointerCapture( |
} |
dispatchPointerEvent(target, |
m_pointerEventFactory.createPointerCaptureEvent( |
- pointerId, EventTypeNames::lostpointercapture)); |
+ pointerEvent, EventTypeNames::lostpointercapture)); |
} |
} |
@@ -750,7 +697,7 @@ bool PointerEventManager::processPendingPointerCapture( |
if (isCaptureChanged) { |
dispatchPointerEvent(pendingPointerCaptureTarget, |
m_pointerEventFactory.createPointerCaptureEvent( |
- pointerId, EventTypeNames::gotpointercapture)); |
+ pointerEvent, EventTypeNames::gotpointercapture)); |
if ((pendingPointerCaptureTarget == hitTestTarget |
|| !pendingPointerCaptureTarget) |
&& (nodeUnderPointerAtt.target != hitTestTarget |
@@ -807,9 +754,8 @@ void PointerEventManager::elementRemoved(EventTarget* target) |
void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target) |
{ |
UseCounter::count(m_frame->document(), UseCounter::PointerEventSetCapture); |
- if (m_pointerEventFactory.isActiveButtonsState(pointerId)) { |
- modifyPendingPointerCapture(pointerId, target); |
- } |
+ if (m_pointerEventFactory.isActiveButtonsState(pointerId)) |
+ m_pendingPointerCaptureTarget.set(pointerId, target); |
} |
void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* target) |
@@ -822,30 +768,12 @@ void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* targ |
// very next pointer event. They will be the same if there was no change in |
// capturing of a particular |pointerId|. See crbug.com/614481. |
if (m_pendingPointerCaptureTarget.get(pointerId) == target) |
- modifyPendingPointerCapture(pointerId, nullptr); |
+ releasePointerCapture(pointerId); |
} |
-void PointerEventManager::modifyPendingPointerCapture( |
- int pointerId, EventTarget* target) |
+void PointerEventManager::releasePointerCapture(int pointerId) |
{ |
- bool wasCaptureStationary = !getPointerCaptureState(pointerId, nullptr, nullptr); |
- |
- if (target) |
- m_pendingPointerCaptureTarget.set(pointerId, target); |
- else |
- m_pendingPointerCaptureTarget.remove(pointerId); |
- |
- // Only queue the processing pending pointer capture if the pending |
- // capture target and capture target were the same to prevent infinite |
- // got/lostpointercapture event sequence. |
- // See https://github.com/w3c/pointerevents/issues/32. |
- if (wasCaptureStationary) { |
- m_frame->document()->postTask( |
- BLINK_FROM_HERE, |
- createSameThreadTask( |
- &EventHandler::immediatelyProcessPendingPointerCapture, |
- wrapWeakPersistent(&m_frame->eventHandler()), pointerId)); |
- } |
+ m_pendingPointerCaptureTarget.remove(pointerId); |
} |
bool PointerEventManager::isActive(const int pointerId) const |