-
Notifications
You must be signed in to change notification settings - Fork 28.5k
Fix SelectionArea select-word edge cases #136920
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
a8a6522
to
0306c37
Compare
|
||
final TextPosition position = paragraph.getPositionForOffset(paragraph.globalToLocal(globalPosition)); | ||
if (_positionIsWithinCurrentSelection(position) && _textSelectionStart != _textSelectionEnd) { | ||
return SelectionResult.end; | ||
} | ||
final _WordBoundaryRecord wordBoundary = _getWordBoundaryAtPosition(position); | ||
if (wordBoundary.wordStart.offset < range.start && wordBoundary.wordEnd.offset < range.start) { | ||
if (wordBoundary.wordStart.offset < range.start && wordBoundary.wordEnd.offset <= range.start) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This change was made to handle the case when SelectWordSelectionEvent
is dispatched with a position that is on a placeholder in the text. In this case _getWordBoundaryAtPosition
may return the range of the placeholder which touches the edges of the selectable fragments range.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe add a comment to explain this?
@@ -2367,6 +2372,7 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai | |||
final SelectionResult childResult = dispatchSelectionEventToChild(child, event); | |||
switch (childResult) { | |||
case SelectionResult.next: | |||
case SelectionResult.forward: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SelectionResult.forward
is not returned by any of the edge update events at the moment so I choose to handle them here. I could also throw an unimplemented error here instead.
@@ -1843,13 +1843,13 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai | |||
/// Returns positive if a is lower, negative if a is higher, 0 if their | |||
/// order can't be determine solely by their vertical position. | |||
static int _compareVertically(Rect a, Rect b) { | |||
if ((a.top - b.top).abs() > _kSelectableVerticalComparingThreshold) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I noticed that on single-line text, the selectable fragment rects provided by RenderParagraph
do not encompass each other even when split by WidgetSpan
s. From my observation only on multi-line text is there some potential for encompassing rects.
This led me to move the rect top comparison first so that we don't immediately defer to horizontal comparison on multi-line text. Before this change we would immediately defer to horizontal comparison which is a little unreliable for encompassing rects that begin at the same Offset
.
I am a little concerned that this breaks some more complex cases but all tests are passing and #132821 which was a regression is fixed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This new logic fails on a single line text widget with a widget span, where the widget span has a greater height than the line.
@@ -53,6 +53,9 @@ enum SelectionResult { | |||
/// [SelectAllSelectionEvent], [ClearSelectionEvent], and | |||
/// [SelectWordSelectionEvent]. | |||
none, | |||
/// The selection may begin in this [Selectable], further selection should | |||
/// continue to next [Selectable] in screen order. | |||
forward, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Still working on these docs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the difference between next and forward?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wanted to handle these two scenarios:
- A paragraph is broken by a
WidgetSpan
, we are in theSelectable
containing the first half of the paragraph before theWidgetSpan
so walk to the next selectable to continue searching for the complete paragraph. In this case the delegate should set thecurrentSelectionStartIndex
and continue walking through the selectable tree. - The paragraph range comes after the range contained by the
Selectable
so walk to the next selectable. In this case we continue walking through the selectable tree but the delegate should not setcurrentSelectionStartIndex
.
I wanted some way to tell the delegate that the selection begins in the receiver of the event and we should continue walking through the selectable tree to find the rest of the selection.
From the documentation of SelectionResult.next
There is nothing left to select forward in this Selectable, and further selection should extend to the next Selectable in screen order.
it sounds like it would be appropriate in this case, but then that would make currentSelectionStartIndex
inaccurate since there is no way to differentiate between the two scenarios.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
WRT to only selecting a word, handleSelectWord
only dispatches events if the given position is inside the rect, so we also needed a new indicator so we could disable this restriction. We may be able to use SelectionResult.next
here instead but we would have to remove that restriction.
e75cb7b
to
08cab84
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wonder if there is a better way. The current proposed solution creates a special case handling between render paragraph and widget span.
An alternative I was thinking, but I am not sure if this will work or not is to let Selectable to return mutliple rects that covers exact text. In this case the first fragment will not contain the selectionWord position in the first place. However, this make it harder to calculate screen order.
@@ -53,6 +53,9 @@ enum SelectionResult { | |||
/// [SelectAllSelectionEvent], [ClearSelectionEvent], and | |||
/// [SelectWordSelectionEvent]. | |||
none, | |||
/// The selection may begin in this [Selectable], further selection should | |||
/// continue to next [Selectable] in screen order. | |||
forward, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What's the difference between next and forward?
I'm also not the biggest fan of this proposal, but wanted to get the ball rolling. Thanks for the suggestion, I think having the |
I think the selectable should only provide granular rects to make the api cleaner, it will then be the sort algorithm to combine these rects for sorting. The other alternative I can think of is to wrap text widget to be a selection container by itself. within the selection container, you can have more explicit control over selectable fragment ordering and event handling. |
a00fd17
to
d83aeaa
Compare
c5568d1
to
8a78a8f
Compare
8a78a8f
to
69193af
Compare
9d179a5
to
e0625ce
Compare
Hi @chunhtai apologies for the delay on this one. I went with adding the granular rects, mostly because I think we should have the precise region that covers the |
examples/api/lib/material/selectable_region/selectable_region.0.dart
Outdated
Show resolved
Hide resolved
@@ -1863,19 +1872,10 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai | |||
static int _compareHorizontally(Rect a, Rect b) { | |||
// a encloses b. | |||
if (a.left - b.left < precisionErrorTolerance && a.right - b.right > - precisionErrorTolerance) { | |||
// b ends before a. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I added these in #127478 , but looking at them again I don't think they make sense. If a is encompassed by b then we can assume a is higher since it started before b. If b is encompassed by a then we can assume b is higher since it started before a.
// b encloses a. | ||
if (b.left - a.left < precisionErrorTolerance && b.right - a.right > - precisionErrorTolerance) { | ||
// a ends before b. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
4758816
to
e9ef8c0
Compare
@@ -115,6 +115,9 @@ class _RenderSelectableAdapter extends RenderProxyBox with Selectable, Selection | |||
|
|||
// Selectable APIs. | |||
|
|||
@override | |||
List<Rect> get boundingBoxes => <Rect>[paintBounds]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the best way to set the boundingBox
? Or should it be based on the size
Rect.fromLTWH(0.0, 0.0, size.width, size.height)
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this looks fine
|
||
final TextPosition position = paragraph.getPositionForOffset(paragraph.globalToLocal(globalPosition)); | ||
if (_positionIsWithinCurrentSelection(position) && _textSelectionStart != _textSelectionEnd) { | ||
return SelectionResult.end; | ||
} | ||
final _WordBoundaryRecord wordBoundary = _getWordBoundaryAtPosition(position); | ||
if (wordBoundary.wordStart.offset < range.start && wordBoundary.wordEnd.offset < range.start) { | ||
if (wordBoundary.wordStart.offset < range.start && wordBoundary.wordEnd.offset <= range.start) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe add a comment to explain this?
@@ -142,6 +142,10 @@ mixin Selectable implements SelectionHandler { | |||
/// The size of this [Selectable]. | |||
Size get size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this still neededed if we we use boundingBoxes to locate the selectable?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The only reason I can think of for keeping this is that it is a nice convenience for the user to get the size of the Selectable without merging their own boxes. In the framework I think there's only one more usage of it, but that can be replaced by merging the boxes and getting the size. I'm leaning more towards keeping it, but don't feel strongly either way. What do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't have strong preference as well. I am ok if we keep it for now. There is another project to implement search feature that may require more refactoring on the renderparagraph, we can decide whether we want to keep this field when we do that.
@@ -1817,6 +1817,14 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai | |||
_updateHandleLayersAndOwners(); | |||
} | |||
|
|||
Rect _getBoundingBox(Selectable selectable) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If we merge before sorting, wouldn't we run into corner cases like before?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I realized this is probably come from my previous suggestions. I am not sure what the right answer is.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think merging before sorting is okay, the corner cases we were running into were mostly due to some invalid logic I added into the logic that compares selectables, so the selectables were out of order. See #136920 (comment) .
Another issue was that even when the selectables are in order we would still hit selectables that did not actually contain the tapped global position. boundingBoxes solves this by giving us the precise rects to check against versus an all encompassing rect that we had before.
Take Text before widgetspan [SelectableWidgetSpan] Text after widgetspan
.
We want to select something in Text after widgetspan
.
SelectableA: Text before widgetspan
SelectableB: [SelectableWidgetSpan]
SelectableC: Text after widgetspan
Order: [SelectableA, SelectableB, SelectableC]
SelectableA's rect would encompass SelectableB and SelectableC. So a tap on either of those Selectables will always hit SelectableA first.
In the example above we would still hit SelectableA, and SelectableB before hitting SelectableC. SelectableA would return SelectionResult.next as expected, but the following SelectableB would not contain the global position at all so the iteration would stop there and never reach SelectableC.
By iterating through the boundingBoxes we will now only hit SelectableC.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SelectableA's rect would encompass SelectableB and SelectableC. So a tap on either of those Selectables will always hit SelectableA first.
How so? is the Text before widgetspan
got broken into two lines?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Oh yeah sorry forgot that detail. The example only makes sense if Text before widgetspan
is on two lines.
We wouldn't run into this issue in the case where all Selectable fragments are on the same line because they do not overlap.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM just nits and some questions.
Another alternative I can think of without breaking changes are to break each sentence in between new lines into semantics fragment. This way you won't have cases where a selectable is complete encompassed another.
@@ -115,6 +115,9 @@ class _RenderSelectableAdapter extends RenderProxyBox with Selectable, Selection | |||
|
|||
// Selectable APIs. | |||
|
|||
@override | |||
List<Rect> get boundingBoxes => <Rect>[paintBounds]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this looks fine
@@ -142,6 +142,10 @@ mixin Selectable implements SelectionHandler { | |||
/// The size of this [Selectable]. | |||
Size get size; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't have strong preference as well. I am ok if we keep it for now. There is another project to implement search feature that may require more refactoring on the renderparagraph, we can decide whether we want to keep this field when we do that.
@@ -1817,6 +1817,14 @@ abstract class MultiSelectableSelectionContainerDelegate extends SelectionContai | |||
_updateHandleLayersAndOwners(); | |||
} | |||
|
|||
Rect _getBoundingBox(Selectable selectable) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
SelectableA's rect would encompass SelectableB and SelectableC. So a tap on either of those Selectables will always hit SelectableA first.
How so? is the Text before widgetspan
got broken into two lines?
That sounds like it could work, but I think we would also have to do it for soft wraps and new lines if I understand correctly since sometimes a line will not end of a new line. I'm not sure we have a way to detect soft wraps? I think I'm leaning towards |
Right, I forgot there isn't a good API to get softwrap and ellipsis. current approach lgtm then |
Manual roll requested by [email protected] flutter/flutter@c642f4e...9719097 2023-12-11 [email protected] Roll Flutter Engine from 5587d26aa2d4 to 4c309195b79d (1 revision) (flutter/flutter#139936) 2023-12-11 [email protected] Fix SelectionArea select-word edge cases (flutter/flutter#136920) 2023-12-11 [email protected] Roll Flutter Engine from 9b85b76db0de to 5587d26aa2d4 (3 revisions) (flutter/flutter#139933) 2023-12-11 [email protected] Roll Flutter Engine from 7eb6b7cab60c to 9b85b76db0de (2 revisions) (flutter/flutter#139931) 2023-12-11 [email protected] Use dart analyze package for `num.clamp` (flutter/flutter#139867) 2023-12-11 [email protected] Roll pub packages (flutter/flutter#139926) 2023-12-11 [email protected] Handle the case when _CupertinoBackGestureDetector is disposed during the drag. (flutter/flutter#139585) 2023-12-11 [email protected] Add accessibility identifier to `SemanticsProperties` (flutter/flutter#138331) 2023-12-11 [email protected] Improve slider's value indicator display test (flutter/flutter#139198) 2023-12-11 [email protected] Add `enabled` property to `ExpansionTile` (flutter/flutter#139519) 2023-12-11 [email protected] Roll Packages from 6cd0657 to cb6dbcd (9 revisions) (flutter/flutter#139911) 2023-12-11 [email protected] Roll Flutter Engine from bc0222b64c96 to 7eb6b7cab60c (1 revision) (flutter/flutter#139891) 2023-12-10 [email protected] Roll Flutter Engine from fb80aafd259b to bc0222b64c96 (1 revision) (flutter/flutter#139885) 2023-12-09 [email protected] Roll pub packages (flutter/flutter#139864) 2023-12-09 [email protected] Roll Flutter Engine from b75960a5820a to fb80aafd259b (1 revision) (flutter/flutter#139863) 2023-12-09 [email protected] Roll Flutter Engine from e80c090d09c6 to b75960a5820a (1 revision) (flutter/flutter#139853) 2023-12-09 [email protected] Roll Flutter Engine from 101396fd3b82 to e80c090d09c6 (2 revisions) (flutter/flutter#139851) 2023-12-09 [email protected] Roll Flutter Engine from 503584615fd7 to 101396fd3b82 (2 revisions) (flutter/flutter#139847) 2023-12-09 [email protected] Roll Flutter Engine from e9cb19fa637a to 503584615fd7 (1 revision) (flutter/flutter#139837) 2023-12-08 [email protected] Roll Flutter Engine from 7dc51b85a634 to e9cb19fa637a (1 revision) (flutter/flutter#139831) 2023-12-08 [email protected] [flutter release] Add cherry pick template for pull request description (flutter/flutter#139590) 2023-12-08 [email protected] Roll Flutter Engine from 03c5f016e919 to 7dc51b85a634 (1 revision) (flutter/flutter#139829) 2023-12-08 [email protected] Add Overlay.wrap for convenience (flutter/flutter#139823) 2023-12-08 [email protected] Roll Flutter Engine from 72da960e2ef2 to 03c5f016e919 (1 revision) (flutter/flutter#139826) 2023-12-08 [email protected] Roll Flutter Engine from 5dd2619c282b to 72da960e2ef2 (1 revision) (flutter/flutter#139821) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
) Manual roll requested by [email protected] flutter/flutter@c642f4e...9719097 2023-12-11 [email protected] Roll Flutter Engine from 5587d26aa2d4 to 4c309195b79d (1 revision) (flutter/flutter#139936) 2023-12-11 [email protected] Fix SelectionArea select-word edge cases (flutter/flutter#136920) 2023-12-11 [email protected] Roll Flutter Engine from 9b85b76db0de to 5587d26aa2d4 (3 revisions) (flutter/flutter#139933) 2023-12-11 [email protected] Roll Flutter Engine from 7eb6b7cab60c to 9b85b76db0de (2 revisions) (flutter/flutter#139931) 2023-12-11 [email protected] Use dart analyze package for `num.clamp` (flutter/flutter#139867) 2023-12-11 [email protected] Roll pub packages (flutter/flutter#139926) 2023-12-11 [email protected] Handle the case when _CupertinoBackGestureDetector is disposed during the drag. (flutter/flutter#139585) 2023-12-11 [email protected] Add accessibility identifier to `SemanticsProperties` (flutter/flutter#138331) 2023-12-11 [email protected] Improve slider's value indicator display test (flutter/flutter#139198) 2023-12-11 [email protected] Add `enabled` property to `ExpansionTile` (flutter/flutter#139519) 2023-12-11 [email protected] Roll Packages from 6cd0657 to cb6dbcd (9 revisions) (flutter/flutter#139911) 2023-12-11 [email protected] Roll Flutter Engine from bc0222b64c96 to 7eb6b7cab60c (1 revision) (flutter/flutter#139891) 2023-12-10 [email protected] Roll Flutter Engine from fb80aafd259b to bc0222b64c96 (1 revision) (flutter/flutter#139885) 2023-12-09 [email protected] Roll pub packages (flutter/flutter#139864) 2023-12-09 [email protected] Roll Flutter Engine from b75960a5820a to fb80aafd259b (1 revision) (flutter/flutter#139863) 2023-12-09 [email protected] Roll Flutter Engine from e80c090d09c6 to b75960a5820a (1 revision) (flutter/flutter#139853) 2023-12-09 [email protected] Roll Flutter Engine from 101396fd3b82 to e80c090d09c6 (2 revisions) (flutter/flutter#139851) 2023-12-09 [email protected] Roll Flutter Engine from 503584615fd7 to 101396fd3b82 (2 revisions) (flutter/flutter#139847) 2023-12-09 [email protected] Roll Flutter Engine from e9cb19fa637a to 503584615fd7 (1 revision) (flutter/flutter#139837) 2023-12-08 [email protected] Roll Flutter Engine from 7dc51b85a634 to e9cb19fa637a (1 revision) (flutter/flutter#139831) 2023-12-08 [email protected] [flutter release] Add cherry pick template for pull request description (flutter/flutter#139590) 2023-12-08 [email protected] Roll Flutter Engine from 03c5f016e919 to 7dc51b85a634 (1 revision) (flutter/flutter#139829) 2023-12-08 [email protected] Add Overlay.wrap for convenience (flutter/flutter#139823) 2023-12-08 [email protected] Roll Flutter Engine from 72da960e2ef2 to 03c5f016e919 (1 revision) (flutter/flutter#139826) 2023-12-08 [email protected] Roll Flutter Engine from 5dd2619c282b to 72da960e2ef2 (1 revision) (flutter/flutter#139821) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
) Manual roll requested by [email protected] flutter/flutter@c642f4e...9719097 2023-12-11 [email protected] Roll Flutter Engine from 5587d26aa2d4 to 4c309195b79d (1 revision) (flutter/flutter#139936) 2023-12-11 [email protected] Fix SelectionArea select-word edge cases (flutter/flutter#136920) 2023-12-11 [email protected] Roll Flutter Engine from 9b85b76db0de to 5587d26aa2d4 (3 revisions) (flutter/flutter#139933) 2023-12-11 [email protected] Roll Flutter Engine from 7eb6b7cab60c to 9b85b76db0de (2 revisions) (flutter/flutter#139931) 2023-12-11 [email protected] Use dart analyze package for `num.clamp` (flutter/flutter#139867) 2023-12-11 [email protected] Roll pub packages (flutter/flutter#139926) 2023-12-11 [email protected] Handle the case when _CupertinoBackGestureDetector is disposed during the drag. (flutter/flutter#139585) 2023-12-11 [email protected] Add accessibility identifier to `SemanticsProperties` (flutter/flutter#138331) 2023-12-11 [email protected] Improve slider's value indicator display test (flutter/flutter#139198) 2023-12-11 [email protected] Add `enabled` property to `ExpansionTile` (flutter/flutter#139519) 2023-12-11 [email protected] Roll Packages from 6cd0657 to cb6dbcd (9 revisions) (flutter/flutter#139911) 2023-12-11 [email protected] Roll Flutter Engine from bc0222b64c96 to 7eb6b7cab60c (1 revision) (flutter/flutter#139891) 2023-12-10 [email protected] Roll Flutter Engine from fb80aafd259b to bc0222b64c96 (1 revision) (flutter/flutter#139885) 2023-12-09 [email protected] Roll pub packages (flutter/flutter#139864) 2023-12-09 [email protected] Roll Flutter Engine from b75960a5820a to fb80aafd259b (1 revision) (flutter/flutter#139863) 2023-12-09 [email protected] Roll Flutter Engine from e80c090d09c6 to b75960a5820a (1 revision) (flutter/flutter#139853) 2023-12-09 [email protected] Roll Flutter Engine from 101396fd3b82 to e80c090d09c6 (2 revisions) (flutter/flutter#139851) 2023-12-09 [email protected] Roll Flutter Engine from 503584615fd7 to 101396fd3b82 (2 revisions) (flutter/flutter#139847) 2023-12-09 [email protected] Roll Flutter Engine from e9cb19fa637a to 503584615fd7 (1 revision) (flutter/flutter#139837) 2023-12-08 [email protected] Roll Flutter Engine from 7dc51b85a634 to e9cb19fa637a (1 revision) (flutter/flutter#139831) 2023-12-08 [email protected] [flutter release] Add cherry pick template for pull request description (flutter/flutter#139590) 2023-12-08 [email protected] Roll Flutter Engine from 03c5f016e919 to 7dc51b85a634 (1 revision) (flutter/flutter#139829) 2023-12-08 [email protected] Add Overlay.wrap for convenience (flutter/flutter#139823) 2023-12-08 [email protected] Roll Flutter Engine from 72da960e2ef2 to 03c5f016e919 (1 revision) (flutter/flutter#139826) 2023-12-08 [email protected] Roll Flutter Engine from 5dd2619c282b to 72da960e2ef2 (1 revision) (flutter/flutter#139821) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC [email protected],[email protected],[email protected] on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md
This change fixes issues with screen order comparison logic when rects are encompassed within each other. This was causing issues when trying to select text that includes inline
WidgetSpan
s inside of aSelectionArea
.boundingBoxes
toSelectable
for a more precise hit testing region.Fixes #132821
Fixes updating selection edge by word boundary when widget spans are involved.
Fixes crash when sending select word selection event to an unselectable element.
Pre-launch Checklist
///
).