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

Reply via email to