engine
engine copied to clipboard
Fix iOS text selection crash by returning nil range
Reverts a runtime crashing assertion introduced by #16496. Defensively favors returning a nil text selection range rather than crash. See issue #138464 for crash reports and reproduction recordings.
Without this revert, to avoid a crash hit in a minority of user interactions with a text field, we must degrade experiences for all users by disabling useful iOS text field behaviors (see #138464 for workarounds).
Pre-launch Checklist
- [x] I read the Contributor Guide and followed the process outlined there for submitting PRs.
- [x] I read the Tree Hygiene wiki page, which explains my responsibilities.
- [x] I read and followed the Flutter Style Guide and the C++, Objective-C, Java style guides.
- [x] I listed at least one issue that this PR fixes in the description above.
- [x] I added new tests to check the change I am making or feature I am adding, or the PR is test-exempt. See testing the engine for instructions on writing and running engine tests.
- [x] I updated/added relevant documentation (doc comments with
///). - [x] I signed the CLA.
- [x] All existing and new tests are passing.
If you need help, consider asking for advice on the #hackers-new channel on Discord.
Fix iOS text selection crash by returning nil range
cc @justinmc
@chinmaygarde Thanks for that bump. Is there a chance at getting this in the review queue soon?
This assertion is one of our most common crashes. Simply deselecting the text on some touches (this PR) is preferable to tossing the whole app session out.
If there's desire to fix the upstream range finding, that makes sense, but we'd love to save that for focused follow-on where there's a test battery.
@hellohuanlin can you take a look? My concern is that this regresses https://github.com/flutter/engine/pull/16496 and b/149077991, in which case we need a different solution. https://github.com/flutter/flutter/issues/138464#issuecomment-1912583460
Honest question: is a regression possible?
Sessions that currently crash will simply now continue, allowing VO/non-VO users to retry input strategies. #16496 stopped a crash when using VoiceOver in a provided sample app. That sample does not crash now.
Thanks for analyzing this and getting it in the queue!
Should be safe since it's removing NSAssert
@hellohuanlin NSAsserts are on in release mode in Flutter https://github.com/flutter/flutter/issues/157837 (cbracken mentioned he wanted to fix that)
Formatting issue https://logs.chromium.org/logs/flutter/buildbucket/cr-buildbucket/8732309981621212289/+/u/test:_test:_Check_formatting/stdout
@cbracken @jmagman Are we still making progress on this one?
Any progress with this one? Customers aren't very happy with crashes
CI failure is only on mac_android_aot_engine. I don't get a retry option, so I'll push a commit to trigger again.
Who else would need to approve? Like @gvozditskiy, we'd love to get this crash silenced.
We just need one more approval thanks. @chunhtai @LongCatIsLooong @cbracken
auto label is removed for flutter/engine/55909, Failed to merge flutter/engine/55909 with Pull request flutter/engine/55909 could not be merged: You're not authorized to push to this branch. Visit https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/about-protected-branches for more information..
Ah of course, this change needs to be recreated in https://github.com/flutter/flutter/tree/master/engine post-monorepo (this entire repository was moved to that subdirectory).
You can check out https://github.com/flutter/flutter/ and then cd engine/src/flutter. On this branch run git diff main | pbcopy and then in flutter/flutter run pbpaste | patch -p1, then recreate the PR. We'll approve it ASAP given this is already reviewed.
I am also happy to do this, but you'll lose the authorship.
Monorepo Migration Completed
TL;DR: Please migrate your PR to flutter/flutter
The flutter/engine repository has been migrated to the flutter/flutter repository. This PR will no longer be landed here and must be migrated. To migrate your PR to the flutter repository, please follow these steps:
-
Create a patch for this PR:
- Generate a patch set that represents the changes in this PR. The exact method will vary depending on your PR's history. If your PR includes merges, it is highly recommended that you rebase it onto
mainfirst.
git format-patch $START_COMMIT..$END_COMMIT --stdout > combined_patch.patch - Generate a patch set that represents the changes in this PR. The exact method will vary depending on your PR's history. If your PR includes merges, it is highly recommended that you rebase it onto
-
Update the patch for the new engine location:
- The engine source code now resides in the
engine/subdirectory within theflutter/flutterrepository. You'll need to update the file paths in your patch accordingly.
# Insert the `engine/` prefix to all paths. Note that this usage works on macOS and # linux versions of sed. sed -i.bak \ -e 's|^\(diff --git a/\)\(.*\) b/\(.*\)|\1engine/\2 b/engine/src/flutter/\3|' \ -e 's|^\(--- a/\)\(.*\)|\1engine/src/flutter/\2|' \ -e 's|^\(\+\+\+ b/\)\(.*\)|\1engine/src/flutter/\2|' \ combined_patch.patch - The engine source code now resides in the
-
Checkout and set up your Flutter development environment:
- Follow the instructions in Setting up the Framework development environment to check out the
flutter/flutterrepository. - Remember to rename the origin remote to
upstream(e.g.,git remote rename origin upstream).
- Follow the instructions in Setting up the Framework development environment to check out the
-
Set up the engine development environment within the monorepo:
- Follow the updated instructions in Setting up the engine environment, paying close attention to the changes in gclient setup and location.
-
Apply the patch to a new branch:
- Create a new branch in your
flutter/flutterrepository. - Apply the updated patch to this branch:
git apply combined_patch.patch - Create a new branch in your
-
Open a new PR:
- Open a new PR in the
flutter/flutterrepository with your changes. - Reference this original PR in the new PR's description using
flutter/engine#<PR_NUMBER>.
- Open a new PR in the
This is a canned message