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

Reply via email to