Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit d99e3db

Browse files
committed
brought back the logic that the engine clears handlers
1 parent fe44841 commit d99e3db

File tree

4 files changed

+64
-0
lines changed

4 files changed

+64
-0
lines changed

shell/platform/linux/fl_binary_messenger.cc

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ static void platform_message_handler_free(gpointer data) {
143143
g_free(self);
144144
}
145145

146+
static void engine_weak_notify_cb(gpointer user_data,
147+
GObject* where_the_object_was) {
148+
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(user_data);
149+
150+
// Disconnect any handlers.
151+
// Take the reference in case a handler tries to modify this table.
152+
g_autoptr(GHashTable) handlers = self->platform_message_handlers;
153+
self->platform_message_handlers = g_hash_table_new_full(
154+
g_str_hash, g_str_equal, g_free, platform_message_handler_free);
155+
g_hash_table_remove_all(handlers);
156+
}
157+
146158
static gboolean fl_binary_messenger_platform_message_cb(
147159
FlEngine* engine,
148160
const gchar* channel,
@@ -168,6 +180,14 @@ static gboolean fl_binary_messenger_platform_message_cb(
168180

169181
static void fl_binary_messenger_impl_dispose(GObject* object) {
170182
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(object);
183+
184+
{
185+
g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
186+
if (engine) {
187+
g_object_weak_unref(G_OBJECT(engine), engine_weak_notify_cb, self);
188+
}
189+
}
190+
171191
g_weak_ref_clear(&self->engine);
172192

173193
g_clear_pointer(&self->platform_message_handlers, g_hash_table_unref);
@@ -206,6 +226,13 @@ static void set_message_handler_on_channel(
206226
}
207227
}
208228

229+
static gboolean has_message_handler_on_channel(FlBinaryMessenger* messenger,
230+
const gchar* channel) {
231+
FlBinaryMessengerImpl* self = FL_BINARY_MESSENGER_IMPL(messenger);
232+
return g_hash_table_contains(self->platform_message_handlers,
233+
g_strdup(channel));
234+
}
235+
209236
gboolean do_unref(gpointer value) {
210237
g_object_unref(value);
211238
return G_SOURCE_REMOVE;
@@ -302,6 +329,7 @@ static void fl_binary_messenger_impl_class_init(
302329
static void fl_binary_messenger_impl_iface_init(
303330
FlBinaryMessengerInterface* iface) {
304331
iface->set_message_handler_on_channel = set_message_handler_on_channel;
332+
iface->has_message_handler_on_channel = has_message_handler_on_channel;
305333
iface->send_response = send_response;
306334
iface->send_on_channel = send_on_channel;
307335
iface->send_on_channel_finish = send_on_channel_finish;
@@ -322,6 +350,7 @@ FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine) {
322350
FL_IS_BINARY_MESSENGER_IMPL(self);
323351

324352
g_weak_ref_init(&self->engine, G_OBJECT(engine));
353+
g_object_weak_ref(G_OBJECT(engine), engine_weak_notify_cb, self);
325354

326355
fl_engine_set_platform_message_handler(
327356
engine, fl_binary_messenger_platform_message_cb, self, NULL);
@@ -342,6 +371,16 @@ G_MODULE_EXPORT void fl_binary_messenger_set_message_handler_on_channel(
342371
self, channel, handler, user_data, destroy_notify);
343372
}
344373

374+
G_MODULE_EXPORT gboolean
375+
fl_binary_messenger_has_message_handler_on_channel(FlBinaryMessenger* self,
376+
const gchar* channel) {
377+
g_return_val_if_fail(FL_IS_BINARY_MESSENGER(self), FALSE);
378+
g_return_val_if_fail(channel != nullptr, FALSE);
379+
380+
return FL_BINARY_MESSENGER_GET_IFACE(self)->has_message_handler_on_channel(
381+
self, channel);
382+
}
383+
345384
// Note: This function can be called from any thread.
346385
G_MODULE_EXPORT gboolean fl_binary_messenger_send_response(
347386
FlBinaryMessenger* self,

shell/platform/linux/fl_binary_messenger_private.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ G_BEGIN_DECLS
2222
*/
2323
FlBinaryMessenger* fl_binary_messenger_new(FlEngine* engine);
2424

25+
gboolean fl_binary_messenger_has_message_handler_on_channel(
26+
FlBinaryMessenger* messenger,
27+
const gchar* channel);
28+
2529
G_END_DECLS
2630

2731
#endif // FLUTTER_SHELL_PLATFORM_LINUX_FL_BINARY_MESSENGER_PRIVATE_H_

shell/platform/linux/fl_binary_messenger_test.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,3 +460,21 @@ TEST(FlBinaryMessengerTest, RespondOnBackgroundThread) {
460460
// Blocks here until response_cb is called.
461461
g_main_loop_run(loop);
462462
}
463+
464+
TEST(FlBinaryMessengerTest, DeletingEngineClearsHandlers) {
465+
FlEngine* engine = make_mock_engine();
466+
g_autoptr(FlBinaryMessenger) messenger = fl_binary_messenger_new(engine);
467+
468+
// Listen for messages from the engine.
469+
fl_binary_messenger_set_message_handler_on_channel(
470+
messenger, "test/messages", message_cb, nullptr, nullptr);
471+
472+
ASSERT_TRUE(fl_binary_messenger_has_message_handler_on_channel(
473+
messenger, "test/messages"));
474+
475+
g_object_unref(engine);
476+
engine = nullptr;
477+
478+
ASSERT_FALSE(fl_binary_messenger_has_message_handler_on_channel(
479+
messenger, "test/messages"));
480+
}

shell/platform/linux/public/flutter_linux/fl_binary_messenger.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ struct _FlBinaryMessengerInterface {
7373
gpointer user_data,
7474
GDestroyNotify destroy_notify);
7575

76+
gboolean (*has_message_handler_on_channel)(FlBinaryMessenger* messenger,
77+
const gchar* channel);
78+
7679
gboolean (*send_response)(FlBinaryMessenger* messenger,
7780
FlBinaryMessengerResponseHandle* response_handle,
7881
GBytes* response,

0 commit comments

Comments
 (0)