[ios] refactor platform_message_handler_ios (flutter/engine#40182)

[ios] refactor platform_message_handler_ios
This commit is contained in:
Chris Yang
2023-03-09 13:27:37 -08:00
committed by GitHub
parent 18b57833e8
commit bdcc4f6e95
4 changed files with 20 additions and 16 deletions

View File

@@ -13,7 +13,9 @@
#include "flutter/shell/common/platform_message_handler.h"
#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterBinaryMessenger.h"
@protocol FlutterTaskQueue;
@protocol FlutterTaskQueue
- (void)dispatch:(dispatch_block_t)block;
@end
namespace flutter {
@@ -21,11 +23,11 @@ class PlatformMessageHandlerIos : public PlatformMessageHandler {
public:
static NSObject<FlutterTaskQueue>* MakeBackgroundTaskQueue();
PlatformMessageHandlerIos(const TaskRunners& task_runners);
PlatformMessageHandlerIos(fml::RefPtr<fml::TaskRunner> platform_task_runner);
void HandlePlatformMessage(std::unique_ptr<PlatformMessage> message) override;
bool DoesHandlePlatformMessageOnPlatformThread() const override { return false; }
bool DoesHandlePlatformMessageOnPlatformThread() const override;
void InvokePlatformMessageResponseCallback(int response_id,
std::unique_ptr<fml::Mapping> mapping) override;
@@ -43,7 +45,7 @@ class PlatformMessageHandlerIos : public PlatformMessageHandler {
private:
std::unordered_map<std::string, HandlerInfo> message_handlers_;
TaskRunners task_runners_;
const fml::RefPtr<fml::TaskRunner> platform_task_runner_;
std::mutex message_handlers_mutex_;
FML_DISALLOW_COPY_AND_ASSIGN(PlatformMessageHandlerIos);
};

View File

@@ -11,10 +11,6 @@
static uint64_t platform_message_counter = 1;
@protocol FlutterTaskQueue
- (void)dispatch:(dispatch_block_t)block;
@end
@interface FLTSerialTaskQueue : NSObject <FlutterTaskQueue>
@property(nonatomic, strong) dispatch_queue_t queue;
@end
@@ -44,8 +40,9 @@ NSObject<FlutterTaskQueue>* PlatformMessageHandlerIos::MakeBackgroundTaskQueue()
return [[[FLTSerialTaskQueue alloc] init] autorelease];
}
PlatformMessageHandlerIos::PlatformMessageHandlerIos(const TaskRunners& task_runners)
: task_runners_(task_runners) {}
PlatformMessageHandlerIos::PlatformMessageHandlerIos(
fml::RefPtr<fml::TaskRunner> platform_task_runner)
: platform_task_runner_(std::move(platform_task_runner)) {}
void PlatformMessageHandlerIos::HandlePlatformMessage(std::unique_ptr<PlatformMessage> message) {
// This can be called from any isolate's thread.
@@ -97,6 +94,10 @@ void PlatformMessageHandlerIos::HandlePlatformMessage(std::unique_ptr<PlatformMe
}
}
bool PlatformMessageHandlerIos::DoesHandlePlatformMessageOnPlatformThread() const {
return false;
}
void PlatformMessageHandlerIos::InvokePlatformMessageResponseCallback(
int response_id,
std::unique_ptr<fml::Mapping> mapping) {
@@ -114,7 +115,7 @@ void PlatformMessageHandlerIos::InvokePlatformMessageEmptyResponseCallback(int r
void PlatformMessageHandlerIos::SetMessageHandler(const std::string& channel,
FlutterBinaryMessageHandler handler,
NSObject<FlutterTaskQueue>* task_queue) {
FML_CHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
FML_CHECK(platform_task_runner_->RunsTasksOnCurrentThread());
/// TODO(gaaclarke): This should be migrated to a lockfree datastructure.
std::lock_guard lock(message_handlers_mutex_);
message_handlers_.erase(channel);

View File

@@ -46,7 +46,7 @@ class MockPlatformMessageResponse : public PlatformMessageResponse {
- (void)testCreate {
flutter::TaskRunners task_runners("test", GetCurrentTaskRunner(), CreateNewThread("raster"),
CreateNewThread("ui"), CreateNewThread("io"));
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners);
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
XCTAssertTrue(handler);
}
@@ -57,7 +57,7 @@ class MockPlatformMessageResponse : public PlatformMessageResponse {
"test", GetCurrentTaskRunner(), thread_host.raster_thread->GetTaskRunner(),
thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners);
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
std::string channel = "foo";
XCTestExpectation* didCallReply = [self expectationWithDescription:@"didCallReply"];
handler->SetMessageHandler(
@@ -83,7 +83,7 @@ class MockPlatformMessageResponse : public PlatformMessageResponse {
"test", GetCurrentTaskRunner(), thread_host.raster_thread->GetTaskRunner(),
thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners);
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
std::string channel = "foo";
XCTestExpectation* didCallMessage = [self expectationWithDescription:@"didCallMessage"];
handler->SetMessageHandler(
@@ -111,7 +111,7 @@ class MockPlatformMessageResponse : public PlatformMessageResponse {
"test", GetCurrentTaskRunner(), thread_host.raster_thread->GetTaskRunner(),
thread_host.ui_thread->GetTaskRunner(), thread_host.io_thread->GetTaskRunner());
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners);
auto handler = std::make_unique<PlatformMessageHandlerIos>(task_runners.GetPlatformTaskRunner());
std::string channel = "foo";
XCTestExpectation* didCallReply = [self expectationWithDescription:@"didCallReply"];
NSObject<FlutterTaskQueue>* taskQueue = PlatformMessageHandlerIos::MakeBackgroundTaskQueue();

View File

@@ -48,7 +48,8 @@ PlatformViewIOS::PlatformViewIOS(
ios_context_(context),
platform_views_controller_(platform_views_controller),
accessibility_bridge_([this](bool enabled) { PlatformView::SetSemanticsEnabled(enabled); }),
platform_message_handler_(new PlatformMessageHandlerIos(task_runners)) {}
platform_message_handler_(
new PlatformMessageHandlerIos(task_runners.GetPlatformTaskRunner())) {}
PlatformViewIOS::PlatformViewIOS(
PlatformView::Delegate& delegate,