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