From 7b1240382ce3b722fc5f0534771b3e9ef2ad6aa9 Mon Sep 17 00:00:00 2001 From: Niklas Schulze Date: Tue, 17 Jan 2023 12:46:29 +0100 Subject: [PATCH] [windows] Fix crash when calling FlutterDesktopMessengerSetCallback after engine shutdown --- shell/platform/windows/flutter_windows.cc | 10 ++++++---- .../windows/flutter_windows_unittests.cc | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/shell/platform/windows/flutter_windows.cc b/shell/platform/windows/flutter_windows.cc index 76aa1e6854fdb..71224efdfd11f 100644 --- a/shell/platform/windows/flutter_windows.cc +++ b/shell/platform/windows/flutter_windows.cc @@ -292,10 +292,12 @@ void FlutterDesktopMessengerSetCallback(FlutterDesktopMessengerRef messenger, const char* channel, FlutterDesktopMessageCallback callback, void* user_data) { - flutter::FlutterDesktopMessenger::FromRef(messenger) - ->GetEngine() - ->message_dispatcher() - ->SetMessageCallback(channel, callback, user_data); + auto engine = + flutter::FlutterDesktopMessenger::FromRef(messenger)->GetEngine(); + if (engine) { + engine->message_dispatcher()->SetMessageCallback(channel, callback, + user_data); + } } FlutterDesktopMessengerRef FlutterDesktopMessengerAddRef( diff --git a/shell/platform/windows/flutter_windows_unittests.cc b/shell/platform/windows/flutter_windows_unittests.cc index 23f2abb89643f..91e9c9cb8ef4b 100644 --- a/shell/platform/windows/flutter_windows_unittests.cc +++ b/shell/platform/windows/flutter_windows_unittests.cc @@ -279,5 +279,25 @@ TEST_F(WindowsTest, GetGraphicsAdapter) { ASSERT_TRUE(SUCCEEDED(dxgi_adapter->GetDesc(&desc))); } +// Verify that calling FlutterDesktopMessengerSetCallback +// after shutting the engine down is safe. +// Prevent regression: https://github.com/flutter/flutter/issues/118611 +TEST_F(WindowsTest, SetMessengerCallbackAfterEngineShutdown) { + auto& context = GetContext(); + WindowsConfigBuilder builder(context); + EnginePtr engine{builder.InitializeEngine()}; + ASSERT_NE(engine, nullptr); + + auto messenger = FlutterDesktopEngineGetMessenger(engine.get()); + FlutterDesktopMessengerAddRef(messenger); + ASSERT_TRUE(FlutterDesktopMessengerIsAvailable(messenger)); + + engine.reset(); + + ASSERT_FALSE(FlutterDesktopMessengerIsAvailable(messenger)); + FlutterDesktopMessengerSetCallback(messenger, "my_channel", nullptr, nullptr); + FlutterDesktopMessengerRelease(messenger); +} + } // namespace testing } // namespace flutter