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