Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 291c3ca40cf8068ae4251f350c2f450499595e10
https://github.com/WebKit/WebKit/commit/291c3ca40cf8068ae4251f350c2f450499595e10
Author: Mike Gorse <[email protected]>
Date: 2026-07-31 (Fri, 31 Jul 2026)
Changed paths:
A LayoutTests/accessibility/gtk/text-at-offset-user-select-none-expected.txt
A LayoutTests/accessibility/gtk/text-at-offset-user-select-none.html
M Source/WebCore/accessibility/AccessibilityNodeObject.cpp
M Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp
M Source/WebCore/dom/Position.cpp
M Source/WebCore/dom/Position.h
M Source/WebCore/dom/PositionIterator.cpp
M Source/WebCore/dom/PositionIterator.h
M Source/WebCore/editing/Editing.cpp
M Source/WebCore/editing/Editing.h
M Source/WebCore/editing/VisiblePosition.cpp
M Source/WebCore/editing/VisiblePosition.h
M Source/WebCore/editing/VisibleUnits.cpp
M Source/WebCore/rendering/RenderObject.cpp
M Source/WebCore/rendering/RenderObject.h
Log Message:
-----------
AX: AT-SPI implementation computes offsets incorrectly when user-select:none
is set
https://bugs.webkit.org/show_bug.cgi?id=318228
Reviewed by Tyler Wilcock.
When GetStringAtOffset is called, the code currently uses VisiblePositions
to calculate text boundaries. The VisiblePosition code skips over text
when user-select:none is set, causing the resulting positions to be
canonicalized to point outside of the node, resulting in offsets that
are out of synch with the text that is being exposed for accessibility
purposes. This later causes a crash when the code tries to convert
the offsets to UTF-8, but the offsets can be larger than the length of
the text.
VisiblePositions now optionally consider positions inside user-select:none
to be valid, and the setting is propagated when new VisiblePositions
are constructed based on existing ones.
* LayoutTests/accessibility/gtk/text-at-offset-user-select-none-expected.txt:
Added.
* LayoutTests/accessibility/gtk/text-at-offset-user-select-none.html: Added.
* Source/WebCore/accessibility/AccessibilityNodeObject.cpp:
(WebCore::AccessibilityNodeObject::visiblePositionForIndex const):
* Source/WebCore/accessibility/atspi/AccessibilityObjectTextAtspi.cpp:
(WebCore::AccessibilityObjectAtspi::textAttributes const):
* Source/WebCore/dom/Position.cpp:
(WebCore::Position::isCandidate const):
* Source/WebCore/dom/Position.h:
* Source/WebCore/dom/PositionIterator.cpp:
(WebCore::PositionIterator::isCandidate const):
* Source/WebCore/dom/PositionIterator.h:
* Source/WebCore/editing/Editing.cpp:
(WebCore::nextCandidate):
(WebCore::previousCandidate):
(WebCore::visiblePositionForIndex):
* Source/WebCore/editing/Editing.h:
* Source/WebCore/editing/VisiblePosition.cpp:
(WebCore::VisiblePosition::VisiblePosition):
(WebCore::VisiblePosition::honorEditingBoundaryAtOrBefore const):
(WebCore::VisiblePosition::honorEditingBoundaryAtOrAfter const):
(WebCore::canonicalizeCandidate):
(WebCore::VisiblePosition::canonicalPosition):
* Source/WebCore/editing/VisiblePosition.h:
(WebCore::VisiblePosition::allowUserSelectNone const):
* Source/WebCore/editing/VisibleUnits.cpp:
(WebCore::previousLineCandidatePosition):
(WebCore::nextLineCandidatePosition):
(WebCore::previousBoundary):
(WebCore::nextBoundary):
(WebCore::startPositionForLine):
(WebCore::endPositionForLine):
(WebCore::nextLinePosition):
(WebCore::startOfParagraph):
(WebCore::endOfParagraph):
(WebCore::startOfBlock):
(WebCore::endOfBlock):
* Source/WebCore/rendering/RenderObject.cpp:
(WebCore::RenderObject::visiblePositionForPoint):
* Source/WebCore/rendering/RenderObject.h:
Canonical link: https://commits.webkit.org/318359@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications