From 66092d5b02dcaf627295c5d5333956ebc82ad53b Mon Sep 17 00:00:00 2001 From: Pierre Champion Date: Tue, 16 Jul 2019 20:38:33 +0200 Subject: [PATCH] SendPlatformMessage allow null message value (#9781) --- shell/platform/embedder/embedder.cc | 26 +++++--- shell/platform/embedder/fixtures/main.dart | 11 ++++ .../embedder/tests/embedder_unittests.cc | 65 +++++++++++++++++++ 3 files changed, 94 insertions(+), 8 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index fcce64bad..1a2002efe 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -814,8 +814,14 @@ FlutterEngineResult FlutterEngineSendPlatformMessage( return LOG_EMBEDDER_ERROR(kInvalidArguments); } - if (SAFE_ACCESS(flutter_message, channel, nullptr) == nullptr || - SAFE_ACCESS(flutter_message, message, nullptr) == nullptr) { + if (SAFE_ACCESS(flutter_message, channel, nullptr) == nullptr) { + return LOG_EMBEDDER_ERROR(kInvalidArguments); + } + + size_t message_size = SAFE_ACCESS(flutter_message, message_size, 0); + const uint8_t* message_data = SAFE_ACCESS(flutter_message, message, nullptr); + + if (message_size != 0 && message_data == nullptr) { return LOG_EMBEDDER_ERROR(kInvalidArguments); } @@ -827,12 +833,16 @@ FlutterEngineResult FlutterEngineSendPlatformMessage( response = response_handle->message->response(); } - auto message = fml::MakeRefCounted( - flutter_message->channel, - std::vector( - flutter_message->message, - flutter_message->message + flutter_message->message_size), - response); + fml::RefPtr message; + if (message_size == 0) { + message = fml::MakeRefCounted( + flutter_message->channel, response); + } else { + message = fml::MakeRefCounted( + flutter_message->channel, + std::vector(message_data, message_data + message_size), + response); + } return reinterpret_cast(engine) ->SendPlatformMessage(std::move(message)) diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index 348ce046e..0590ae275 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -167,3 +167,14 @@ void platform_messages_no_response() { }; signalNativeTest(); } + +@pragma('vm:entry-point') +void null_platform_messages() { + window.onPlatformMessage = + (String name, ByteData data, PlatformMessageResponseCallback callback) { + // This checks if the platform_message null data is converted to Flutter null. + signalNativeMessage((null == data).toString()); + callback(data); + }; + signalNativeTest(); +} diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 7771d4a44..31d5a7021 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -400,5 +400,70 @@ TEST_F(EmbedderTest, PlatformMessagesCanBeSentWithoutResponseHandles) { message.Wait(); } +//------------------------------------------------------------------------------ +/// Tests that a null platform message can be sent. +/// +TEST_F(EmbedderTest, NullPlatformMessagesCanBeSent) { + auto& context = GetEmbedderContext(); + EmbedderConfigBuilder builder(context); + + builder.SetDartEntrypoint("null_platform_messages"); + + fml::AutoResetWaitableEvent ready, message; + context.AddNativeCallback( + "SignalNativeTest", + CREATE_NATIVE_ENTRY( + [&ready](Dart_NativeArguments args) { ready.Signal(); })); + context.AddNativeCallback( + "SignalNativeMessage", + CREATE_NATIVE_ENTRY(([&message](Dart_NativeArguments args) { + auto received_message = tonic::DartConverter::FromDart( + Dart_GetNativeArgument(args, 0)); + ASSERT_EQ("true", received_message); + message.Signal(); + }))); + + auto engine = builder.LaunchEngine(); + + ASSERT_TRUE(engine.is_valid()); + ready.Wait(); + + FlutterPlatformMessage platform_message = {}; + platform_message.struct_size = sizeof(FlutterPlatformMessage); + platform_message.channel = "test_channel"; + platform_message.message = nullptr; + platform_message.message_size = 0; + platform_message.response_handle = nullptr; // No response needed. + + auto result = + FlutterEngineSendPlatformMessage(engine.get(), &platform_message); + ASSERT_EQ(result, kSuccess); + message.Wait(); +} + +//------------------------------------------------------------------------------ +/// Tests that a null platform message cannot be send if the message_size +/// isn't equals to 0. +/// +TEST_F(EmbedderTest, InvalidPlatformMessages) { + auto& context = GetEmbedderContext(); + EmbedderConfigBuilder builder(context); + + auto engine = builder.LaunchEngine(); + + ASSERT_TRUE(engine.is_valid()); + + FlutterPlatformMessage platform_message = {}; + platform_message.struct_size = sizeof(FlutterPlatformMessage); + platform_message.channel = "test_channel"; + platform_message.message = nullptr; + platform_message.message_size = 1; + platform_message.response_handle = nullptr; // No response needed. + + auto result = + FlutterEngineSendPlatformMessage(engine.get(), &platform_message); + ASSERT_EQ(result, kInvalidArguments); +} + } // namespace testing } // namespace flutter -- GitLab