- 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)