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

Unified Diff: third_party/WebKit/Source/core/events/PointerEventManager.cpp

Issue 1635863006: Pointerevent capture APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/events/PointerEventManager.cpp
diff --git a/third_party/WebKit/Source/core/events/PointerEventManager.cpp b/third_party/WebKit/Source/core/events/PointerEventManager.cpp
index bca636912200e463fb450b42f244c4c4be7edcd3..43130da74f56da61c7084fa33e7f0cb657d760ed 100644
--- a/third_party/WebKit/Source/core/events/PointerEventManager.cpp
+++ b/third_party/WebKit/Source/core/events/PointerEventManager.cpp
@@ -28,25 +28,81 @@ const char* pointerTypeNameForWebPointPointerType(WebPointerProperties::PointerT
} // namespace
-const PointerEventManager::MappedId PointerEventManager::s_invalidId = 0;
+const int PointerEventManager::s_invalidId = 0;
// Mouse id is 1 to behave the same as MS Edge for compatibility reasons.
-const PointerEventManager::MappedId PointerEventManager::s_mouseId = 1;
+const int PointerEventManager::s_mouseId = 1;
EventTarget* PointerEventManager::getCapturingNode(PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent)
{
- // TODO(nzolghadr): Add APIs to set the capturing nodes and return the correct node here
+ if (m_pointerCaptureTarget.contains(pointerEvent->pointerId()))
+ return m_pointerCaptureTarget.get(pointerEvent->pointerId());
return nullptr;
}
+void PointerEventManager::removeTargetFromPointerCapturingMapping(PointerCapturingMap& map, EventTarget* target)
+{
+ // We could have kept a reverse mapping to make this deletion possibly
+ // faster but it adds some code complication which might not be worth of
+ // the performance improvement considering there might not be a lot of
+ // active pointer or pointer captures at the same time.
+ PointerCapturingMap tmp = m_pointerCaptureTarget;
+ for (PointerCapturingMap::iterator it = tmp.begin(); it != tmp.end(); ++it) {
+ if (it->value == target)
+ map.remove(it->key);
+ }
+}
+
+EventTarget* PointerEventManager::getMouseCapturingNode()
+{
+ if (m_pointerCaptureTarget.contains(s_mouseId))
+ return m_pointerCaptureTarget.get(s_mouseId);
+ return nullptr;
+}
+
+void PointerEventManager::elementRemoved(EventTarget* target)
+{
+ removeTargetFromPointerCapturingMapping(m_pointerCaptureTarget, target);
+ removeTargetFromPointerCapturingMapping(m_pendingPointerCaptureTarget, target);
+ // TODO(nzolghadr): Process sending lostpointercapture to the document
+}
+
+void PointerEventManager::setPointerCapture(int pointerId, EventTarget* target)
+{
+ if (isActiveButtons(pointerId))
+ m_pendingPointerCaptureTarget.set(pointerId, target);
+}
+
+void PointerEventManager::releasePointerCapture(int pointerId, EventTarget* target)
+{
+ if (m_pointerCaptureTarget.contains(pointerId) && m_pointerCaptureTarget.get(pointerId) == target)
+ implicitReleasePointerCapture(pointerId);
+}
+
+void PointerEventManager::implicitReleasePointerCapture(int pointerId)
+{
+ if (m_pendingPointerCaptureTarget.contains(pointerId))
+ m_pendingPointerCaptureTarget.remove(pointerId);
+}
void PointerEventManager::setIdAndType(PointerEventInit &pointerEventInit,
- const WebPointerProperties &pointerProperties)
+ const WebPointerProperties &pointerProperties, int buttons)
{
const WebPointerProperties::PointerType pointerType = pointerProperties.pointerType;
- MappedId pointerId = add(PointerEventManager::IncomingId(toInt(pointerType), pointerProperties.id));
+ int pointerId = addAndUpdateButtons(PointerEventManager::IncomingId(toInt(pointerType), pointerProperties.id), buttons);
pointerEventInit.setPointerId(pointerId);
pointerEventInit.setPointerType(pointerTypeNameForWebPointPointerType(pointerType));
pointerEventInit.setIsPrimary(isPrimary(pointerId));
+ processPendingPointerCapture(pointerId);
+}
+
+void PointerEventManager::processPendingPointerCapture(int pointerId)
+{
+ // TODO(nzolghadr): Process sending got/lostpointercapture
+
+ if (!m_pendingPointerCaptureTarget.contains(pointerId))
+ m_pointerCaptureTarget.remove(pointerId);
+ else
+ m_pointerCaptureTarget.set(pointerId, m_pendingPointerCaptureTarget.get(pointerId));
}
PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicString& type,
@@ -55,8 +111,9 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
PassRefPtrWillBeRawPtr<AbstractView> view)
{
PointerEventInit pointerEventInit;
+ int buttons = MouseEvent::platformModifiersToButtons(mouseEvent.modifiers());
- setIdAndType(pointerEventInit, mouseEvent.pointerProperties());
+ setIdAndType(pointerEventInit, mouseEvent.pointerProperties(), buttons);
pointerEventInit.setScreenX(mouseEvent.globalPosition().x());
pointerEventInit.setScreenY(mouseEvent.globalPosition().y());
@@ -64,7 +121,7 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
pointerEventInit.setClientY(mouseEvent.position().y());
pointerEventInit.setButton(mouseEvent.button());
- pointerEventInit.setButtons(MouseEvent::platformModifiersToButtons(mouseEvent.modifiers()));
+ pointerEventInit.setButtons(buttons);
UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, mouseEvent.modifiers());
@@ -74,7 +131,7 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
&& type != EventTypeNames::pointerleave && type != EventTypeNames::pointercancel);
pointerEventInit.setView(view);
- if (relatedTarget)
+ if (relatedTarget && !m_pointerCaptureTarget.contains(pointerEventInit.pointerId()))
pointerEventInit.setRelatedTarget(relatedTarget);
return PointerEvent::create(type, pointerEventInit);
@@ -93,8 +150,9 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
bool isEnterOrLeave = false;
PointerEventInit pointerEventInit;
+ int buttons = pointerReleasedOrCancelled ? 0 : 1;
- setIdAndType(pointerEventInit, touchPoint.pointerProperties());
+ setIdAndType(pointerEventInit, touchPoint.pointerProperties(), buttons);
pointerEventInit.setWidth(width);
pointerEventInit.setHeight(height);
@@ -106,7 +164,7 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::create(const AtomicStr
pointerEventInit.setClientX(clientX);
pointerEventInit.setClientY(clientY);
pointerEventInit.setButton(0);
- pointerEventInit.setButtons(pointerReleasedOrCancelled ? 0 : 1);
+ pointerEventInit.setButtons(buttons);
UIEventWithKeyState::setFromPlatformModifiers(pointerEventInit, modifiers);
@@ -121,7 +179,7 @@ PassRefPtrWillBeRawPtr<PointerEvent> PointerEventManager::createPointerCancel(co
{
PointerEventInit pointerEventInit;
- setIdAndType(pointerEventInit, touchPoint.pointerProperties());
+ setIdAndType(pointerEventInit, touchPoint.pointerProperties(), 0);
pointerEventInit.setBubbles(true);
pointerEventInit.setCancelable(false);
@@ -145,18 +203,29 @@ void PointerEventManager::clear()
m_primaryId[type] = PointerEventManager::s_invalidId;
m_idCount[type] = 0;
}
+ m_pointerCaptureTarget.clear();
+ m_pendingPointerCaptureTarget.clear();
m_idMapping.clear();
m_idReverseMapping.clear();
+ m_lastButtons.clear();
// Always add mouse pointer in initialization and never remove it.
// No need to add it to m_idMapping as it is not going to be used with the existing APIs
m_primaryId[toInt(WebPointerProperties::PointerType::Mouse)] = s_mouseId;
m_idReverseMapping.add(s_mouseId, IncomingId(toInt(WebPointerProperties::PointerType::Mouse), 0));
+ m_lastButtons.add(s_mouseId, 0);
m_currentId = PointerEventManager::s_mouseId+1;
}
-PointerEventManager::MappedId PointerEventManager::add(const IncomingId p)
+int PointerEventManager::addAndUpdateButtons(const IncomingId p, const int buttons)
+{
+ int mappedId = add(p);
+ m_lastButtons.set(mappedId, buttons);
+ return mappedId;
+}
+
+int PointerEventManager::add(const IncomingId p)
{
// Do not add extra mouse pointer as it was added in initialization
if (p.first == toInt(WebPointerProperties::PointerType::Mouse))
@@ -166,24 +235,25 @@ PointerEventManager::MappedId PointerEventManager::add(const IncomingId p)
if (m_idMapping.contains(p))
return m_idMapping.get(p);
// We do not handle the overflow of m_currentId as it should be very rare
- MappedId mappedId = m_currentId++;
+ int mappedId = m_currentId++;
if (!m_idCount[type])
m_primaryId[type] = mappedId;
m_idCount[type]++;
m_idMapping.add(p, mappedId);
m_idReverseMapping.add(mappedId, p);
- return static_cast<PointerEventManager::MappedId>(mappedId);
+ return mappedId;
}
void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> pointerEvent)
{
- MappedId mappedId = pointerEvent->pointerId();
+ int mappedId = pointerEvent->pointerId();
// Do not remove mouse pointer id as it should always be there
if (mappedId == s_mouseId || !m_idReverseMapping.contains(mappedId))
return;
IncomingId p = m_idReverseMapping.get(mappedId);
int type = p.first;
+ implicitReleasePointerCapture(mappedId);
m_idReverseMapping.remove(mappedId);
m_idMapping.remove(p);
if (m_primaryId[type] == mappedId)
@@ -191,7 +261,7 @@ void PointerEventManager::remove(const PassRefPtrWillBeRawPtr<PointerEvent> poin
m_idCount[type]--;
}
-bool PointerEventManager::isPrimary(PointerEventManager::MappedId mappedId) const
+bool PointerEventManager::isPrimary(int mappedId) const
{
if (!m_idReverseMapping.contains(mappedId))
return false;
@@ -201,5 +271,14 @@ bool PointerEventManager::isPrimary(PointerEventManager::MappedId mappedId) cons
return m_primaryId[type] == mappedId;
}
+bool PointerEventManager::isActive(const int pointerId)
+{
+ return m_idReverseMapping.contains(pointerId);
+}
+
+bool PointerEventManager::isActiveButtons(const int pointerId)
+{
+ return m_lastButtons.contains(pointerId) && m_lastButtons.get(pointerId);
+}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698