Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 965f70e7b6c9145e2f9977f3087f42f7aa09a1ae
      
https://github.com/WebKit/WebKit/commit/965f70e7b6c9145e2f9977f3087f42f7aa09a1ae
  Author: Wenson Hsieh <wenson_hs...@apple.com>
  Date:   2024-12-20 (Fri, 20 Dec 2024)

  Changed paths:
    A 
LayoutTests/editing/selection/ios/bidi-visually-contiguous-selection-extending-expected.txt
    A 
LayoutTests/editing/selection/ios/bidi-visually-contiguous-selection-extending.html
    M Source/WebCore/editing/Editing.cpp
    M Source/WebCore/editing/Editing.h
    M Source/WebCore/editing/FrameSelection.cpp
    M Source/WebCore/editing/FrameSelection.h
    M Source/WebCore/editing/RenderedPosition.cpp
    M Source/WebCore/editing/RenderedPosition.h

  Log Message:
  -----------
  Ensure visually contiguous boundaries when extending selection using 
Shift+Arrow keys
https://bugs.webkit.org/show_bug.cgi?id=284981
rdar://141786406

Reviewed by Aditya Keerthi and Ryosuke Niwa.

Add support for snapping to the nearest bidi text boundary that results in a 
visually contiguous
selection on iOS, in the case where 
`VisuallyContiguousBidiTextSelectionEnabled` is turned on. To
achieve this, we refactor the existing utilities in `Editing.cpp` that are 
currently used to adjust
a selection to nearest visually-contiguous bidi text boundaries, and expose a 
new helper function
that's used in `FrameSelection` when performing user-triggered selection 
extension.

See below for more details.

* 
LayoutTests/editing/selection/ios/bidi-visually-contiguous-selection-extending-expected.txt:
 Added.
* 
LayoutTests/editing/selection/ios/bidi-visually-contiguous-selection-extending.html:
 Added.

Add a layout test to exercise this change by extending the selection by word 
granularity, through
LTR and RTL paragraphs containing bidi text.

* Source/WebCore/editing/Editing.cpp:
(WebCore::findBidiBoundary):

Add a `SelectionExtentMovement` enum argument to control whether we should pick 
the left or right
bidi boundary when determining the adjusted boundary point that maintains 
visual contiguity.

(WebCore::boxWithMinimumBidiLevelBetween):

Add a helper method to find the inline box with the minimum bidi level between 
two
`RenderedPosition`s, and use it in a couple places below.

(WebCore::primaryDirectionForSingleLineRange):
(WebCore::makeVisuallyContiguousIfNeeded):

Pull the existing logic in `adjustToVisuallyContiguousRange` into a static 
helper, that returns
a visually contiguous range for the given range (or `nullopt` if there's no 
adjustment needed).

(WebCore::adjustToVisuallyContiguousRange):

Reimplement this in terms of `makeVisuallyContiguousIfNeeded`.

(WebCore::adjustVisibleExtentPreservingVisualContiguity):

Expose a new helper function that takes a base and (mutable) extent, and 
adjusts the extent in order
to produce a visually contiguous selection across bidi text.

(WebCore::visuallyClosestBidiBoundary): Deleted.
* Source/WebCore/editing/Editing.h:
* Source/WebCore/editing/FrameSelection.cpp:
(WebCore::FrameSelection::adjustSelectionExtentIfNeeded):

In addition to adjusting the position for `user-select: all;`, we now also 
ensure that the new
selection extent will result in a visually contiguous selection using the above 
helper.

(WebCore::FrameSelection::modifyExtendingRight):
(WebCore::FrameSelection::modifyExtendingForward):
(WebCore::FrameSelection::modifyExtendingLeft):
(WebCore::FrameSelection::modifyExtendingBackward):
(WebCore::FrameSelection::modify):

Plumb the `UserTriggered` flag into `modifyExtending*`.

(WebCore::FrameSelection::updateAppearance):
(WebCore::adjustPositionForUserSelectAll): Deleted.

Rename this to `adjustSelectionExtentIfNeeded`, and make it a private method on 
`FrameSelection`.

* Source/WebCore/editing/FrameSelection.h:
(WebCore::RenderedPosition::boundaryPoint const):
* Source/WebCore/editing/RenderedPosition.h:

Add a helper to make a `BoundaryPoint` from the `RenderedPosition`.

Canonical link: https://commits.webkit.org/288183@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to