Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 202b4702d12b320ab03a6c2b9e4be7918023ab78
      
https://github.com/WebKit/WebKit/commit/202b4702d12b320ab03a6c2b9e4be7918023ab78
  Author: Tyler Wilcock <[email protected]>
  Date:   2025-05-10 (Sat, 10 May 2025)

  Changed paths:
    M Source/WebCore/accessibility/AXCoreObject.cpp
    M Source/WebCore/accessibility/AXCoreObject.h
    M Source/WebCore/accessibility/AccessibilityListBox.cpp
    M Source/WebCore/accessibility/AccessibilityMathMLElement.cpp
    M Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp
    M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
    M Source/WebCore/accessibility/AccessibilityObject.cpp
    M Source/WebCore/accessibility/AccessibilityObject.h
    M Source/WebCore/accessibility/AccessibilityRenderObject.cpp
    M Source/WebCore/accessibility/AccessibilityRenderObject.h
    M Source/WebCore/accessibility/AccessibilityScrollView.cpp
    M Source/WebCore/accessibility/AccessibilitySlider.cpp
    M Source/WebCore/accessibility/AccessibilityTable.cpp
    M Source/WebCore/accessibility/AccessibilityTableColumn.cpp
    M Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp
    M Source/WebCore/accessibility/AccessibilityTableRow.cpp
    M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
    M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h

  Log Message:
  -----------
  AX: AXCoreObject::{nextSiblingIncludingIgnored, 
previousSiblingIncludingIgnored} are O(n), causing poor performance on sites 
with big accessibility trees
https://bugs.webkit.org/show_bug.cgi?id=292799
rdar://151029465

Reviewed by Joshua Hoffman.

Prior to this commit, AXCoreObject::{nextSiblingIncludingIgnored, 
previousSiblingIncludingIgnored} were O(n) because
it iterated over siblings to find |this|, then used that index to return the 
next or previous sibling.

With this commit, each object now has an m_indexInParent member variable that 
is assigned by its parent when added as
a child. This new member variable does not increase the size of AXCoreObject, 
AXIsolatedObject, or AccessibilityObject
at all, as it was placed into a place that used to be occupied by padding 
between existing member variables.

This commit adds ASSERTs that verifies the cached indices are correct 
(contiguous, starting from zero, no gaps). When
debugging one of these ASSERTs, I discovered another performance optimization 
that also prevents said ASSERT. Prior to
this commit, we used to add all DOM children, then add our list marker child at 
index 0. This requires shifting the
entire vector over, which is O(n). Now, we move the addListItemMarker() call to 
the right place, obviating the need
for this O(n) work.

This eliminates 23782 samples of 49643 accessibility thread samples on 
http://html.spec.whatwg.org, taken while holding
the VO-Right keys.

* Source/WebCore/accessibility/AXCoreObject.cpp:
(WebCore::AXCoreObject::verifyChildrenIndexInParent const):
(WebCore::AXCoreObject::indexInSiblings const):
(WebCore::AXCoreObject::nextSiblingIncludingIgnored const):
(WebCore::AXCoreObject::previousSiblingIncludingIgnored):
* Source/WebCore/accessibility/AXCoreObject.h:
(WebCore::AXCoreObject::setIndexInParent):
(WebCore::AXCoreObject::shouldSetChildIndexInParent const):
(WebCore::AXCoreObject::setChildIndexInParent const):
(WebCore::AXCoreObject::indexInParent const):
* Source/WebCore/accessibility/AccessibilityListBox.cpp:
(WebCore::AccessibilityListBox::addChildren):
* Source/WebCore/accessibility/AccessibilityMathMLElement.cpp:
(WebCore::AccessibilityMathMLElement::addChildren):
* Source/WebCore/accessibility/AccessibilityMenuListPopup.cpp:
(WebCore::AccessibilityMenuListPopup::addChildren):
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::updateOwnedChildren):
(WebCore::AccessibilityNodeObject::addChildren):
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::insertChild):
(WebCore::AccessibilityObject::resetChildrenIndexInParent const):
* Source/WebCore/accessibility/AccessibilityObject.h:
* Source/WebCore/accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::addChildren):
(WebCore::AccessibilityRenderObject::addListItemMarker): Deleted.
* Source/WebCore/accessibility/AccessibilityRenderObject.h:
* Source/WebCore/accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::removeChildScrollbar):
(WebCore::AccessibilityScrollView::addChildren):
* Source/WebCore/accessibility/AccessibilitySlider.cpp:
(WebCore::AccessibilitySlider::addChildren):
* Source/WebCore/accessibility/AccessibilityTable.cpp:
(WebCore::AccessibilityTable::addChildren):
* Source/WebCore/accessibility/AccessibilityTableColumn.cpp:
(WebCore::AccessibilityTableColumn::addChildren):
* Source/WebCore/accessibility/AccessibilityTableHeaderContainer.cpp:
(WebCore::AccessibilityTableHeaderContainer::addChildren):
* Source/WebCore/accessibility/AccessibilityTableRow.cpp:
(WebCore::AccessibilityTableRow::addChildren):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::children):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:

Canonical link: https://commits.webkit.org/294747@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