Skip to content

Commit d15db78

Browse files
committed
Fix Windows plugin destruction #2
1 parent b556f1f commit d15db78

File tree

4 files changed

+42
-7
lines changed

4 files changed

+42
-7
lines changed

shell/platform/windows/flutter_windows.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ FlutterDesktopMessengerRef FlutterDesktopPluginRegistrarGetMessenger(
213213
void FlutterDesktopPluginRegistrarSetDestructionHandler(
214214
FlutterDesktopPluginRegistrarRef registrar,
215215
FlutterDesktopOnPluginRegistrarDestroyed callback) {
216-
registrar->engine->AddPluginRegistrarDestructionCallback(callback);
216+
registrar->engine->AddPluginRegistrarDestructionCallback(registrar, callback);
217217
}
218218

219219
bool FlutterDesktopMessengerSendWithReply(FlutterDesktopMessengerRef messenger,

shell/platform/windows/flutter_windows_engine.cc

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,9 @@ bool FlutterWindowsEngine::RunWithEntrypoint(const char* entrypoint) {
314314

315315
bool FlutterWindowsEngine::Stop() {
316316
if (engine_) {
317-
for (const auto callback : plugin_registrar_destruction_callbacks_) {
318-
callback(plugin_registrar_.get());
317+
for (const auto [registrar, callback] :
318+
plugin_registrar_destruction_callbacks_) {
319+
callback(registrar);
319320
}
320321

321322
FlutterEngineResult result = embedder_api_.Shutdown(engine_);
@@ -335,8 +336,9 @@ FlutterDesktopPluginRegistrarRef FlutterWindowsEngine::GetRegistrar() {
335336
}
336337

337338
void FlutterWindowsEngine::AddPluginRegistrarDestructionCallback(
339+
FlutterDesktopPluginRegistrarRef registrar,
338340
FlutterDesktopOnPluginRegistrarDestroyed callback) {
339-
plugin_registrar_destruction_callbacks_.insert(callback);
341+
plugin_registrar_destruction_callbacks_[registrar] = callback;
340342
}
341343

342344
void FlutterWindowsEngine::SendWindowMetricsEvent(

shell/platform/windows/flutter_windows_engine.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include <map>
99
#include <memory>
1010
#include <optional>
11-
#include <set>
1211
#include <vector>
1312

1413
#include "flutter/shell/platform/common/accessibility_bridge.h"
@@ -74,6 +73,7 @@ class FlutterWindowsEngine {
7473

7574
// Registers a |callback| to be called when the plugin registrar is destroyed.
7675
void AddPluginRegistrarDestructionCallback(
76+
FlutterDesktopPluginRegistrarRef registrar,
7777
FlutterDesktopOnPluginRegistrarDestroyed callback);
7878

7979
// Sets switches member to the given switches.
@@ -219,9 +219,10 @@ class FlutterWindowsEngine {
219219
// The MethodChannel used for communication with the Flutter engine.
220220
std::unique_ptr<BasicMessageChannel<rapidjson::Document>> settings_channel_;
221221

222-
// A set of callbacks to be called when the engine (and thus the plugin
222+
// Callbacks to be called when the engine (and thus the plugin
223223
// registrar) is being destroyed.
224-
std::set<FlutterDesktopOnPluginRegistrarDestroyed>
224+
std::map<FlutterDesktopPluginRegistrarRef,
225+
FlutterDesktopOnPluginRegistrarDestroyed>
225226
plugin_registrar_destruction_callbacks_;
226227

227228
bool semantics_enabled_ = false;

shell/platform/windows/flutter_windows_engine_unittests.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "flutter/shell/platform/embedder/embedder.h"
88
#include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
99
#include "flutter/shell/platform/windows/testing/engine_modifier.h"
10+
#include "flutter/shell/platform/windows/testing/test_keyboard.h"
1011
#include "gtest/gtest.h"
1112

1213
namespace flutter {
@@ -255,5 +256,36 @@ TEST(FlutterWindowsEngine, DispatchSemanticsAction) {
255256
EXPECT_TRUE(called);
256257
}
257258

259+
TEST(FlutterWindowsEngine, AddPluginRegistrarDestructionCallback) {
260+
std::unique_ptr<FlutterWindowsEngine> engine = GetTestEngine();
261+
EngineModifier modifier(engine.get());
262+
263+
MockEmbedderApiForKeyboard(
264+
modifier, [] { return false; },
265+
[](const FlutterKeyEvent* event) { return false; });
266+
267+
engine->RunWithEntrypoint(nullptr);
268+
269+
// Ensure that destruction handlers don't overwrite each other.
270+
int result1 = 0;
271+
int result2 = 0;
272+
engine->AddPluginRegistrarDestructionCallback(
273+
reinterpret_cast<FlutterDesktopPluginRegistrarRef>(&result1),
274+
[](FlutterDesktopPluginRegistrarRef ref) {
275+
auto result = reinterpret_cast<int*>(ref);
276+
*result = 1;
277+
});
278+
engine->AddPluginRegistrarDestructionCallback(
279+
reinterpret_cast<FlutterDesktopPluginRegistrarRef>(&result2),
280+
[](FlutterDesktopPluginRegistrarRef ref) {
281+
auto result = reinterpret_cast<int*>(ref);
282+
*result = 2;
283+
});
284+
285+
engine->Stop();
286+
EXPECT_EQ(result1, 1);
287+
EXPECT_EQ(result2, 2);
288+
}
289+
258290
} // namespace testing
259291
} // namespace flutter

0 commit comments

Comments
 (0)