Skip to content

Conversation

@hbatagelo
Copy link
Contributor

Reopened from flutter/engine#56501.

Fixes #158450.

As mentioned in #158450, the crash occurs because a destroyed object may be accessed if the window and view have already been destroyed by the time KeyEventCallback is called. This issue is not limited to the Alt+F4 system key; it may also occur if the window is closed using other key presses, such as pressing Enter after navigating to a dialog's "Close" button.

This PR proposes a fix that checks whether the view ID is still valid when the callback is invoked. If the view is invalid, the event is skipped for that view.

A unit test has been added to assert that the KeyEventCallback is invoked when the associated view is valid and not invoked when the view is destroyed.

Pre-launch Checklist

If you need help, consider asking for advice on the #hackers-new channel on Discord.

@hbatagelo hbatagelo added platform-windows Building on or for Windows specifically a: desktop Running on desktop labels Jan 9, 2025
@github-actions github-actions bot added the engine flutter/engine related. See also e: labels. label Jan 9, 2025
@dkwingsmt
Copy link
Contributor

dkwingsmt commented Jan 9, 2025

Thank you for working on this. While the current fix works, I doubt if it's the best way to check views in this method, because the entire block doesn't seem to reference views at all:

        if (!handled) {
          engine_->text_input_plugin()->KeyboardHook(
              key, scancode, action, character, extended, was_down);
        }
        callback(handled);

It doesn't mention this either (and we can probably make it clearer by replacing = with explicit captures.

I suspect the crash happens inside callback, which is another callback nesting another callback. What I want to say is, I think it might be better to find out where actually in these callbacks that a view is used, and guard that usage instead. What do you think?

@hbatagelo
Copy link
Contributor Author

Thanks for the review. I've replaced the capture default = with explicit captures and moved the if (engine->view(view_id)) check to guard callback only, as this is where the view is actually used.

I couldn't move the check further into the callback because the callback is a lambda expression created in KeyboardManager, which doesn't keep a reference to the engine. The lambda ultimately calls a KeyboardManager member function as the final nested callback. KeyboardManager is owned by the FlutterWindow and may have already been destroyed by the time the callback is called.

@dkwingsmt
Copy link
Contributor

I see, yeah it's definitely some oversight. I'll see if I can find a more elegant way later. But this one is a good fix. Thanks for you investigation!

Copy link
Contributor

@dkwingsmt dkwingsmt left a comment

Choose a reason for hiding this comment

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

LGTM

@hbatagelo hbatagelo added this pull request to the merge queue Jan 14, 2025
Merged via the queue into flutter:master with commit f2c15f9 Jan 14, 2025
179 checks passed
@hbatagelo hbatagelo deleted the fix-multi-win-crash-on-close branch January 14, 2025 14:08
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jan 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jan 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jan 14, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Jan 14, 2025
auto-submit bot pushed a commit to flutter/packages that referenced this pull request Jan 14, 2025
Roll Flutter from 72db8f6 to 40c2b86 (33 revisions)

flutter/flutter@72db8f6...40c2b86

2025-01-14 [email protected] update changelog for 3.27.2 release (flutter/flutter#161569)
2025-01-14 [email protected] Fix `showLicensePage` does not inherit ambient `Theme` (flutter/flutter#161599)
2025-01-14 [email protected] Added special case for fat width arcs (flutter/flutter#161255)
2025-01-14 [email protected] Replace `fetch `with `gclient sync`. (flutter/flutter#161565)
2025-01-14 [email protected] Roll Packages from 3c3bc68 to d1fd623 (4 revisions) (flutter/flutter#161597)
2025-01-14 [email protected] Remove unused method (flutter/flutter#161572)
2025-01-14 [email protected] Fix crash when closing a window with `Alt+F4` in multi-win Flutter on Windows (flutter/flutter#161375)
2025-01-14 [email protected] Update InputDecoration.border documentation (flutter/flutter#161415)
2025-01-14 [email protected] [Web] Allow specifying the strategy on when to use <img> element to display images (flutter/flutter#159917)
2025-01-14 [email protected] Roll Dart to  Version 3.7.0-323.0.dev (flutter/flutter#161567)
2025-01-14 [email protected] Use wildcards (flutter/flutter#161548)
2025-01-14 [email protected] Autocomplete Options Width (flutter/flutter#143249)
2025-01-13 [email protected] Move the analyzer_benchmark to Mac arm64 devicelab bots (flutter/flutter#161405)
2025-01-13 [email protected] Remove references to `cirrus`, mostly in doc comments. (flutter/flutter#161529)
2025-01-13 [email protected] Fix paths when running clang-tidy on git diffs (flutter/flutter#161496)
2025-01-13 [email protected] [web:a11y] treat empty tappables as buttons (flutter/flutter#161360)
2025-01-13 [email protected] Add route settings to CupertinoSheetRoute (flutter/flutter#161528)
2025-01-13 [email protected] Copy `linux_host_engine` as `linux_host_engine_test`, removing `archives: [...]`. (flutter/flutter#161532)
2025-01-13 [email protected] Remove last two references to Cirrus CI. (flutter/flutter#161530)
2025-01-13 [email protected] Mark `Mac_mokey microbenchmarks` as flakey (flutter/flutter#161550)
2025-01-13 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (#160241)" (flutter/flutter#161555)
2025-01-13 [email protected] Add validator execution times to `flutter doctor --verbose` (flutter/flutter#158124)
2025-01-13 [email protected] Explain more specifically how to use `flutter drive`/what it does (flutter/flutter#161450)
2025-01-13 [email protected] Fixed repeated strings for incompatible Gradle or AGP version in `create` command (flutter/flutter#161223)
2025-01-13 [email protected] Remove `WEB_SHARD_COUNT`, which no longer exists post-Cirrus. (flutter/flutter#161527)
2025-01-13 [email protected] [Impeller] Update guidance on prebuilt artifacts. (flutter/flutter#161251)
2025-01-13 [email protected] Migrate DisplayList unit tests to DL/Impeller geometry classes (flutter/flutter#161453)
2025-01-13 [email protected] Context menu button callback docs clarification (flutter/flutter#161451)
2025-01-13 [email protected] Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (flutter/flutter#160241)
2025-01-13 [email protected] Udpate documentation on the third_party directories (flutter/flutter#161407)
2025-01-13 [email protected] Propagate environment variables when `flutter drive` is invoked. (flutter/flutter#161452)
2025-01-13 [email protected] Convert base application name handling to kotlin source (start of FGP kt conversion) (flutter/flutter#155963)
2025-01-13 [email protected] [Impeller] remove API 30 restriction for SurfaceControl testing. (flutter/flutter#161438)

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] 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:
...
maheshj01 pushed a commit to maheshj01/flutter that referenced this pull request Jan 15, 2025
… Windows (flutter#161375)

Reopened from flutter/engine#56501.

Fixes [flutter#158450](flutter#158450).

As mentioned in
[flutter#158450](flutter#158450), the crash
occurs because a destroyed object may be accessed if the window and view
have already been destroyed by the time `KeyEventCallback` is called.
This issue is not limited to the `Alt+F4` system key; it may also occur
if the window is closed using other key presses, such as pressing
`Enter` after navigating to a dialog's "Close" button.

This PR proposes a fix that checks whether the view ID is still valid
when the callback is invoked. If the view is invalid, the event is
skipped for that view.

A unit test has been added to assert that the `KeyEventCallback` is
invoked when the associated view is valid and not invoked when the view
is destroyed.

## 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], including [Features
we expect every widget to implement].
- [x] I signed the [CLA].
- [x] I listed at least one issue that this PR fixes in the description
above.
- [ ] I updated/added relevant documentation (doc comments with `///`).
- [x] I added new tests to check the change I am making, or this PR is
[test-exempt].
- [x] I followed the [breaking change policy] and added [Data Driven
Fixes] where supported.
- [x] All existing and new tests are passing.

If you need help, consider asking for advice on the #hackers-new channel
on [Discord].

<!-- Links -->
[Contributor Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#overview
[Tree Hygiene]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md
[test-exempt]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#tests
[Flutter Style Guide]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md
[Features we expect every widget to implement]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Style-guide-for-Flutter-repo.md#features-we-expect-every-widget-to-implement
[CLA]: https://cla.developers.google.com/
[flutter/tests]: https://github.com/flutter/tests
[breaking change policy]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Tree-hygiene.md#handling-breaking-changes
[Discord]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Chat.md
[Data Driven Fixes]:
https://github.com/flutter/flutter/blob/main/docs/contributing/Data-driven-Fixes.md
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 12, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 13, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Feb 13, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 6, 2025
engine-flutter-autoroll added a commit to engine-flutter-autoroll/packages that referenced this pull request Mar 7, 2025
androidseb pushed a commit to androidseb/packages that referenced this pull request Jun 8, 2025
Roll Flutter from 72db8f6 to 40c2b86 (33 revisions)

flutter/flutter@72db8f6...40c2b86

2025-01-14 [email protected] update changelog for 3.27.2 release (flutter/flutter#161569)
2025-01-14 [email protected] Fix `showLicensePage` does not inherit ambient `Theme` (flutter/flutter#161599)
2025-01-14 [email protected] Added special case for fat width arcs (flutter/flutter#161255)
2025-01-14 [email protected] Replace `fetch `with `gclient sync`. (flutter/flutter#161565)
2025-01-14 [email protected] Roll Packages from 3c3bc68 to d1fd623 (4 revisions) (flutter/flutter#161597)
2025-01-14 [email protected] Remove unused method (flutter/flutter#161572)
2025-01-14 [email protected] Fix crash when closing a window with `Alt+F4` in multi-win Flutter on Windows (flutter/flutter#161375)
2025-01-14 [email protected] Update InputDecoration.border documentation (flutter/flutter#161415)
2025-01-14 [email protected] [Web] Allow specifying the strategy on when to use <img> element to display images (flutter/flutter#159917)
2025-01-14 [email protected] Roll Dart to  Version 3.7.0-323.0.dev (flutter/flutter#161567)
2025-01-14 [email protected] Use wildcards (flutter/flutter#161548)
2025-01-14 [email protected] Autocomplete Options Width (flutter/flutter#143249)
2025-01-13 [email protected] Move the analyzer_benchmark to Mac arm64 devicelab bots (flutter/flutter#161405)
2025-01-13 [email protected] Remove references to `cirrus`, mostly in doc comments. (flutter/flutter#161529)
2025-01-13 [email protected] Fix paths when running clang-tidy on git diffs (flutter/flutter#161496)
2025-01-13 [email protected] [web:a11y] treat empty tappables as buttons (flutter/flutter#161360)
2025-01-13 [email protected] Add route settings to CupertinoSheetRoute (flutter/flutter#161528)
2025-01-13 [email protected] Copy `linux_host_engine` as `linux_host_engine_test`, removing `archives: [...]`. (flutter/flutter#161532)
2025-01-13 [email protected] Remove last two references to Cirrus CI. (flutter/flutter#161530)
2025-01-13 [email protected] Mark `Mac_mokey microbenchmarks` as flakey (flutter/flutter#161550)
2025-01-13 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (#160241)" (flutter/flutter#161555)
2025-01-13 [email protected] Add validator execution times to `flutter doctor --verbose` (flutter/flutter#158124)
2025-01-13 [email protected] Explain more specifically how to use `flutter drive`/what it does (flutter/flutter#161450)
2025-01-13 [email protected] Fixed repeated strings for incompatible Gradle or AGP version in `create` command (flutter/flutter#161223)
2025-01-13 [email protected] Remove `WEB_SHARD_COUNT`, which no longer exists post-Cirrus. (flutter/flutter#161527)
2025-01-13 [email protected] [Impeller] Update guidance on prebuilt artifacts. (flutter/flutter#161251)
2025-01-13 [email protected] Migrate DisplayList unit tests to DL/Impeller geometry classes (flutter/flutter#161453)
2025-01-13 [email protected] Context menu button callback docs clarification (flutter/flutter#161451)
2025-01-13 [email protected] Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (flutter/flutter#160241)
2025-01-13 [email protected] Udpate documentation on the third_party directories (flutter/flutter#161407)
2025-01-13 [email protected] Propagate environment variables when `flutter drive` is invoked. (flutter/flutter#161452)
2025-01-13 [email protected] Convert base application name handling to kotlin source (start of FGP kt conversion) (flutter/flutter#155963)
2025-01-13 [email protected] [Impeller] remove API 30 restriction for SurfaceControl testing. (flutter/flutter#161438)

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] 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:
...
FMorschel pushed a commit to FMorschel/packages that referenced this pull request Jun 9, 2025
Roll Flutter from 72db8f6 to 40c2b86 (33 revisions)

flutter/flutter@72db8f6...40c2b86

2025-01-14 [email protected] update changelog for 3.27.2 release (flutter/flutter#161569)
2025-01-14 [email protected] Fix `showLicensePage` does not inherit ambient `Theme` (flutter/flutter#161599)
2025-01-14 [email protected] Added special case for fat width arcs (flutter/flutter#161255)
2025-01-14 [email protected] Replace `fetch `with `gclient sync`. (flutter/flutter#161565)
2025-01-14 [email protected] Roll Packages from 3c3bc68 to d1fd623 (4 revisions) (flutter/flutter#161597)
2025-01-14 [email protected] Remove unused method (flutter/flutter#161572)
2025-01-14 [email protected] Fix crash when closing a window with `Alt+F4` in multi-win Flutter on Windows (flutter/flutter#161375)
2025-01-14 [email protected] Update InputDecoration.border documentation (flutter/flutter#161415)
2025-01-14 [email protected] [Web] Allow specifying the strategy on when to use <img> element to display images (flutter/flutter#159917)
2025-01-14 [email protected] Roll Dart to  Version 3.7.0-323.0.dev (flutter/flutter#161567)
2025-01-14 [email protected] Use wildcards (flutter/flutter#161548)
2025-01-14 [email protected] Autocomplete Options Width (flutter/flutter#143249)
2025-01-13 [email protected] Move the analyzer_benchmark to Mac arm64 devicelab bots (flutter/flutter#161405)
2025-01-13 [email protected] Remove references to `cirrus`, mostly in doc comments. (flutter/flutter#161529)
2025-01-13 [email protected] Fix paths when running clang-tidy on git diffs (flutter/flutter#161496)
2025-01-13 [email protected] [web:a11y] treat empty tappables as buttons (flutter/flutter#161360)
2025-01-13 [email protected] Add route settings to CupertinoSheetRoute (flutter/flutter#161528)
2025-01-13 [email protected] Copy `linux_host_engine` as `linux_host_engine_test`, removing `archives: [...]`. (flutter/flutter#161532)
2025-01-13 [email protected] Remove last two references to Cirrus CI. (flutter/flutter#161530)
2025-01-13 [email protected] Mark `Mac_mokey microbenchmarks` as flakey (flutter/flutter#161550)
2025-01-13 98614782+auto-submit[bot]@users.noreply.github.com Reverts "Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (#160241)" (flutter/flutter#161555)
2025-01-13 [email protected] Add validator execution times to `flutter doctor --verbose` (flutter/flutter#158124)
2025-01-13 [email protected] Explain more specifically how to use `flutter drive`/what it does (flutter/flutter#161450)
2025-01-13 [email protected] Fixed repeated strings for incompatible Gradle or AGP version in `create` command (flutter/flutter#161223)
2025-01-13 [email protected] Remove `WEB_SHARD_COUNT`, which no longer exists post-Cirrus. (flutter/flutter#161527)
2025-01-13 [email protected] [Impeller] Update guidance on prebuilt artifacts. (flutter/flutter#161251)
2025-01-13 [email protected] Migrate DisplayList unit tests to DL/Impeller geometry classes (flutter/flutter#161453)
2025-01-13 [email protected] Context menu button callback docs clarification (flutter/flutter#161451)
2025-01-13 [email protected] Match CupertinoPageTransitionsBuilder animation duration to CupertinoPageRoute (flutter/flutter#160241)
2025-01-13 [email protected] Udpate documentation on the third_party directories (flutter/flutter#161407)
2025-01-13 [email protected] Propagate environment variables when `flutter drive` is invoked. (flutter/flutter#161452)
2025-01-13 [email protected] Convert base application name handling to kotlin source (start of FGP kt conversion) (flutter/flutter#155963)
2025-01-13 [email protected] [Impeller] remove API 30 restriction for SurfaceControl testing. (flutter/flutter#161438)

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] 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:
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

a: desktop Running on desktop engine flutter/engine related. See also e: labels. platform-windows Building on or for Windows specifically

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Windows] Alt+F4 may crash the engine when using multiple windows on Windows

2 participants