Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 92606c2

Browse files
[fuchsia][scenic] Reland Move pointer injector to embedder. (#34692)
This PR moves the pointer injector library from fuchsia views library present in fuchsia.git to the flutter embedder. Test: ffx test run "fuchsia-pkg://fuchsia.com/flutter_runner_tests#meta/flutter_runner_tests.cm"
1 parent c29bf8f commit 92606c2

24 files changed

+1395
-14
lines changed

ci/licenses_golden/licenses_flutter

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,9 @@ FILE: ../../../flutter/shell/platform/fuchsia/flutter/platform_view_unittest.cc
20762076
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_delegate.cc
20772077
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_delegate.h
20782078
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_delegate_unittests.cc
2079+
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_injector_delegate.cc
2080+
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_injector_delegate.h
2081+
FILE: ../../../flutter/shell/platform/fuchsia/flutter/pointer_injector_delegate_unittest.cc
20792082
FILE: ../../../flutter/shell/platform/fuchsia/flutter/program_metadata.h
20802083
FILE: ../../../flutter/shell/platform/fuchsia/flutter/runner.cc
20812084
FILE: ../../../flutter/shell/platform/fuchsia/flutter/runner.h

shell/platform/fuchsia/flutter/BUILD.gn

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ template("runner_sources") {
9292
"platform_view.h",
9393
"pointer_delegate.cc",
9494
"pointer_delegate.h",
95+
"pointer_injector_delegate.cc",
96+
"pointer_injector_delegate.h",
9597
"program_metadata.h",
9698
"runner.cc",
9799
"runner.h",
@@ -158,6 +160,7 @@ template("runner_sources") {
158160
"$fuchsia_sdk_root/fidl:fuchsia.ui.pointer",
159161
"$fuchsia_sdk_root/fidl:fuchsia.ui.views",
160162
"$fuchsia_sdk_root/fidl:fuchsia.ui.scenic",
163+
"$fuchsia_sdk_root/fidl:fuchsia.ui.pointerinjector",
161164
"$fuchsia_sdk_root/pkg:async-cpp",
162165
"$fuchsia_sdk_root/pkg:async-default",
163166
"$fuchsia_sdk_root/pkg:async-loop",
@@ -472,6 +475,7 @@ if (enable_unittests) {
472475
"keyboard_unittest.cc",
473476
"platform_view_unittest.cc",
474477
"pointer_delegate_unittests.cc",
478+
"pointer_injector_delegate_unittest.cc",
475479
"tests/engine_unittests.cc",
476480
"tests/fake_flatland_unittests.cc",
477481
"tests/fake_session_unittests.cc",

shell/platform/fuchsia/flutter/engine.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,17 @@ void Engine::Initialize(
213213
<< "fuchsia::ui::input3::Keyboard connection failed: "
214214
<< zx_status_get_string(keyboard_status);
215215

216+
// Connect to Pointerinjector service.
217+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry;
218+
zx_status_t pointerinjector_registry_status =
219+
runner_services->Connect<fuchsia::ui::pointerinjector::Registry>(
220+
pointerinjector_registry.NewRequest());
221+
if (pointerinjector_registry_status != ZX_OK) {
222+
FML_LOG(WARNING)
223+
<< "fuchsia::ui::pointerinjector::Registry connection failed: "
224+
<< zx_status_get_string(pointerinjector_registry_status);
225+
}
226+
216227
// Make clones of the `ViewRef` before sending it to various places.
217228
fuchsia::ui::views::ViewRef platform_view_ref;
218229
view_ref_pair.view_ref.Clone(&platform_view_ref);
@@ -401,6 +412,7 @@ void Engine::Initialize(
401412
view_ref_focused = std::move(view_ref_focused),
402413
touch_source = std::move(touch_source),
403414
mouse_source = std::move(mouse_source),
415+
pointerinjector_registry = std::move(pointerinjector_registry),
404416
on_session_listener_error_callback =
405417
std::move(on_session_listener_error_callback),
406418
on_enable_wireframe_callback =
@@ -479,6 +491,7 @@ void Engine::Initialize(
479491
std::move(mouse_source), std::move(focuser),
480492
std::move(view_ref_focused),
481493
std::move(parent_viewport_watcher),
494+
std::move(pointerinjector_registry),
482495
std::move(on_enable_wireframe_callback),
483496
std::move(on_create_flatland_view_callback),
484497
std::move(on_update_view_callback),
@@ -496,6 +509,7 @@ void Engine::Initialize(
496509
std::move(keyboard), std::move(touch_source),
497510
std::move(mouse_source), std::move(focuser),
498511
std::move(view_ref_focused),
512+
std::move(pointerinjector_registry),
499513
std::move(session_listener_request),
500514
std::move(on_session_listener_error_callback),
501515
std::move(on_enable_wireframe_callback),

shell/platform/fuchsia/flutter/flatland_external_view_embedder.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ void FlatlandExternalViewEmbedder::CreateView(
358358
FlatlandView new_view = {.transform_id = transform_id,
359359
.viewport_id = viewport_id};
360360
flatland_->flatland()->CreateTransform(new_view.transform_id);
361-
fuchsia::ui::composition::ChildViewWatcherPtr child_view_watcher;
361+
fuchsia::ui::composition::ChildViewWatcherHandle child_view_watcher;
362362
new_view.pending_create_viewport_callback =
363363
[this, transform_id, viewport_id, view_id,
364364
child_view_watcher_request =

shell/platform/fuchsia/flutter/flatland_external_view_embedder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ namespace flutter_runner {
3535
using ViewCallback = std::function<void()>;
3636
using FlatlandViewCreatedCallback = std::function<void(
3737
fuchsia::ui::composition::ContentId,
38-
fuchsia::ui::composition::ChildViewWatcherPtr child_view_watcher)>;
38+
fuchsia::ui::composition::ChildViewWatcherHandle child_view_watcher)>;
3939
using FlatlandViewIdCallback =
4040
std::function<void(fuchsia::ui::composition::ContentId)>;
4141

shell/platform/fuchsia/flutter/flatland_platform_view.cc

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ FlatlandPlatformView::FlatlandPlatformView(
2121
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
2222
fuchsia::ui::composition::ParentViewportWatcherHandle
2323
parent_viewport_watcher,
24+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
2425
OnEnableWireframe wireframe_enabled_callback,
2526
OnCreateFlatlandView on_create_view_callback,
2627
OnUpdateView on_update_view_callback,
@@ -43,6 +44,7 @@ FlatlandPlatformView::FlatlandPlatformView(
4344
std::move(mouse_source),
4445
std::move(focuser),
4546
std::move(view_ref_focused),
47+
std::move(pointerinjector_registry),
4648
std::move(wireframe_enabled_callback),
4749
std::move(on_update_view_callback),
4850
std::move(on_create_surface_callback),
@@ -148,6 +150,10 @@ void FlatlandPlatformView::OnChildViewViewRef(
148150

149151
focus_delegate_->OnChildViewViewRef(view_id, std::move(view_ref));
150152

153+
fuchsia::ui::views::ViewRef view_ref_clone;
154+
fidl::Clone(view_ref, &view_ref_clone);
155+
pointer_injector_delegate_->OnCreateView(view_id, std::move(view_ref_clone));
156+
151157
child_view_info_.at(content_id)
152158
.child_view_watcher->GetViewRef(
153159
[this, content_id, view_id](fuchsia::ui::views::ViewRef view_ref) {
@@ -164,16 +170,32 @@ void FlatlandPlatformView::OnCreateView(ViewCallback on_view_created,
164170
task_runners_.GetPlatformTaskRunner(),
165171
view_id = view_id_raw](
166172
fuchsia::ui::composition::ContentId content_id,
167-
fuchsia::ui::composition::ChildViewWatcherPtr
168-
child_view_watcher) {
173+
fuchsia::ui::composition::ChildViewWatcherHandle
174+
child_view_watcher_handle) {
169175
FML_CHECK(weak);
170176
FML_CHECK(weak->child_view_info_.count(content_id.value) == 0);
177+
178+
// Bind the child view watcher to the platform thread so that the FIDL calls
179+
// are handled on the platform thread.
180+
fuchsia::ui::composition::ChildViewWatcherPtr child_view_watcher =
181+
child_view_watcher_handle.Bind();
171182
FML_CHECK(child_view_watcher);
172183

173-
child_view_watcher.set_error_handler([](zx_status_t status) {
174-
FML_LOG(ERROR) << "Interface error on: ChildViewWatcher status: "
175-
<< status;
176-
});
184+
child_view_watcher.set_error_handler(
185+
[weak, view_id](zx_status_t status) {
186+
FML_LOG(ERROR) << "Interface error on: ChildViewWatcher status: "
187+
<< status;
188+
189+
if (!weak) {
190+
FML_LOG(WARNING)
191+
<< "Flatland View bound to PlatformView after PlatformView was "
192+
"destroyed; ignoring.";
193+
return;
194+
}
195+
196+
// Disconnected views cannot listen to pointer events.
197+
weak->pointer_injector_delegate_->OnDestroyView(view_id);
198+
});
177199

178200
platform_task_runner->PostTask(
179201
fml::MakeCopyable([weak, view_id, content_id,
@@ -226,6 +248,7 @@ void FlatlandPlatformView::OnDisposeView(int64_t view_id_raw) {
226248
FML_DCHECK(weak->child_view_info_.count(content_id.value) == 1);
227249
weak->child_view_info_.erase(content_id.value);
228250
weak->focus_delegate_->OnDisposeChildView(view_id_raw);
251+
weak->pointer_injector_delegate_->OnDestroyView(view_id_raw);
229252
});
230253
};
231254
on_destroy_view_callback_(view_id_raw, std::move(on_view_unbound));

shell/platform/fuchsia/flutter/flatland_platform_view.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class FlatlandPlatformView final : public flutter_runner::PlatformView {
3535
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
3636
fuchsia::ui::composition::ParentViewportWatcherHandle
3737
parent_viewport_watcher,
38+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
3839
OnEnableWireframe wireframe_enabled_callback,
3940
OnCreateFlatlandView on_create_view_callback,
4041
OnUpdateView on_update_view_callback,

shell/platform/fuchsia/flutter/gfx_platform_view.cc

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ GfxPlatformView::GfxPlatformView(
1919
fuchsia::ui::pointer::MouseSourceHandle mouse_source,
2020
fuchsia::ui::views::FocuserHandle focuser,
2121
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
22+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
2223
fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>
2324
session_listener_request,
2425
fit::closure on_session_listener_error_callback,
@@ -44,6 +45,7 @@ GfxPlatformView::GfxPlatformView(
4445
std::move(mouse_source),
4546
std::move(focuser),
4647
std::move(view_ref_focused),
48+
std::move(pointerinjector_registry),
4749
std::move(wireframe_enabled_callback),
4850
std::move(on_update_view_callback),
4951
std::move(on_create_surface_callback),
@@ -295,6 +297,9 @@ bool GfxPlatformView::OnChildViewDisconnected(
295297
<< "}";
296298
auto call = out.str();
297299

300+
// A disconnected view cannot listen to pointer events.
301+
pointer_injector_delegate_->OnDestroyView(view_id_mapping->second);
302+
298303
std::unique_ptr<flutter::PlatformMessage> message =
299304
std::make_unique<flutter::PlatformMessage>(
300305
"flutter/platform_views",
@@ -350,6 +355,7 @@ void GfxPlatformView::OnCreateView(ViewCallback on_view_created,
350355

351356
FML_DCHECK(weak->child_view_ids_.count(resource_id) == 0);
352357
weak->child_view_ids_[resource_id] = view_id;
358+
weak->pointer_injector_delegate_->OnCreateView(view_id);
353359
});
354360
};
355361
on_create_view_callback_(view_id_raw, std::move(on_view_created),
@@ -358,10 +364,10 @@ void GfxPlatformView::OnCreateView(ViewCallback on_view_created,
358364

359365
void GfxPlatformView::OnDisposeView(int64_t view_id_raw) {
360366
auto on_view_unbound =
361-
[weak = weak_factory_.GetWeakPtr(),
367+
[weak = weak_factory_.GetWeakPtr(), view_id = view_id_raw,
362368
platform_task_runner = task_runners_.GetPlatformTaskRunner()](
363369
scenic::ResourceId resource_id) {
364-
platform_task_runner->PostTask([weak, resource_id]() {
370+
platform_task_runner->PostTask([weak, resource_id, view_id]() {
365371
if (!weak) {
366372
FML_LOG(WARNING)
367373
<< "ViewHolder unbound from PlatformView after PlatformView"
@@ -371,6 +377,7 @@ void GfxPlatformView::OnDisposeView(int64_t view_id_raw) {
371377

372378
FML_DCHECK(weak->child_view_ids_.count(resource_id) == 1);
373379
weak->child_view_ids_.erase(resource_id);
380+
weak->pointer_injector_delegate_->OnDestroyView(view_id);
374381
});
375382
};
376383
on_destroy_view_callback_(view_id_raw, std::move(on_view_unbound));

shell/platform/fuchsia/flutter/gfx_platform_view.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class GfxPlatformView final : public flutter_runner::PlatformView,
3636
fuchsia::ui::pointer::MouseSourceHandle mouse_source,
3737
fuchsia::ui::views::FocuserHandle focuser,
3838
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
39+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
3940
fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>
4041
session_listener_request,
4142
fit::closure on_session_listener_error_callback,

shell/platform/fuchsia/flutter/meta/common.shard.cml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"fuchsia.ui.input.ImeService",
4949
"fuchsia.ui.input3.Keyboard",
5050
"fuchsia.ui.scenic.Scenic",
51+
"fuchsia.ui.pointerinjector.Registry",
5152
"fuchsia.vulkan.loader.Loader" // Copied from vulkan/client.shard.cml.
5253
]
5354
}

shell/platform/fuchsia/flutter/meta/flutter_aot_product_runner.cmx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"fuchsia.ui.input.ImeService",
2727
"fuchsia.ui.input3.Keyboard",
2828
"fuchsia.ui.scenic.Scenic",
29+
"fuchsia.ui.pointerinjector.Registry",
2930
"fuchsia.vulkan.loader.Loader"
3031
]
3132
}

shell/platform/fuchsia/flutter/meta/flutter_aot_runner.cmx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"fuchsia.ui.input.ImeService",
2727
"fuchsia.ui.input3.Keyboard",
2828
"fuchsia.ui.scenic.Scenic",
29+
"fuchsia.ui.pointerinjector.Registry",
2930
"fuchsia.vulkan.loader.Loader"
3031
]
3132
}

shell/platform/fuchsia/flutter/meta/flutter_jit_product_runner.cmx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"fuchsia.ui.input.ImeService",
2828
"fuchsia.ui.input3.Keyboard",
2929
"fuchsia.ui.scenic.Scenic",
30+
"fuchsia.ui.pointerinjector.Registry",
3031
"fuchsia.vulkan.loader.Loader"
3132
]
3233
}

shell/platform/fuchsia/flutter/meta/flutter_jit_runner.cmx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"fuchsia.ui.input.ImeService",
2828
"fuchsia.ui.input3.Keyboard",
2929
"fuchsia.ui.scenic.Scenic",
30+
"fuchsia.ui.pointerinjector.Registry",
3031
"fuchsia.vulkan.loader.Loader"
3132
]
3233
}

shell/platform/fuchsia/flutter/platform_view.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// found in the LICENSE file.
44

55
#include "flow/embedded_views.h"
6+
#include "pointer_injector_delegate.h"
67
#define RAPIDJSON_HAS_STDSTRING 1
78

89
#include "platform_view.h"
@@ -62,6 +63,7 @@ PlatformView::PlatformView(
6263
fuchsia::ui::pointer::MouseSourceHandle mouse_source,
6364
fuchsia::ui::views::FocuserHandle focuser,
6465
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
66+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
6567
OnEnableWireframe wireframe_enabled_callback,
6668
OnUpdateView on_update_view_callback,
6769
OnCreateSurface on_create_surface_callback,
@@ -101,6 +103,9 @@ PlatformView::PlatformView(
101103
SetInterfaceErrorHandler(keyboard_listener_binding_, "Keyboard Listener");
102104
SetInterfaceErrorHandler(keyboard_, "Keyboard");
103105

106+
fuchsia::ui::views::ViewRef view_ref_clone;
107+
fidl::Clone(view_ref, &view_ref_clone);
108+
104109
// Configure keyboard listener.
105110
keyboard_->AddListener(std::move(view_ref),
106111
keyboard_listener_binding_.NewBinding(), [] {});
@@ -150,6 +155,11 @@ PlatformView::PlatformView(
150155
});
151156
}
152157

158+
// Configure the pointer injector delegate.
159+
pointer_injector_delegate_ = std::make_unique<PointerInjectorDelegate>(
160+
std::move(pointerinjector_registry), std::move(view_ref_clone),
161+
is_flatland);
162+
153163
// Finally! Register the native platform message handlers.
154164
RegisterPlatformMessageHandlers();
155165
}
@@ -845,6 +855,10 @@ bool PlatformView::HandleFlutterPlatformViewsChannelPlatformMessage(
845855
}
846856
} else if (method.rfind("View.focus", 0) == 0) {
847857
return focus_delegate_->HandlePlatformMessage(root, message->response());
858+
} else if (method.rfind(PointerInjectorDelegate::kPointerInjectorMethodPrefix,
859+
0) == 0) {
860+
return pointer_injector_delegate_->HandlePlatformMessage(
861+
root, message->response());
848862
} else {
849863
FML_LOG(ERROR) << "Unknown " << message->channel() << " method " << method;
850864
}

shell/platform/fuchsia/flutter/platform_view.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "flutter/shell/platform/fuchsia/flutter/vsync_waiter.h"
3434
#include "focus_delegate.h"
3535
#include "pointer_delegate.h"
36+
#include "pointer_injector_delegate.h"
3637

3738
namespace flutter_runner {
3839

@@ -75,6 +76,7 @@ class PlatformView : public flutter::PlatformView,
7576
fuchsia::ui::pointer::MouseSourceHandle mouse_source,
7677
fuchsia::ui::views::FocuserHandle focuser,
7778
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused,
79+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry,
7880
OnEnableWireframe wireframe_enabled_callback,
7981
OnUpdateView on_update_view_callback,
8082
OnCreateSurface on_create_surface_callback,
@@ -187,6 +189,7 @@ class PlatformView : public flutter::PlatformView,
187189

188190
std::shared_ptr<FocusDelegate> focus_delegate_;
189191
std::shared_ptr<PointerDelegate> pointer_delegate_;
192+
std::unique_ptr<PointerInjectorDelegate> pointer_injector_delegate_;
190193

191194
fidl::Binding<fuchsia::ui::input::InputMethodEditorClient> ime_client_;
192195
fuchsia::ui::input::InputMethodEditorPtr ime_;

shell/platform/fuchsia/flutter/platform_view_unittest.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,12 @@ class PlatformViewBuilder {
271271
return *this;
272272
}
273273

274+
PlatformViewBuilder& SetPointerinjectorRegistry(
275+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry) {
276+
pointerinjector_registry_ = std::move(pointerinjector_registry);
277+
return *this;
278+
}
279+
274280
PlatformViewBuilder& SetSessionListenerRequest(
275281
fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener> request) {
276282
session_listener_request_ = std::move(request);
@@ -316,7 +322,8 @@ class PlatformViewBuilder {
316322
external_external_view_embedder_, std::move(ime_service_),
317323
std::move(keyboard_), std::move(touch_source_),
318324
std::move(mouse_source_), std::move(focuser_),
319-
std::move(view_ref_focused_), std::move(session_listener_request_),
325+
std::move(view_ref_focused_), std::move(pointerinjector_registry_),
326+
std::move(session_listener_request_),
320327
std::move(on_session_listener_error_callback_),
321328
std::move(wireframe_enabled_callback_),
322329
std::move(on_create_view_callback_),
@@ -343,6 +350,7 @@ class PlatformViewBuilder {
343350
fuchsia::ui::pointer::MouseSourceHandle mouse_source_;
344351
fuchsia::ui::views::ViewRefFocusedHandle view_ref_focused_;
345352
fuchsia::ui::views::FocuserHandle focuser_;
353+
fuchsia::ui::pointerinjector::RegistryHandle pointerinjector_registry_;
346354
fidl::InterfaceRequest<fuchsia::ui::scenic::SessionListener>
347355
session_listener_request_;
348356
fit::closure on_session_listener_error_callback_;

0 commit comments

Comments
 (0)