Thanks to visit codestin.com
Credit goes to github.com

Skip to content

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

Merged
merged 34 commits into from
Dec 11, 2023

Conversation

Renzo-Olivares
Copy link
Contributor

@Renzo-Olivares Renzo-Olivares commented Oct 19, 2023

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 WidgetSpans inside of a SelectionArea.

  • Adds boundingBoxes to Selectable 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

  • I read the [Contributor Guide] and followed the process outlined there for submitting PRs.
  • I read the [Tree Hygiene] wiki page, which explains my responsibilities.
  • I read and followed the [Flutter Style Guide], including [Features we expect every widget to implement].
  • I signed the [CLA].
  • I listed at least one issue that this PR fixes in the description above.
  • I updated/added relevant documentation (doc comments with ///).
  • I added new tests to check the change I am making, or this PR is [test-exempt].
  • All existing and new tests are passing.

@github-actions github-actions bot added framework flutter/packages/flutter repository. See also f: labels. a: text input Entering text in a text field or keyboard related problems labels Oct 19, 2023

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) {
Copy link
Contributor Author

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.

Copy link
Contributor

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:
Copy link
Contributor Author

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) {
Copy link
Contributor Author

@Renzo-Olivares Renzo-Olivares Oct 20, 2023

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 WidgetSpans. 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.

Copy link
Contributor Author

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,
Copy link
Contributor Author

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.

Copy link
Contributor

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?

Copy link
Contributor Author

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:

  1. A paragraph is broken by a WidgetSpan, we are in the Selectable containing the first half of the paragraph before the WidgetSpan so walk to the next selectable to continue searching for the complete paragraph. In this case the delegate should set the currentSelectionStartIndex and continue walking through the selectable tree.
  2. 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 set currentSelectionStartIndex.

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.

Copy link
Contributor Author

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.

Copy link
Contributor

@chunhtai chunhtai left a 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,
Copy link
Contributor

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?

@Renzo-Olivares
Copy link
Contributor Author

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.

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 Selectable return multiple rects would work out. It would make calculating screen order more difficult but what if a Selectable provides the all encompassing Rect used to calculate screen order (what we have now), and provides some optional granular Rects that can be used to more precisely detect if a position actually landed in a Selectable. From my testing this approach would work but it might make some logic O(n^2) if we are iterating through the selectable list and then iterating through the optional provided rects of the selectable. What do you think?

@chunhtai
Copy link
Contributor

Thanks for the suggestion, I think having the Selectable return multiple rects would work out. It would make calculating screen order more difficult but what if a Selectable provides the all encompassing Rect used to calculate screen order (what we have now), and provides some optional granular Rects that can be used to more precisely detect if a position actually landed in a Selectable. From my testing this approach would work but it might make some logic O(n^2) if we are iterating through the selectable list and then iterating through the optional provided rects of the selectable. What do you think?

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.

@Renzo-Olivares Renzo-Olivares force-pushed the select-word-fix branch 2 times, most recently from a00fd17 to d83aeaa Compare November 21, 2023 19:50
@Renzo-Olivares Renzo-Olivares force-pushed the select-word-fix branch 2 times, most recently from c5568d1 to 8a78a8f Compare December 4, 2023 21:55
@github-actions github-actions bot added d: api docs Issues with https://api.flutter.dev/ d: examples Sample code and demos labels Dec 4, 2023
@github-actions github-actions bot added the f: material design flutter/packages/flutter/material repository. label Dec 6, 2023
@Renzo-Olivares
Copy link
Contributor Author

Renzo-Olivares commented Dec 6, 2023

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 Selectable instead of a close approximation. Let me know what you think.

@@ -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.
Copy link
Contributor Author

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.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@@ -115,6 +115,9 @@ class _RenderSelectableAdapter extends RenderProxyBox with Selectable, Selection

// Selectable APIs.

@override
List<Rect> get boundingBoxes => <Rect>[paintBounds];
Copy link
Contributor Author

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)?

Copy link
Contributor

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) {
Copy link
Contributor

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;
Copy link
Contributor

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?

Copy link
Contributor Author

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?

Copy link
Contributor

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) {
Copy link
Contributor

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?

Copy link
Contributor

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.

Copy link
Contributor Author

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.

Copy link
Contributor

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?

Copy link
Contributor Author

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.

Copy link
Contributor

@chunhtai chunhtai left a 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];
Copy link
Contributor

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;
Copy link
Contributor

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) {
Copy link
Contributor

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?

@Renzo-Olivares
Copy link
Contributor Author

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.

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 boundingBoxes since it is a more general solution that applies to any Selectable, where the alternative would be private to RenderParagraph.

@chunhtai
Copy link
Contributor

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 boundingBoxes since it is a more general solution that applies to any Selectable, where the alternative would be private to RenderParagraph.

Right, I forgot there isn't a good API to get softwrap and ellipsis. current approach lgtm then

@Renzo-Olivares Renzo-Olivares added the autosubmit Merge PR when tree becomes green via auto submit App label Dec 11, 2023
@auto-submit auto-submit bot merged commit f60e54b into flutter:master Dec 11, 2023
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Dec 11, 2023
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Dec 12, 2023
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
HugoOlthof pushed a commit to moneybird/packages that referenced this pull request Dec 13, 2023
)

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
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 16, 2024
arc-yong pushed a commit to Arctuition/packages-arc that referenced this pull request Jun 14, 2024
)

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
a: text input Entering text in a text field or keyboard related problems autosubmit Merge PR when tree becomes green via auto submit App d: api docs Issues with https://api.flutter.dev/ d: examples Sample code and demos f: material design flutter/packages/flutter/material repository. framework flutter/packages/flutter repository. See also f: labels.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

A Positioned Text make the other Text inside a Stack unselectable
2 participants