Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: fd8b56688bda9cfc9527916226d9854a756ef727
https://github.com/WebKit/WebKit/commit/fd8b56688bda9cfc9527916226d9854a756ef727
Author: Tyler Wilcock <[email protected]>
Date: 2025-09-02 (Tue, 02 Sep 2025)
Changed paths:
M Source/WebCore/accessibility/AXListHelpers.cpp
M Source/WebCore/accessibility/AXObjectCache.cpp
M Source/WebCore/accessibility/AXObjectCache.h
M Source/WebCore/accessibility/AXObjectCacheInlines.h
M Source/WebCore/accessibility/AXSearchManager.cpp
M Source/WebCore/accessibility/AccessibilityImageMapLink.cpp
M Source/WebCore/accessibility/AccessibilityListBoxOption.cpp
M Source/WebCore/accessibility/AccessibilityMathMLElement.cpp
M Source/WebCore/accessibility/AccessibilityMenuListOption.cpp
M Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp
M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
M Source/WebCore/accessibility/AccessibilityObject.cpp
M Source/WebCore/accessibility/AccessibilityRenderObject.cpp
M Source/WebCore/accessibility/AccessibilitySVGObject.cpp
M Source/WebCore/accessibility/AccessibilityScrollView.cpp
M Source/WebCore/accessibility/AccessibilityTableCell.cpp
M Source/WebCore/accessibility/cocoa/AccessibilityObjectCocoa.mm
M Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm
M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
M Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm
M Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm
M Source/WebCore/dom/Document.cpp
M Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp
M Source/WebCore/inspector/InspectorOverlay.cpp
M Source/WebCore/inspector/agents/InspectorDOMAgent.cpp
M Source/WebCore/page/Page.cpp
M Source/WebCore/page/PrintContext.cpp
M Source/WebCore/testing/Internals.cpp
M Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp
M Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm
M Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm
M Source/WebKit/WebProcess/Plugins/PDF/WKAccessibilityPDFDocumentObject.mm
Log Message:
-----------
AX: Optimize hot functions AXObjectCache::{get(Node&), getOrCreate(Node&)} by
inlining get inside getOrCreate and eliminating one hashmap lookup
https://bugs.webkit.org/show_bug.cgi?id=298158
rdar://159526201
Reviewed by Joshua Hoffman.
This commit implements three optimizations to make AXObjectCache::get and
AXObjectCache::getOrCreate faster:
1. Rename existing data structure AXObjectCache::m_nodeObjectMapping to
AXObjectCache::m_nodeIdMapping, and make a
new data structure with the name AXObjectCache::m_nodeObjectMapping that
points from a Node& directly to an Ref<AccessibilityObject>.
This removes one HashMap lookup in AXObjectCache::get.
m_renderObjectMapping and m_widgetObjectMapping were renamed
to m_renderObjectIdMapping and m_widgetIdMapping to stay consistent with
m_nodeIdMapping. The cost of this new
data structure is very small on most sites, and even in the most extreme
case of html.spec.whatwg.org, only adds
0.56mb extra memory usage. I believe this is worth the cost for what we
get (results below).
2. Inline the `get` part of `getOrCreate(Node&)`, and move the non-inlined
part to new method `getOrCreateSlow`.
Based on 60 seconds of using VoiceOver on html.spec.whatwg.org, we hit
this new inlined fast path 98.9% of the
time (~51,114,000 fast path hits vs. `590,000` slow-path hits). This
required creation of a new method called
exportedGetOrCreate which is outlined for consumers outside WebCore, as
inlined functions cannot be exported.
3. Add a new `AXObjectCache::getOrCreate(Element&)` method, allowing us to
skip an `is<Document>` check in contexts
where we've already casted a `Node` into an `Element`.
This eliminates 1532 samples (1.5 seconds) of main-thread time based on 60
seconds of using VoiceOver on html.spec.whatwg.org.
Places that used `getOrCreate` are now changed to import
`AXObjectCacheInlines.h` instead of `AXObjectCache.h`.
* Source/WebCore/accessibility/AXListHelpers.cpp:
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::cacheAndInitializeWrapper):
(WebCore::AXObjectCache::exportedGetOrCreate):
(WebCore::AXObjectCache::getOrCreateSlow):
(WebCore::AXObjectCache::remove):
(WebCore::AXObjectCache::onPaint const):
* Source/WebCore/accessibility/AXObjectCache.h:
* Source/WebCore/accessibility/AXObjectCacheInlines.h:
(WebCore::AXObjectCache::getOrCreate):
* Source/WebCore/accessibility/AXSearchManager.cpp:
* Source/WebCore/accessibility/AccessibilityImageMapLink.cpp:
* Source/WebCore/accessibility/AccessibilityListBoxOption.cpp:
* Source/WebCore/accessibility/AccessibilityMathMLElement.cpp:
* Source/WebCore/accessibility/AccessibilityMenuListOption.cpp:
* Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
* Source/WebCore/accessibility/AccessibilityObject.cpp:
* Source/WebCore/accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::nextSibling const):
* Source/WebCore/accessibility/AccessibilitySVGObject.cpp:
* Source/WebCore/accessibility/AccessibilityScrollView.cpp:
* Source/WebCore/accessibility/AccessibilityTableCell.cpp:
* Source/WebCore/accessibility/cocoa/AccessibilityObjectCocoa.mm:
* Source/WebCore/accessibility/ios/WebAccessibilityObjectWrapperIOS.mm:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
* Source/WebCore/accessibility/mac/AccessibilityObjectMac.mm:
* Source/WebCore/accessibility/mac/WebAccessibilityObjectWrapperMac.mm:
* Source/WebCore/dom/Document.cpp:
* Source/WebCore/inspector/InspectorAuditAccessibilityObject.cpp:
* Source/WebCore/inspector/InspectorOverlay.cpp:
* Source/WebCore/inspector/agents/InspectorDOMAgent.cpp:
* Source/WebCore/page/Page.cpp:
* Source/WebCore/page/PrintContext.cpp:
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::axObjectForElement const):
* Source/WebKit/WebProcess/Automation/WebAutomationSessionProxy.cpp:
(WebKit::WebAutomationSessionProxy::getAccessibilityObjectForNode):
* Source/WebKit/WebProcess/Plugins/PDF/PDFPlugin.mm:
(-[WKPDFPluginAccessibilityObject parent]):
(-[WKPDFPluginAccessibilityObject accessibilityFocusedUIElement]):
(-[WKPDFPluginAccessibilityObject
accessibilityAssociatedControlForAnnotation:]):
* Source/WebKit/WebProcess/Plugins/PDF/UnifiedPDF/UnifiedPDFPlugin.mm:
(WebKit::UnifiedPDFPlugin::accessibilityCoreObject):
* Source/WebKit/WebProcess/Plugins/PDF/WKAccessibilityPDFDocumentObject.mm:
(-[WKAccessibilityPDFDocumentObject accessibilityFocusedUIElement]):
(-[WKAccessibilityPDFDocumentObject accessibilityParent]):
(-[WKAccessibilityPDFDocumentObject
accessibilityAssociatedControlForAnnotation:]):
Canonical link: https://commits.webkit.org/299439@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes