Title: [272331] trunk/Source/WebCore
- Revision
- 272331
- Author
- [email protected]
- Date
- 2021-02-03 10:41:16 -0800 (Wed, 03 Feb 2021)
Log Message
Optimize PointerCaptureController::elementWasRemoved()
https://bugs.webkit.org/show_bug.cgi?id=221316
Reviewed by Ryosuke Niwa.
Speedometer profiles show HashTable iteration code under PointerCaptureController::elementWasRemoved()
because we always add a hash entry for the mouse pointer.
Optimize away by setting a flag that's only true if any element is referenced by pointer capture.
* page/PointerCaptureController.cpp:
(WebCore::PointerCaptureController::pointerCaptureElement const):
(WebCore::PointerCaptureController::setPointerCapture):
(WebCore::PointerCaptureController::releasePointerCapture):
(WebCore::PointerCaptureController::hasPointerCapture):
(WebCore::PointerCaptureController::pointerLockWasApplied):
(WebCore::PointerCaptureController::elementWasRemoved):
(WebCore::PointerCaptureController::reset):
(WebCore::PointerCaptureController::updateHaveAnyCapturingElement):
(WebCore::PointerCaptureController::touchWithIdentifierWasRemoved):
(WebCore::PointerCaptureController::hasCancelledPointerEventForIdentifier const):
(WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier const):
(WebCore::PointerCaptureController::pointerCaptureElement): Deleted.
(WebCore::PointerCaptureController::hasCancelledPointerEventForIdentifier): Deleted.
(WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier): Deleted.
* page/PointerCaptureController.h:
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (272330 => 272331)
--- trunk/Source/WebCore/ChangeLog 2021-02-03 18:40:55 UTC (rev 272330)
+++ trunk/Source/WebCore/ChangeLog 2021-02-03 18:41:16 UTC (rev 272331)
@@ -1,3 +1,32 @@
+2021-02-03 Simon Fraser <[email protected]>
+
+ Optimize PointerCaptureController::elementWasRemoved()
+ https://bugs.webkit.org/show_bug.cgi?id=221316
+
+ Reviewed by Ryosuke Niwa.
+
+ Speedometer profiles show HashTable iteration code under PointerCaptureController::elementWasRemoved()
+ because we always add a hash entry for the mouse pointer.
+
+ Optimize away by setting a flag that's only true if any element is referenced by pointer capture.
+
+ * page/PointerCaptureController.cpp:
+ (WebCore::PointerCaptureController::pointerCaptureElement const):
+ (WebCore::PointerCaptureController::setPointerCapture):
+ (WebCore::PointerCaptureController::releasePointerCapture):
+ (WebCore::PointerCaptureController::hasPointerCapture):
+ (WebCore::PointerCaptureController::pointerLockWasApplied):
+ (WebCore::PointerCaptureController::elementWasRemoved):
+ (WebCore::PointerCaptureController::reset):
+ (WebCore::PointerCaptureController::updateHaveAnyCapturingElement):
+ (WebCore::PointerCaptureController::touchWithIdentifierWasRemoved):
+ (WebCore::PointerCaptureController::hasCancelledPointerEventForIdentifier const):
+ (WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier const):
+ (WebCore::PointerCaptureController::pointerCaptureElement): Deleted.
+ (WebCore::PointerCaptureController::hasCancelledPointerEventForIdentifier): Deleted.
+ (WebCore::PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier): Deleted.
+ * page/PointerCaptureController.h:
+
2021-02-03 Zalan Bujtas <[email protected]>
[LFC][IFC] Every leading whitespace character is tested twice
Modified: trunk/Source/WebCore/page/PointerCaptureController.cpp (272330 => 272331)
--- trunk/Source/WebCore/page/PointerCaptureController.cpp 2021-02-03 18:40:55 UTC (rev 272330)
+++ trunk/Source/WebCore/page/PointerCaptureController.cpp 2021-02-03 18:41:16 UTC (rev 272331)
@@ -47,7 +47,7 @@
reset();
}
-Element* PointerCaptureController::pointerCaptureElement(Document* document, PointerID pointerId)
+Element* PointerCaptureController::pointerCaptureElement(Document* document, PointerID pointerId) const
{
auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
if (iterator != m_activePointerIdsToCapturingData.end()) {
@@ -85,6 +85,7 @@
if (capturingData.pointerIsPressed)
capturingData.pendingTargetOverride = capturingTarget;
+ updateHaveAnyCapturingElement();
return { };
}
@@ -107,7 +108,10 @@
// 3. For the specified pointerId, clear the pending pointer capture target override, if set.
iterator->value.pendingTargetOverride = nullptr;
+
+ // FIXME: This leaves value.targetOverride set: webkit.org/b/221342.
+ updateHaveAnyCapturingElement();
return { };
}
@@ -119,6 +123,9 @@
// In particular, returns true if the pending pointer capture target override for pointerId is set to the element on which this method is
// invoked, and false otherwise.
+ if (!m_haveAnyCapturingElement)
+ return false;
+
auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.pendingTargetOverride == capturingTarget;
}
@@ -133,10 +140,15 @@
capturingData.pendingTargetOverride = nullptr;
capturingData.targetOverride = nullptr;
}
+
+ updateHaveAnyCapturingElement();
}
void PointerCaptureController::elementWasRemoved(Element& element)
{
+ if (!m_haveAnyCapturingElement)
+ return;
+
for (auto& keyAndValue : m_activePointerIdsToCapturingData) {
auto& capturingData = keyAndValue.value;
if (capturingData.pendingTargetOverride == &element || capturingData.targetOverride == &element) {
@@ -158,6 +170,7 @@
void PointerCaptureController::reset()
{
m_activePointerIdsToCapturingData.clear();
+ m_haveAnyCapturingElement = false;
CapturingData capturingData;
capturingData.pointerType = PointerEvent::mousePointerType();
@@ -164,18 +177,26 @@
m_activePointerIdsToCapturingData.add(mousePointerID, capturingData);
}
+void PointerCaptureController::updateHaveAnyCapturingElement()
+{
+ m_haveAnyCapturingElement = WTF::anyOf(m_activePointerIdsToCapturingData.values(), [&](auto& capturingData) {
+ return capturingData.hasAnyElement();
+ });
+}
+
void PointerCaptureController::touchWithIdentifierWasRemoved(PointerID pointerId)
{
m_activePointerIdsToCapturingData.remove(pointerId);
+ updateHaveAnyCapturingElement();
}
-bool PointerCaptureController::hasCancelledPointerEventForIdentifier(PointerID pointerId)
+bool PointerCaptureController::hasCancelledPointerEventForIdentifier(PointerID pointerId) const
{
auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.cancelled;
}
-bool PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier(PointerID pointerId)
+bool PointerCaptureController::preventsCompatibilityMouseEventsForIdentifier(PointerID pointerId) const
{
auto iterator = m_activePointerIdsToCapturingData.find(pointerId);
return iterator != m_activePointerIdsToCapturingData.end() && iterator->value.preventsCompatibilityMouseEvents;
Modified: trunk/Source/WebCore/page/PointerCaptureController.h (272330 => 272331)
--- trunk/Source/WebCore/page/PointerCaptureController.h 2021-02-03 18:40:55 UTC (rev 272330)
+++ trunk/Source/WebCore/page/PointerCaptureController.h 2021-02-03 18:41:16 UTC (rev 272331)
@@ -46,7 +46,7 @@
public:
explicit PointerCaptureController(Page&);
- Element* pointerCaptureElement(Document*, PointerID);
+ Element* pointerCaptureElement(Document*, PointerID) const;
ExceptionOr<void> setPointerCapture(Element*, PointerID);
ExceptionOr<void> releasePointerCapture(Element*, PointerID);
bool hasPointerCapture(Element*, PointerID);
@@ -62,8 +62,8 @@
#endif
WEBCORE_EXPORT void touchWithIdentifierWasRemoved(PointerID);
- bool hasCancelledPointerEventForIdentifier(PointerID);
- bool preventsCompatibilityMouseEventsForIdentifier(PointerID);
+ bool hasCancelledPointerEventForIdentifier(PointerID) const;
+ bool preventsCompatibilityMouseEventsForIdentifier(PointerID) const;
void dispatchEvent(PointerEvent&, EventTarget*);
WEBCORE_EXPORT void cancelPointer(PointerID, const IntPoint&);
void processPendingPointerCapture(PointerID);
@@ -75,6 +75,13 @@
#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
RefPtr<Element> previousTarget;
#endif
+ bool hasAnyElement() const {
+ return pendingTargetOverride || targetOverride
+#if ENABLE(TOUCH_EVENTS) && PLATFORM(IOS_FAMILY)
+ || previousTarget
+#endif
+ ;
+ }
String pointerType;
bool cancelled { false };
bool isPrimary { false };
@@ -86,6 +93,8 @@
CapturingData& ensureCapturingDataForPointerEvent(const PointerEvent&);
void pointerEventWillBeDispatched(const PointerEvent&, EventTarget*);
void pointerEventWasDispatched(const PointerEvent&);
+
+ void updateHaveAnyCapturingElement();
Page& m_page;
// While PointerID is defined as int32_t, we use int64_t here so that we may use a value outside of the int32_t range to have safe
@@ -93,6 +102,7 @@
using PointerIdToCapturingDataMap = HashMap<int64_t, CapturingData, WTF::IntHash<int64_t>, WTF::SignedWithZeroKeyHashTraits<int64_t>>;
PointerIdToCapturingDataMap m_activePointerIdsToCapturingData;
bool m_processingPendingPointerCapture { false };
+ bool m_haveAnyCapturingElement { false };
};
} // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes