4
4
5
5
#include " flutter/shell/platform/embedder/platform_view_embedder.h"
6
6
7
+ #include " flutter/fml/make_copyable.h"
8
+
7
9
namespace flutter {
8
10
11
+ class PlatformViewEmbedder ::EmbedderPlatformMessageHandler
12
+ : public PlatformMessageHandler {
13
+ public:
14
+ EmbedderPlatformMessageHandler (
15
+ PlatformViewEmbedder* parent,
16
+ fml::RefPtr<fml::TaskRunner> platform_task_runner)
17
+ : parent_(std::make_shared<PlatformViewEmbedder*>(parent)),
18
+ platform_task_runner_ (platform_task_runner) {}
19
+
20
+ virtual void HandlePlatformMessage (std::unique_ptr<PlatformMessage> message) {
21
+ platform_task_runner_->PostTask (fml::MakeCopyable (
22
+ [parent = parent_, message = std::move (message)]() mutable {
23
+ if (*parent) {
24
+ (*parent)->HandlePlatformMessage (std::move (message));
25
+ } else {
26
+ FML_DLOG (WARNING)
27
+ << " Dropping message on channel " << message->channel ();
28
+ }
29
+ }));
30
+ }
31
+ virtual void InvokePlatformMessageResponseCallback (
32
+ int response_id,
33
+ std::unique_ptr<fml::Mapping> mapping) {}
34
+ virtual void InvokePlatformMessageEmptyResponseCallback (int response_id) {}
35
+
36
+ void ClearParent () { parent_.reset (); }
37
+
38
+ private:
39
+ std::shared_ptr<PlatformViewEmbedder*> parent_;
40
+ fml::RefPtr<fml::TaskRunner> platform_task_runner_;
41
+ };
42
+
9
43
PlatformViewEmbedder::PlatformViewEmbedder (
10
44
PlatformView::Delegate& delegate,
11
45
flutter::TaskRunners task_runners,
@@ -17,7 +51,10 @@ PlatformViewEmbedder::PlatformViewEmbedder(
17
51
embedder_surface_(
18
52
std::make_unique<EmbedderSurfaceSoftware>(software_dispatch_table,
19
53
external_view_embedder_)),
20
- platform_dispatch_table_(platform_dispatch_table) {}
54
+ platform_dispatch_table_(platform_dispatch_table) {
55
+ platform_message_handler_ = std::make_shared<EmbedderPlatformMessageHandler>(
56
+ this , task_runners_.GetPlatformTaskRunner ());
57
+ }
21
58
22
59
#ifdef SHELL_ENABLE_GL
23
60
PlatformViewEmbedder::PlatformViewEmbedder (
@@ -33,7 +70,10 @@ PlatformViewEmbedder::PlatformViewEmbedder(
33
70
std::make_unique<EmbedderSurfaceGL>(gl_dispatch_table,
34
71
fbo_reset_after_present,
35
72
external_view_embedder_)),
36
- platform_dispatch_table_(platform_dispatch_table) {}
73
+ platform_dispatch_table_(platform_dispatch_table) {
74
+ platform_message_handler_ = std::make_shared<EmbedderPlatformMessageHandler>(
75
+ this , task_runners_.GetPlatformTaskRunner ());
76
+ }
37
77
#endif
38
78
39
79
#ifdef SHELL_ENABLE_METAL
@@ -46,7 +86,10 @@ PlatformViewEmbedder::PlatformViewEmbedder(
46
86
: PlatformView(delegate, std::move(task_runners)),
47
87
external_view_embedder_(external_view_embedder),
48
88
embedder_surface_(std::move(embedder_surface)),
49
- platform_dispatch_table_(platform_dispatch_table) {}
89
+ platform_dispatch_table_(platform_dispatch_table) {
90
+ platform_message_handler_ = std::make_shared<EmbedderPlatformMessageHandler>(
91
+ this , task_runners_.GetPlatformTaskRunner ());
92
+ }
50
93
#endif
51
94
52
95
#ifdef SHELL_ENABLE_VULKAN
@@ -59,10 +102,15 @@ PlatformViewEmbedder::PlatformViewEmbedder(
59
102
: PlatformView(delegate, std::move(task_runners)),
60
103
external_view_embedder_(external_view_embedder),
61
104
embedder_surface_(std::move(embedder_surface)),
62
- platform_dispatch_table_(platform_dispatch_table) {}
105
+ platform_dispatch_table_(platform_dispatch_table) {
106
+ platform_message_handler_ = std::make_shared<EmbedderPlatformMessageHandler>(
107
+ this , task_runners_.GetPlatformTaskRunner ());
108
+ }
63
109
#endif
64
110
65
- PlatformViewEmbedder::~PlatformViewEmbedder () = default ;
111
+ PlatformViewEmbedder::~PlatformViewEmbedder () {
112
+ platform_message_handler_->ClearParent ();
113
+ }
66
114
67
115
void PlatformViewEmbedder::UpdateSemantics (
68
116
flutter::SemanticsNodeUpdates update,
@@ -146,4 +194,9 @@ void PlatformViewEmbedder::OnPreEngineRestart() const {
146
194
}
147
195
}
148
196
197
+ std::shared_ptr<PlatformMessageHandler>
198
+ PlatformViewEmbedder::GetPlatformMessageHandler () const {
199
+ return platform_message_handler_;
200
+ }
201
+
149
202
} // namespace flutter
0 commit comments