diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index f830392c11b1abfd965e3ac9eae267d04045c6cf..f971c1be2a4d9eed48e05160d7b2089a5f033b15 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -232,3 +232,33 @@ FlutterResult FlutterEngineSendPointerEvent(FlutterEngine engine, return kSuccess; } + +FlutterResult FlutterEngineSendPlatformMessage( + FlutterEngine engine, + const FlutterPlatformMessage* flutter_message) { + if (engine == nullptr || flutter_message == nullptr) { + return kInvalidArguments; + } + + if (SAFE_ACCESS(flutter_message, channel, nullptr) == nullptr || + SAFE_ACCESS(flutter_message, message, nullptr) == nullptr) { + return kInvalidArguments; + } + + auto holder = reinterpret_cast(engine); + + auto message = fxl::MakeRefCounted( + flutter_message->channel, + std::vector( + flutter_message->message, + flutter_message->message + flutter_message->message_size), + nullptr); + + blink::Threads::UI()->PostTask( + [ weak_engine = holder->view()->engine().GetWeakPtr(), message ] { + if (auto engine = weak_engine) { + engine->DispatchPlatformMessage(message); + } + }); + return kSuccess; +} diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 71818f8897d9c8746d720158d685e707e694e83f..4dcb2cb09af0edc3d8caa3a06a3145701a462a3c 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -94,6 +94,14 @@ typedef struct { double y; } FlutterPointerEvent; +typedef struct { + // The size of this struct. Must be sizeof(FlutterPlatformMessage). + size_t struct_size; + const char* channel; + const uint8_t* message; + const size_t message_size; +} FlutterPlatformMessage; + FLUTTER_EXPORT FlutterResult FlutterEngineRun(size_t version, const FlutterRendererConfig* config, @@ -114,6 +122,11 @@ FlutterResult FlutterEngineSendPointerEvent(FlutterEngine engine, const FlutterPointerEvent* events, size_t events_count); +FLUTTER_EXPORT +FlutterResult FlutterEngineSendPlatformMessage( + FlutterEngine engine, + const FlutterPlatformMessage* message); + #if defined(__cplusplus) } // extern "C" #endif