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

Reply via email to