From 6024e186a2f0eab42a3aa2ba3bfcf33a5e4f95e5 Mon Sep 17 00:00:00 2001 From: Rafal Walczyna Date: Thu, 24 Jun 2021 22:07:56 +0200 Subject: [PATCH] Initialize EventChannel state (flutter/engine#26761) OnCancel was firing randomly on event channel registering because of uninitialized is_listening_ variable. This PR fixes: flutter/flutter#84632 --- .../client_wrapper/event_channel_unittests.cc | 37 +++++++++++++++++++ .../include/flutter/event_channel.h | 2 +- 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/engine/src/flutter/shell/platform/common/client_wrapper/event_channel_unittests.cc b/engine/src/flutter/shell/platform/common/client_wrapper/event_channel_unittests.cc index 7e9face38a4..395913870f6 100644 --- a/engine/src/flutter/shell/platform/common/client_wrapper/event_channel_unittests.cc +++ b/engine/src/flutter/shell/platform/common/client_wrapper/event_channel_unittests.cc @@ -140,6 +140,43 @@ TEST(EventChannelTest, Cancel) { EXPECT_EQ(on_cancel_called, true); } +// Tests that OnCancel in not called on registration. +TEST(EventChannelTest, ListenNotCancel) { + TestBinaryMessenger messenger; + const std::string channel_name("some_channel"); + const StandardMethodCodec& codec = StandardMethodCodec::GetInstance(); + EventChannel channel(&messenger, channel_name, &codec); + + bool on_listen_called = false; + bool on_cancel_called = false; + auto handler = std::make_unique>( + [&on_listen_called](const EncodableValue* arguments, + std::unique_ptr>&& events) + -> std::unique_ptr> { + on_listen_called = true; + return nullptr; + }, + [&on_cancel_called](const EncodableValue* arguments) + -> std::unique_ptr> { + on_cancel_called = true; + return nullptr; + }); + channel.SetStreamHandler(std::move(handler)); + EXPECT_EQ(messenger.last_message_handler_channel(), channel_name); + EXPECT_NE(messenger.last_message_handler(), nullptr); + + // Send dummy listen message. + MethodCall<> call_listen("listen", nullptr); + auto message = codec.EncodeMethodCall(call_listen); + messenger.last_message_handler()( + message->data(), message->size(), + [](const uint8_t* reply, const size_t reply_size) {}); + + // Check results. + EXPECT_EQ(on_listen_called, true); + EXPECT_EQ(on_cancel_called, false); +} + // Pseudo test when user re-registers or call OnListen to the same channel. // Confirm that OnCancel is called and OnListen is called again // when user re-registers the same channel that has already started diff --git a/engine/src/flutter/shell/platform/common/client_wrapper/include/flutter/event_channel.h b/engine/src/flutter/shell/platform/common/client_wrapper/include/flutter/event_channel.h index 1c1a056da98..fe0e1414d63 100644 --- a/engine/src/flutter/shell/platform/common/client_wrapper/include/flutter/event_channel.h +++ b/engine/src/flutter/shell/platform/common/client_wrapper/include/flutter/event_channel.h @@ -165,7 +165,7 @@ class EventChannel { BinaryMessenger* messenger_; const std::string name_; const MethodCodec* codec_; - bool is_listening_; + bool is_listening_ = false; }; } // namespace flutter