Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 361a2d0b089f36a9396f68ebb0d11acebece8dc2
https://github.com/WebKit/WebKit/commit/361a2d0b089f36a9396f68ebb0d11acebece8dc2
Author: Tyler Wilcock <[email protected]>
Date: 2026-03-11 (Wed, 11 Mar 2026)
Changed paths:
A LayoutTests/accessibility/aria-hidden-text-stitching-expected.txt
A LayoutTests/accessibility/aria-hidden-text-stitching.html
M LayoutTests/platform/glib/TestExpectations
M Source/WebCore/accessibility/AXCoreObject.cpp
M Source/WebCore/accessibility/AXCoreObject.h
M Source/WebCore/accessibility/AXLogger.cpp
M Source/WebCore/accessibility/AXObjectCache.cpp
M Source/WebCore/accessibility/AXUtilities.cpp
M Source/WebCore/accessibility/AXUtilities.h
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/AccessibilityScrollView.cpp
M Source/WebCore/accessibility/AccessibilityScrollView.h
M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp
M Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h
M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp
M Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h
M Source/WebCore/accessibility/isolatedtree/mac/AXIsolatedObjectMac.mm
Log Message:
-----------
AX: Exclude aria-hidden text from stitched accessibility text
https://bugs.webkit.org/show_bug.cgi?id=309167
rdar://171726246
Reviewed by Joshua Hoffman.
When text stitching is enabled, text within aria-hidden="true" elements was
incorrectly included in the stitched text output. For example, given
<span>$45.79<span aria-hidden="true">/mo.</span> per month</span>, the
stitched text included "/mo." when it should only expose "$45.79 per month".
The root cause was that stringValue() computed stitched text using a contiguous
range from first to last stitch group member, capturing all DOM text in between,
including text from aria-hidden nodes.
Fix this by:
- Main thread: building text from consecutive runs of non-hidden members,
flushing each run as a DOM range to preserve inter-element whitespace while
skipping hidden content.
- Isolated tree: iterating members individually and skipping hidden ones.
- Filtering hidden members from bounding box computation, simpleRange()
endpoints, and textMarkerRange() endpoints.
To support isAXHidden() on both live and isolated trees, store IsARIAHidden
(a local per-node property) in the isolated tree, then compute isAXHidden()
on-the-fly via ancestor traversal in AXCoreObject. This avoids the need to
dirty stitch groups when aria-hidden changes dynamically.
Also fix duplicate stitch group members caused by multiple layout boxes sharing
the same RenderText renderer (e.g. text split across lines). This was exposed by
test hit-test-on-stitched-text.html due to the new AXIsolatedObject::stringValue
implementation which explicitly visits each stitch-group member.
Test: accessibility/aria-hidden-text-stitching.html
* LayoutTests/accessibility/aria-hidden-text-stitching-expected.txt: Added.
* LayoutTests/accessibility/aria-hidden-text-stitching.html: Added.
* Source/WebCore/accessibility/AXCoreObject.cpp:
(WebCore::AXCoreObject::isAXHidden const):
* Source/WebCore/accessibility/AXCoreObject.h:
(WebCore::AXCoreObject::isARIAHidden const):
* Source/WebCore/accessibility/AXLogger.cpp:
(WebCore::operator<<):
* Source/WebCore/accessibility/AXObjectCache.cpp:
(WebCore::AXObjectCache::handleAttributeChange):
* Source/WebCore/accessibility/AXUtilities.cpp:
(WebCore::lastNonAriaHiddenNode):
(WebCore::lastNode): Deleted.
* Source/WebCore/accessibility/AXUtilities.h:
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::stitchGroups const):
(WebCore::AccessibilityNodeObject::stringValue const):
* Source/WebCore/accessibility/AccessibilityObject.cpp:
(WebCore::AccessibilityObject::simpleRange const):
(WebCore::AccessibilityObject::cachedIsIgnored const):
(WebCore::AccessibilityObject::isAXHidden const): Deleted.
* Source/WebCore/accessibility/AccessibilityObject.h:
* Source/WebCore/accessibility/AccessibilityRenderObject.cpp:
(WebCore::AccessibilityRenderObject::boundingBoxRect const):
* Source/WebCore/accessibility/AccessibilityScrollView.cpp:
(WebCore::AccessibilityScrollView::isAXHidden const): Deleted.
* Source/WebCore/accessibility/AccessibilityScrollView.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.cpp:
(WebCore::AXIsolatedObject::relativeFrame const):
(WebCore::AXIsolatedObject::stringValue const):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedObject.h:
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.cpp:
(WebCore::AXIsolatedTree::updateNodeProperties):
(WebCore::convertToPropertyFlag):
(WebCore::createIsolatedObjectData):
* Source/WebCore/accessibility/isolatedtree/AXIsolatedTree.h:
* Source/WebCore/accessibility/isolatedtree/mac/AXIsolatedObjectMac.mm:
(WebCore::AXIsolatedObject::textMarkerRange const):
Canonical link: https://commits.webkit.org/309096@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications