SendPlatformMessage allow null message value (flutter/engine#9781)
This commit is contained in:
committed by
Chinmay Garde
parent
0176c65fd3
commit
4d9128b964
@@ -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::PlatformMessage>(
|
||||
flutter_message->channel,
|
||||
std::vector<uint8_t>(
|
||||
flutter_message->message,
|
||||
flutter_message->message + flutter_message->message_size),
|
||||
response);
|
||||
fml::RefPtr<flutter::PlatformMessage> message;
|
||||
if (message_size == 0) {
|
||||
message = fml::MakeRefCounted<flutter::PlatformMessage>(
|
||||
flutter_message->channel, response);
|
||||
} else {
|
||||
message = fml::MakeRefCounted<flutter::PlatformMessage>(
|
||||
flutter_message->channel,
|
||||
std::vector<uint8_t>(message_data, message_data + message_size),
|
||||
response);
|
||||
}
|
||||
|
||||
return reinterpret_cast<flutter::EmbedderEngine*>(engine)
|
||||
->SendPlatformMessage(std::move(message))
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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<std::string>::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
|
||||
|
||||
Reference in New Issue
Block a user