Skip to content

Commit 66092d5

Browse files
Pierre Championchinmaygarde
Pierre Champion
authored andcommitted
SendPlatformMessage allow null message value (flutter#9781)
1 parent 69cacb5 commit 66092d5

File tree

3 files changed

+94
-8
lines changed

3 files changed

+94
-8
lines changed

shell/platform/embedder/embedder.cc

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -814,8 +814,14 @@ FlutterEngineResult FlutterEngineSendPlatformMessage(
814814
return LOG_EMBEDDER_ERROR(kInvalidArguments);
815815
}
816816

817-
if (SAFE_ACCESS(flutter_message, channel, nullptr) == nullptr ||
818-
SAFE_ACCESS(flutter_message, message, nullptr) == nullptr) {
817+
if (SAFE_ACCESS(flutter_message, channel, nullptr) == nullptr) {
818+
return LOG_EMBEDDER_ERROR(kInvalidArguments);
819+
}
820+
821+
size_t message_size = SAFE_ACCESS(flutter_message, message_size, 0);
822+
const uint8_t* message_data = SAFE_ACCESS(flutter_message, message, nullptr);
823+
824+
if (message_size != 0 && message_data == nullptr) {
819825
return LOG_EMBEDDER_ERROR(kInvalidArguments);
820826
}
821827

@@ -827,12 +833,16 @@ FlutterEngineResult FlutterEngineSendPlatformMessage(
827833
response = response_handle->message->response();
828834
}
829835

830-
auto message = fml::MakeRefCounted<flutter::PlatformMessage>(
831-
flutter_message->channel,
832-
std::vector<uint8_t>(
833-
flutter_message->message,
834-
flutter_message->message + flutter_message->message_size),
835-
response);
836+
fml::RefPtr<flutter::PlatformMessage> message;
837+
if (message_size == 0) {
838+
message = fml::MakeRefCounted<flutter::PlatformMessage>(
839+
flutter_message->channel, response);
840+
} else {
841+
message = fml::MakeRefCounted<flutter::PlatformMessage>(
842+
flutter_message->channel,
843+
std::vector<uint8_t>(message_data, message_data + message_size),
844+
response);
845+
}
836846

837847
return reinterpret_cast<flutter::EmbedderEngine*>(engine)
838848
->SendPlatformMessage(std::move(message))

shell/platform/embedder/fixtures/main.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,3 +167,14 @@ void platform_messages_no_response() {
167167
};
168168
signalNativeTest();
169169
}
170+
171+
@pragma('vm:entry-point')
172+
void null_platform_messages() {
173+
window.onPlatformMessage =
174+
(String name, ByteData data, PlatformMessageResponseCallback callback) {
175+
// This checks if the platform_message null data is converted to Flutter null.
176+
signalNativeMessage((null == data).toString());
177+
callback(data);
178+
};
179+
signalNativeTest();
180+
}

shell/platform/embedder/tests/embedder_unittests.cc

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,5 +400,70 @@ TEST_F(EmbedderTest, PlatformMessagesCanBeSentWithoutResponseHandles) {
400400
message.Wait();
401401
}
402402

403+
//------------------------------------------------------------------------------
404+
/// Tests that a null platform message can be sent.
405+
///
406+
TEST_F(EmbedderTest, NullPlatformMessagesCanBeSent) {
407+
auto& context = GetEmbedderContext();
408+
EmbedderConfigBuilder builder(context);
409+
410+
builder.SetDartEntrypoint("null_platform_messages");
411+
412+
fml::AutoResetWaitableEvent ready, message;
413+
context.AddNativeCallback(
414+
"SignalNativeTest",
415+
CREATE_NATIVE_ENTRY(
416+
[&ready](Dart_NativeArguments args) { ready.Signal(); }));
417+
context.AddNativeCallback(
418+
"SignalNativeMessage",
419+
CREATE_NATIVE_ENTRY(([&message](Dart_NativeArguments args) {
420+
auto received_message = tonic::DartConverter<std::string>::FromDart(
421+
Dart_GetNativeArgument(args, 0));
422+
ASSERT_EQ("true", received_message);
423+
message.Signal();
424+
})));
425+
426+
auto engine = builder.LaunchEngine();
427+
428+
ASSERT_TRUE(engine.is_valid());
429+
ready.Wait();
430+
431+
FlutterPlatformMessage platform_message = {};
432+
platform_message.struct_size = sizeof(FlutterPlatformMessage);
433+
platform_message.channel = "test_channel";
434+
platform_message.message = nullptr;
435+
platform_message.message_size = 0;
436+
platform_message.response_handle = nullptr; // No response needed.
437+
438+
auto result =
439+
FlutterEngineSendPlatformMessage(engine.get(), &platform_message);
440+
ASSERT_EQ(result, kSuccess);
441+
message.Wait();
442+
}
443+
444+
//------------------------------------------------------------------------------
445+
/// Tests that a null platform message cannot be send if the message_size
446+
/// isn't equals to 0.
447+
///
448+
TEST_F(EmbedderTest, InvalidPlatformMessages) {
449+
auto& context = GetEmbedderContext();
450+
EmbedderConfigBuilder builder(context);
451+
452+
auto engine = builder.LaunchEngine();
453+
454+
ASSERT_TRUE(engine.is_valid());
455+
456+
FlutterPlatformMessage platform_message = {};
457+
platform_message.struct_size = sizeof(FlutterPlatformMessage);
458+
platform_message.channel = "test_channel";
459+
platform_message.message = nullptr;
460+
platform_message.message_size = 1;
461+
platform_message.response_handle = nullptr; // No response needed.
462+
463+
auto result =
464+
FlutterEngineSendPlatformMessage(engine.get(), &platform_message);
465+
ASSERT_EQ(result, kInvalidArguments);
466+
}
467+
403468
} // namespace testing
404469
} // namespace flutter

0 commit comments

Comments
 (0)