Title: [291981] trunk/Source/WebCore
Revision
291981
Author
cdu...@apple.com
Date
2022-03-28 11:45:53 -0700 (Mon, 28 Mar 2022)

Log Message

Speed up Element::removedFromAncestor()
https://bugs.webkit.org/show_bug.cgi?id=238404

Reviewed by Geoffrey Garen.

Speed up Element::removedFromAncestor() by inlining some of the functions it is calling.
This is a confirmed 1.5-2% progression on Speedometer on iMac 20,1.

* dom/Element.cpp:
(WebCore::Element::removedFromAncestor):
(WebCore::Element::clearBeforePseudoElementSlow):
(WebCore::Element::clearAfterPseudoElementSlow):
(WebCore::Element::setSavedLayerScrollPositionSlow):
(WebCore::Element::clearBeforePseudoElement): Deleted.
(WebCore::Element::clearAfterPseudoElement): Deleted.
(WebCore::Element::setSavedLayerScrollPosition): Deleted.
* dom/Element.h:
(WebCore::Element::setSavedLayerScrollPosition):
(WebCore::Element::clearBeforePseudoElement):
(WebCore::Element::clearAfterPseudoElement):
* page/PointerCaptureController.cpp:
(WebCore::PointerCaptureController::elementWasRemovedSlow):
(WebCore::PointerCaptureController::elementWasRemoved): Deleted.
* page/PointerCaptureController.h:
(WebCore::PointerCaptureController::elementWasRemoved):
* page/PointerLockController.cpp:
(WebCore::PointerLockController::elementWasRemovedInternal):
(WebCore::PointerLockController::elementWasRemoved): Deleted.
* page/PointerLockController.h:
(WebCore::PointerLockController::elementWasRemoved):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (291980 => 291981)


--- trunk/Source/WebCore/ChangeLog	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/ChangeLog	2022-03-28 18:45:53 UTC (rev 291981)
@@ -1,3 +1,36 @@
+2022-03-28  Chris Dumez  <cdu...@apple.com>
+
+        Speed up Element::removedFromAncestor()
+        https://bugs.webkit.org/show_bug.cgi?id=238404
+
+        Reviewed by Geoffrey Garen.
+
+        Speed up Element::removedFromAncestor() by inlining some of the functions it is calling.
+        This is a confirmed 1.5-2% progression on Speedometer on iMac 20,1.
+
+        * dom/Element.cpp:
+        (WebCore::Element::removedFromAncestor):
+        (WebCore::Element::clearBeforePseudoElementSlow):
+        (WebCore::Element::clearAfterPseudoElementSlow):
+        (WebCore::Element::setSavedLayerScrollPositionSlow):
+        (WebCore::Element::clearBeforePseudoElement): Deleted.
+        (WebCore::Element::clearAfterPseudoElement): Deleted.
+        (WebCore::Element::setSavedLayerScrollPosition): Deleted.
+        * dom/Element.h:
+        (WebCore::Element::setSavedLayerScrollPosition):
+        (WebCore::Element::clearBeforePseudoElement):
+        (WebCore::Element::clearAfterPseudoElement):
+        * page/PointerCaptureController.cpp:
+        (WebCore::PointerCaptureController::elementWasRemovedSlow):
+        (WebCore::PointerCaptureController::elementWasRemoved): Deleted.
+        * page/PointerCaptureController.h:
+        (WebCore::PointerCaptureController::elementWasRemoved):
+        * page/PointerLockController.cpp:
+        (WebCore::PointerLockController::elementWasRemovedInternal):
+        (WebCore::PointerLockController::elementWasRemoved): Deleted.
+        * page/PointerLockController.h:
+        (WebCore::PointerLockController::elementWasRemoved):
+
 2022-03-28  Devin Rousso  <drou...@apple.com>
 
         [iOS] Add `WKWebView` API to control CSS "small viewport" `sv*` and "large viewport" `lv*` units

Modified: trunk/Source/WebCore/dom/Element.cpp (291980 => 291981)


--- trunk/Source/WebCore/dom/Element.cpp	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/dom/Element.cpp	2022-03-28 18:45:53 UTC (rev 291981)
@@ -2417,11 +2417,10 @@
     if (hasPendingResources())
         document().accessSVGExtensions().removeElementFromPendingResources(*this);
 
-    RefPtr<Frame> frame = document().frame();
     Styleable::fromElement(*this).elementWasRemoved();
 
 #if ENABLE(WHEEL_EVENT_LATCHING)
-    if (frame && frame->page()) {
+    if (RefPtr frame = document().frame(); frame && frame->page()) {
         if (auto* scrollLatchingController = frame->page()->scrollLatchingControllerIfExists())
             scrollLatchingController->removeLatchingStateForTarget(*this);
     }
@@ -3741,18 +3740,16 @@
     pseudoElement->clearHostElement();
 }
 
-void Element::clearBeforePseudoElement()
+void Element::clearBeforePseudoElementSlow()
 {
-    if (!hasRareData())
-        return;
+    ASSERT(hasRareData());
     disconnectPseudoElement(elementRareData()->beforePseudoElement());
     elementRareData()->setBeforePseudoElement(nullptr);
 }
 
-void Element::clearAfterPseudoElement()
+void Element::clearAfterPseudoElementSlow()
 {
-    if (!hasRareData())
-        return;
+    ASSERT(hasRareData());
     disconnectPseudoElement(elementRareData()->afterPseudoElement());
     elementRareData()->setAfterPseudoElement(nullptr);
 }
@@ -4327,10 +4324,9 @@
     return hasRareData() ? elementRareData()->savedLayerScrollPosition() : IntPoint();
 }
 
-void Element::setSavedLayerScrollPosition(const IntPoint& position)
+void Element::setSavedLayerScrollPositionSlow(const IntPoint& position)
 {
-    if (position.isZero() && !hasRareData())
-        return;
+    ASSERT(!position.isZero() || hasRareData());
     ensureElementRareData().setSavedLayerScrollPosition(position);
 }
 

Modified: trunk/Source/WebCore/dom/Element.h (291980 => 291981)


--- trunk/Source/WebCore/dom/Element.h	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/dom/Element.h	2022-03-28 18:45:53 UTC (rev 291981)
@@ -738,6 +738,10 @@
     void addAttributeInternal(const QualifiedName&, const AtomString& value, SynchronizationOfLazyAttribute);
     void removeAttributeInternal(unsigned index, SynchronizationOfLazyAttribute);
 
+    void setSavedLayerScrollPositionSlow(const IntPoint&);
+    void clearBeforePseudoElementSlow();
+    void clearAfterPseudoElementSlow();
+
     LayoutRect absoluteEventBounds(bool& boundsIncludeAllDescendantElements, bool& includesFixedPositionElements);
     LayoutRect absoluteEventBoundsOfElementAndDescendants(bool& includesFixedPositionElements);
 
@@ -785,6 +789,25 @@
     bool m_hasDuplicateAttribute { false };
 };
 
+inline void Element::setSavedLayerScrollPosition(const IntPoint& position)
+{
+    if (position.isZero() && !hasRareData())
+        return;
+    setSavedLayerScrollPositionSlow(position);
+}
+
+inline void Element::clearBeforePseudoElement()
+{
+    if (hasRareData())
+        clearBeforePseudoElementSlow();
+}
+
+inline void Element::clearAfterPseudoElement()
+{
+    if (hasRareData())
+        clearAfterPseudoElementSlow();
+}
+
 void invalidateForSiblingCombinators(Element* sibling);
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/page/PointerCaptureController.cpp (291980 => 291981)


--- trunk/Source/WebCore/page/PointerCaptureController.cpp	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/page/PointerCaptureController.cpp	2022-03-28 18:45:53 UTC (rev 291981)
@@ -142,10 +142,9 @@
     updateHaveAnyCapturingElement();
 }
 
-void PointerCaptureController::elementWasRemoved(Element& element)
+void PointerCaptureController::elementWasRemovedSlow(Element& element)
 {
-    if (!m_haveAnyCapturingElement)
-        return;
+    ASSERT(m_haveAnyCapturingElement);
 
     for (auto [pointerId, capturingData] : m_activePointerIdsToCapturingData) {
         if (capturingData->pendingTargetOverride == &element || capturingData->targetOverride == &element) {

Modified: trunk/Source/WebCore/page/PointerCaptureController.h (291980 => 291981)


--- trunk/Source/WebCore/page/PointerCaptureController.h	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/page/PointerCaptureController.h	2022-03-28 18:45:53 UTC (rev 291981)
@@ -110,6 +110,7 @@
     void pointerEventWasDispatched(const PointerEvent&);
 
     void updateHaveAnyCapturingElement();
+    void elementWasRemovedSlow(Element&);
 
     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
@@ -120,4 +121,10 @@
     bool m_haveAnyCapturingElement { false };
 };
 
+inline void PointerCaptureController::elementWasRemoved(Element& element)
+{
+    if (m_haveAnyCapturingElement)
+        elementWasRemovedSlow(element);
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/page/PointerLockController.cpp (291980 => 291981)


--- trunk/Source/WebCore/page/PointerLockController.cpp	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/page/PointerLockController.cpp	2022-03-28 18:45:53 UTC (rev 291981)
@@ -103,15 +103,13 @@
     m_forceCursorVisibleUponUnlock = true;
 }
 
-void PointerLockController::elementWasRemoved(Element& element)
+void PointerLockController::elementWasRemovedInternal()
 {
-    if (m_element == &element) {
-        m_documentOfRemovedElementWhileWaitingForUnlock = m_element->document();
-        // Set element null immediately to block any future interaction with it
-        // including mouse events received before the unlock completes.
-        requestPointerUnlock();
-        clearElement();
-    }
+    m_documentOfRemovedElementWhileWaitingForUnlock = m_element->document();
+    // Set element null immediately to block any future interaction with it
+    // including mouse events received before the unlock completes.
+    requestPointerUnlock();
+    clearElement();
 }
 
 void PointerLockController::documentDetached(Document& document)

Modified: trunk/Source/WebCore/page/PointerLockController.h (291980 => 291981)


--- trunk/Source/WebCore/page/PointerLockController.h	2022-03-28 18:18:47 UTC (rev 291980)
+++ trunk/Source/WebCore/page/PointerLockController.h	2022-03-28 18:45:53 UTC (rev 291981)
@@ -64,6 +64,8 @@
     void clearElement();
     void enqueueEvent(const AtomString& type, Element*);
     void enqueueEvent(const AtomString& type, Document*);
+    void elementWasRemovedInternal();
+
     Page& m_page;
     bool m_lockPending { false };
     bool m_unlockPending { false };
@@ -73,6 +75,12 @@
     WeakPtr<Document> m_documentAllowedToRelockWithoutUserGesture;
 };
 
+inline void PointerLockController::elementWasRemoved(Element& element)
+{
+    if (m_element == &element)
+        elementWasRemovedInternal();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(POINTER_LOCK)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to