From 6d80461bc9533370b09ab504860ab5cc98404b11 Mon Sep 17 00:00:00 2001 From: Ian McKellar Date: Mon, 1 May 2023 22:07:16 +0000 Subject: [PATCH 1/4] [fuchsia] fix run_integration_test.sh This updates the `fx serve` check to reflect the current state of Fuchsia's package serving. --- tools/fuchsia/devshell/run_integration_test.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/fuchsia/devshell/run_integration_test.sh b/tools/fuchsia/devshell/run_integration_test.sh index 831f077a9ae80..bdd51edbb125f 100755 --- a/tools/fuchsia/devshell/run_integration_test.sh +++ b/tools/fuchsia/devshell/run_integration_test.sh @@ -34,7 +34,7 @@ then fi # This script currently requires running `fx serve`. -if [[ -z "$(pgrep -f 'pm serve')" ]] +if [[ -z "$(pgrep -f 'package-tool')" ]] then engine-error "This script currently requires running 'fx serve' first." exit 1 From 4f12612f7327e03536fa66a75b2b0e874032217f Mon Sep 17 00:00:00 2001 From: Ian McKellar Date: Mon, 1 May 2023 23:29:52 +0000 Subject: [PATCH 2/4] [fuchsia] Stop calling fuchsia.ui.test.input from Dart As we move the Dart FIDL bindings we need to stop calling FIDL methods from Dart in the Flutter repo. This only affects some integration tests. This moves the FIDL calls into C++ and uses platform messages to make the functionality available to the Dart tests. --- shell/platform/fuchsia/flutter/BUILD.gn | 5 +- shell/platform/fuchsia/flutter/engine.cc | 8 +- .../fuchsia/flutter/flatland_platform_view.cc | 6 +- .../fuchsia/flutter/flatland_platform_view.h | 3 +- .../fuchsia/flutter/gfx_platform_view.cc | 6 +- .../fuchsia/flutter/gfx_platform_view.h | 3 +- .../platform/fuchsia/flutter/platform_view.cc | 188 +++++++++++++++++- .../platform/fuchsia/flutter/platform_view.h | 13 +- .../tests/flatland_platform_view_unittest.cc | 3 +- .../mouse-input/mouse-input-view/BUILD.gn | 2 - .../lib/mouse-input-view.dart | 76 +++---- .../text-input/text-input-view/BUILD.gn | 7 +- .../text-input-view/lib/text_input_view.dart | 21 +- .../embedding-flutter-view/BUILD.gn | 1 - .../lib/embedding-flutter-view.dart | 22 +- .../touch-input/touch-input-view/BUILD.gn | 2 - .../lib/touch-input-view.dart | 24 +-- 17 files changed, 280 insertions(+), 110 deletions(-) diff --git a/shell/platform/fuchsia/flutter/BUILD.gn b/shell/platform/fuchsia/flutter/BUILD.gn index 1eae68906389b..68af2224ef07b 100644 --- a/shell/platform/fuchsia/flutter/BUILD.gn +++ b/shell/platform/fuchsia/flutter/BUILD.gn @@ -162,9 +162,10 @@ template("runner_sources") { "$fuchsia_sdk_root/fidl:fuchsia.ui.app", "$fuchsia_sdk_root/fidl:fuchsia.ui.composition", "$fuchsia_sdk_root/fidl:fuchsia.ui.pointer", - "$fuchsia_sdk_root/fidl:fuchsia.ui.views", - "$fuchsia_sdk_root/fidl:fuchsia.ui.scenic", "$fuchsia_sdk_root/fidl:fuchsia.ui.pointerinjector", + "$fuchsia_sdk_root/fidl:fuchsia.ui.scenic", + "$fuchsia_sdk_root/fidl:fuchsia.ui.test.input", + "$fuchsia_sdk_root/fidl:fuchsia.ui.views", "$fuchsia_sdk_root/pkg:async-cpp", "$fuchsia_sdk_root/pkg:async-default", "$fuchsia_sdk_root/pkg:async-loop", diff --git a/shell/platform/fuchsia/flutter/engine.cc b/shell/platform/fuchsia/flutter/engine.cc index badb01e7712cf..40eba58810add 100644 --- a/shell/platform/fuchsia/flutter/engine.cc +++ b/shell/platform/fuchsia/flutter/engine.cc @@ -582,7 +582,7 @@ void Engine::Initialize( session_connection_->AwaitVsyncForSecondaryCallback(cb); } }, - product_config](flutter::Shell& shell) mutable { + product_config, svc](flutter::Shell& shell) mutable { OnShaderWarmup on_shader_warmup = nullptr; if (product_config.enable_shader_warmup()) { FML_DCHECK(surface_producer_); @@ -636,7 +636,8 @@ void Engine::Initialize( std::move(on_request_announce_callback), std::move(on_shader_warmup), std::move(await_vsync_callback), - std::move(await_vsync_for_secondary_callback_callback)); + std::move(await_vsync_for_secondary_callback_callback), + std::move(svc)); } else { platform_view = std::make_unique( shell, shell.GetTaskRunners(), std::move(view_ref), @@ -655,7 +656,8 @@ void Engine::Initialize( std::move(on_semantics_node_update_callback), std::move(on_request_announce_callback), std::move(on_shader_warmup), std::move(await_vsync_callback), - std::move(await_vsync_for_secondary_callback_callback)); + std::move(await_vsync_for_secondary_callback_callback), + std::move(svc)); } return platform_view; }); diff --git a/shell/platform/fuchsia/flutter/flatland_platform_view.cc b/shell/platform/fuchsia/flutter/flatland_platform_view.cc index e6cd12805bf1d..d6e6721c36fc1 100644 --- a/shell/platform/fuchsia/flutter/flatland_platform_view.cc +++ b/shell/platform/fuchsia/flutter/flatland_platform_view.cc @@ -32,7 +32,8 @@ FlatlandPlatformView::FlatlandPlatformView( OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback) + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc) : PlatformView(true /* is_flatland */, delegate, std::move(task_runners), @@ -52,7 +53,8 @@ FlatlandPlatformView::FlatlandPlatformView( std::move(on_request_announce_callback), std::move(on_shader_warmup), std::move(await_vsync_callback), - std::move(await_vsync_for_secondary_callback_callback)), + std::move(await_vsync_for_secondary_callback_callback), + std::move(svc)), parent_viewport_watcher_(parent_viewport_watcher.Bind()), on_create_view_callback_(std::move(on_create_view_callback)), on_destroy_view_callback_(std::move(on_destroy_view_callback)), diff --git a/shell/platform/fuchsia/flutter/flatland_platform_view.h b/shell/platform/fuchsia/flutter/flatland_platform_view.h index afe0819842cd9..ed95aa042c5a5 100644 --- a/shell/platform/fuchsia/flutter/flatland_platform_view.h +++ b/shell/platform/fuchsia/flutter/flatland_platform_view.h @@ -46,7 +46,8 @@ class FlatlandPlatformView final : public flutter_runner::PlatformView { OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback); + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc); ~FlatlandPlatformView() override; void OnGetLayout(fuchsia::ui::composition::LayoutInfo info); diff --git a/shell/platform/fuchsia/flutter/gfx_platform_view.cc b/shell/platform/fuchsia/flutter/gfx_platform_view.cc index ed9eeece151a0..d28b83e60f8c0 100644 --- a/shell/platform/fuchsia/flutter/gfx_platform_view.cc +++ b/shell/platform/fuchsia/flutter/gfx_platform_view.cc @@ -33,7 +33,8 @@ GfxPlatformView::GfxPlatformView( OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback) + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc) : PlatformView(false /* is_flatland */, delegate, std::move(task_runners), @@ -53,7 +54,8 @@ GfxPlatformView::GfxPlatformView( std::move(on_request_announce_callback), std::move(on_shader_warmup), std::move(await_vsync_callback), - std::move(await_vsync_for_secondary_callback_callback)), + std::move(await_vsync_for_secondary_callback_callback), + std::move(svc)), session_listener_binding_(this, std::move(session_listener_request)), session_listener_error_callback_( std::move(on_session_listener_error_callback)), diff --git a/shell/platform/fuchsia/flutter/gfx_platform_view.h b/shell/platform/fuchsia/flutter/gfx_platform_view.h index 1004a85808c56..0d34c1e61d627 100644 --- a/shell/platform/fuchsia/flutter/gfx_platform_view.h +++ b/shell/platform/fuchsia/flutter/gfx_platform_view.h @@ -50,7 +50,8 @@ class GfxPlatformView final : public flutter_runner::PlatformView, OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback); + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc); ~GfxPlatformView() override; diff --git a/shell/platform/fuchsia/flutter/platform_view.cc b/shell/platform/fuchsia/flutter/platform_view.cc index 42e4ca01858ca..112278f1c7463 100644 --- a/shell/platform/fuchsia/flutter/platform_view.cc +++ b/shell/platform/fuchsia/flutter/platform_view.cc @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include #include "flow/embedded_views.h" #include "pointer_injector_delegate.h" #define RAPIDJSON_HAS_STDSTRING 1 @@ -34,6 +35,7 @@ static constexpr char kFlutterPlatformChannel[] = "flutter/platform"; static constexpr char kAccessibilityChannel[] = "flutter/accessibility"; static constexpr char kFlutterPlatformViewsChannel[] = "flutter/platform_views"; static constexpr char kFuchsiaShaderWarmupChannel[] = "fuchsia/shader_warmup"; +static constexpr char kFuchsiaInputTestChannel[] = "fuchsia/input_test"; PlatformView::PlatformView( bool is_flatland, @@ -56,7 +58,8 @@ PlatformView::PlatformView( OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback) + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc) : flutter::PlatformView(delegate, std::move(task_runners)), external_view_embedder_(external_view_embedder), focus_delegate_( @@ -140,6 +143,47 @@ PlatformView::PlatformView( std::move(pointerinjector_registry), std::move(view_ref_clone), is_flatland); + if (svc) { + // Connect to TouchInputListener + fuchsia::ui::test::input::TouchInputListenerHandle touch_input_listener; + zx_status_t touch_input_listener_status = + svc->Connect( + touch_input_listener.NewRequest()); + if (touch_input_listener_status != ZX_OK) { + FML_LOG(WARNING) + << "fuchsia::ui::test::input::TouchInputListener connection failed: " + << zx_status_get_string(touch_input_listener_status); + } else { + touch_input_listener_.Bind(std::move(touch_input_listener)); + } + + // Connect to KeyboardInputListener + fuchsia::ui::test::input::KeyboardInputListenerHandle + keyboard_input_listener; + zx_status_t keyboard_input_listener_status = + svc->Connect( + keyboard_input_listener.NewRequest()); + if (keyboard_input_listener_status != ZX_OK) { + FML_LOG(WARNING) << "fuchsia::ui::test::input::KeyboardInputListener " + "connection failed: " + << zx_status_get_string(keyboard_input_listener_status); + } else { + keyboard_input_listener_.Bind(std::move(keyboard_input_listener)); + } + // Connect to MouseInputListener + fuchsia::ui::test::input::MouseInputListenerHandle mouse_input_listener; + zx_status_t mouse_input_listener_status = + svc->Connect( + mouse_input_listener.NewRequest()); + if (mouse_input_listener_status != ZX_OK) { + FML_LOG(WARNING) + << "fuchsia::ui::test::input::MouseInputListener connection failed: " + << zx_status_get_string(mouse_input_listener_status); + } else { + mouse_input_listener_.Bind(std::move(mouse_input_listener)); + } + } + // Finally! Register the native platform message handlers. RegisterPlatformMessageHandlers(); } @@ -162,6 +206,9 @@ void PlatformView::RegisterPlatformMessageHandlers() { platform_message_handlers_[kFuchsiaShaderWarmupChannel] = std::bind(&HandleFuchsiaShaderWarmupChannelPlatformMessage, on_shader_warmup_, std::placeholders::_1); + platform_message_handlers_[kFuchsiaInputTestChannel] = + std::bind(&PlatformView::HandleFuchsiaInputTestChannelPlatformMessage, + this, std::placeholders::_1); } static flutter::PointerData::Change GetChangeFromPointerEventPhase( @@ -673,4 +720,143 @@ bool PlatformView::HandleFuchsiaShaderWarmupChannelPlatformMessage( return true; } +namespace { +template +bool WithMember(O obj, const char* member_name, F func) { + auto it = obj.FindMember(member_name); + if (it == obj.MemberEnd()) { + return false; + } + if (!it->value.template Is()) { + return false; + } + func(it->value.template Get()); + return true; +} +} // namespace + +// Channel handler for kFuchsiaInputTestChannel +bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( + std::unique_ptr message) { + FML_DCHECK(message->channel() == kFuchsiaInputTestChannel); + + const auto& data = message->data(); + rapidjson::Document document; + document.Parse(reinterpret_cast(data.GetMapping()), + data.GetSize()); + if (document.HasParseError() || !document.IsObject()) { + FML_LOG(ERROR) << "Could not parse document"; + return false; + } + auto root = document.GetObject(); + auto method = root.FindMember("method"); + if (method == root.MemberEnd() || !method->value.IsString()) { + FML_LOG(ERROR) << "Missing method"; + return false; + } + + FML_LOG(INFO) << "fuchsia/input_test: method=" << method->value.GetString(); + + if (method->value == "TouchInputListener.ReportTouchInput") { + if (!touch_input_listener_) { + FML_LOG(ERROR) << "TouchInputListener not found."; + return false; + } + + fuchsia::ui::test::input::TouchInputListenerReportTouchInputRequest request; + WithMember(root, "local_x", + [&](double local_x) { request.set_local_x(local_x); }); + WithMember(root, "local_y", + [&](double local_y) { request.set_local_y(local_y); }); + WithMember(root, "time_received", [&](uint64_t time_received) { + request.set_time_received(time_received); + }); + WithMember(root, "component_name", + [&](std::string component_name) { + request.set_component_name(component_name); + }); + + touch_input_listener_->ReportTouchInput(std::move(request)); + return true; + } + + if (method->value == "KeyboardInputListener.ReportTextInput") { + if (!keyboard_input_listener_) { + FML_LOG(ERROR) << "KeyboardInputListener not found."; + return false; + } + + fuchsia::ui::test::input::KeyboardInputListenerReportTextInputRequest + request; + WithMember(root, "text", + [&](std::string text) { request.set_text(text); }); + + keyboard_input_listener_->ReportTextInput(std::move(request)); + return true; + } + + if (method->value == "MouseInputListener.ReportMouseInput") { + if (!mouse_input_listener_) { + FML_LOG(ERROR) << "MouseInputListener not found."; + return false; + } + + fuchsia::ui::test::input::MouseInputListenerReportMouseInputRequest request; + WithMember(root, "local_x", + [&](double local_x) { request.set_local_x(local_x); }); + WithMember(root, "local_y", + [&](double local_y) { request.set_local_y(local_y); }); + WithMember(root, "time_received", [&](uint64_t time_received) { + request.set_time_received(time_received); + }); + WithMember(root, "component_name", + [&](std::string component_name) { + request.set_component_name(component_name); + }); + WithMember(root, "buttons", [&](int button_mask) { + std::vector buttons; + if (button_mask & 1) { + buttons.push_back(fuchsia::ui::test::input::MouseButton::FIRST); + } + if (button_mask & 2) { + buttons.push_back(fuchsia::ui::test::input::MouseButton::SECOND); + } + if (button_mask & 4) { + buttons.push_back(fuchsia::ui::test::input::MouseButton::THIRD); + } + request.set_buttons(buttons); + }); + WithMember(root, "phase", [&](std::string phase) { + if (phase == "add") { + request.set_phase(fuchsia::ui::test::input::MouseEventPhase::ADD); + } else if (phase == "hover") { + request.set_phase(fuchsia::ui::test::input::MouseEventPhase::HOVER); + } else if (phase == "down") { + request.set_phase(fuchsia::ui::test::input::MouseEventPhase::DOWN); + } else if (phase == "move") { + request.set_phase(fuchsia::ui::test::input::MouseEventPhase::MOVE); + } else if (phase == "up") { + request.set_phase(fuchsia::ui::test::input::MouseEventPhase::UP); + } else { + FML_LOG(ERROR) << "Unexpected mouse phase: " << phase; + } + }); + WithMember( + root, "wheel_x_physical_pixel", [&](double wheel_x_physical_pixel) { + request.set_wheel_x_physical_pixel(wheel_x_physical_pixel); + }); + WithMember( + root, "wheel_y_physical_pixel", [&](double wheel_y_physical_pixel) { + request.set_wheel_y_physical_pixel(wheel_y_physical_pixel); + }); + + mouse_input_listener_->ReportMouseInput(std::move(request)); + return true; + } + + FML_LOG(ERROR) << "fuchsia/input_test: unrecognized method " + << method->value.GetString(); + return false; +} + } // namespace flutter_runner diff --git a/shell/platform/fuchsia/flutter/platform_view.h b/shell/platform/fuchsia/flutter/platform_view.h index 7c6aa98108ebe..bb8d275ba5244 100644 --- a/shell/platform/fuchsia/flutter/platform_view.h +++ b/shell/platform/fuchsia/flutter/platform_view.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -84,7 +85,8 @@ class PlatformView : public flutter::PlatformView { OnShaderWarmup on_shader_warmup, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback - await_vsync_for_secondary_callback_callback); + await_vsync_for_secondary_callback_callback, + std::shared_ptr svc); ~PlatformView() override; @@ -136,6 +138,10 @@ class PlatformView : public flutter::PlatformView { OnShaderWarmup on_shader_warmup, std::unique_ptr message); + // Channel handler for kFuchsiaInputTestChannel. + bool HandleFuchsiaInputTestChannelPlatformMessage( + std::unique_ptr message); + virtual void OnCreateView(ViewCallback on_view_created, int64_t view_id_raw, bool hit_testable, @@ -186,6 +192,11 @@ class PlatformView : public flutter::PlatformView { AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback_; + // Proxies for input tests. + fuchsia::ui::test::input::TouchInputListenerPtr touch_input_listener_; + fuchsia::ui::test::input::KeyboardInputListenerPtr keyboard_input_listener_; + fuchsia::ui::test::input::MouseInputListenerPtr mouse_input_listener_; + fml::WeakPtrFactory weak_factory_; // Must be the last member. FML_DISALLOW_COPY_AND_ASSIGN(PlatformView); diff --git a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc index c1ffbcd96ab66..896936124dafb 100644 --- a/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/tests/flatland_platform_view_unittest.cc @@ -436,7 +436,8 @@ class PlatformViewBuilder { std::move(on_create_surface_callback_), std::move(on_semantics_node_update_callback_), std::move(on_request_announce_callback_), - std::move(on_shader_warmup_callback_), [](auto...) {}, [](auto...) {}); + std::move(on_shader_warmup_callback_), [](auto...) {}, [](auto...) {}, + nullptr); } private: diff --git a/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn b/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn index edb58ee0fd16f..07af06b2306df 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn +++ b/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/BUILD.gn @@ -14,9 +14,7 @@ dart_library("lib") { deps = [ "//flutter/shell/platform/fuchsia/dart:args", - "//flutter/tools/fuchsia/dart:fuchsia_services", "//flutter/tools/fuchsia/dart:zircon", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.test.input", ] } diff --git a/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart b/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart index 9c657ff658f4e..e6f44387d8894 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/mouse-input/mouse-input-view/lib/mouse-input-view.dart @@ -6,8 +6,6 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:fidl_fuchsia_ui_test_input/fidl_async.dart' as test_mouse; -import 'package:fuchsia_services/services.dart'; import 'package:zircon/zircon.dart'; void main() { @@ -16,38 +14,6 @@ void main() { app.run(); } -List getPressedButtons(int buttons) { - var pressed_buttons = []; - if (buttons & 0x1 != 0) { - pressed_buttons.add(test_mouse.MouseButton.first); - } - if (buttons & (0x1 >> 1) != 0) { - pressed_buttons.add(test_mouse.MouseButton.second); - } - if (buttons & (0x1 >> 2) != 0) { - pressed_buttons.add(test_mouse.MouseButton.third); - } - - return pressed_buttons; -} - -test_mouse.MouseEventPhase getPhase(String event_type) { - switch (event_type) { - case 'add': - return test_mouse.MouseEventPhase.add; - case 'hover': - return test_mouse.MouseEventPhase.hover; - case 'down': - return test_mouse.MouseEventPhase.down; - case 'move': - return test_mouse.MouseEventPhase.move; - case 'up': - return test_mouse.MouseEventPhase.up; - default: - print('Invalid event type: ${event_type}'); - } -} - class MyApp { static const _red = Color.fromARGB(255, 244, 67, 54); static const _orange = Color.fromARGB(255, 255, 152, 0); @@ -67,11 +33,8 @@ class MyApp { // Each tap will increment the counter, we then determine what color to choose int _touchCounter = 0; - final _responseListener = test_mouse.MouseInputListenerProxy(); void run() { - Incoming.fromSvcPath() - ..connectToService(_responseListener); // Set up window callbacks. window.onPointerDataPacket = (PointerDataPacket packet) { this.pointerDataPacket(packet); @@ -122,28 +85,45 @@ class MyApp { _touchCounter++; } - // Incoming.fromSvcPath() - // ..connectToService(_responseListener) - // ..close(); - - _respond(test_mouse.MouseInputListenerReportMouseInputRequest( + _reportMouseInput( localX: data.physicalX, localY: data.physicalY, - buttons: getPressedButtons(data.buttons), - phase: getPhase(data.change.name), + buttons: data.buttons, + phase: data.change.name, timeReceived: nowNanos, wheelXPhysicalPixel: data.scrollDeltaX, wheelYPhysicalPixel: data.scrollDeltaY, - componentName: 'mouse-input-view', - )); + ); } } window.scheduleFrame(); } - void _respond(test_mouse.MouseInputListenerReportMouseInputRequest request) async { + void _reportMouseInput( + {double localX, + double localY, + int timeReceived, + int buttons, + String phase, + double wheelXPhysicalPixel, + double wheelYPhysicalPixel}) { print('mouse-input-view reporting mouse input to MouseInputListener'); - await _responseListener.reportMouseInput(request); + final message = utf8.encoder + .convert(json.encode({ + 'method': 'MouseInputListener.ReportMouseInput', + 'local_x': localX, + 'local_y': localY, + 'time_received': timeReceived, + 'component_name': 'touch-input-view', + 'buttons': buttons, + 'phase': 'asdf', + 'wheel_x_physical_pixel': wheelXPhysicalPixel, + 'wheel_y_physical_pixel': wheelYPhysicalPixel, + })) + .buffer + .asByteData(); + PlatformDispatcher.instance + .sendPlatformMessage('fuchsia/input_test', message, null); } } diff --git a/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/BUILD.gn b/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/BUILD.gn index 885874dc0c771..342c45e7808df 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/BUILD.gn +++ b/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/BUILD.gn @@ -12,12 +12,7 @@ dart_library("lib") { testonly = true package_name = "text-input-view" sources = [ "text_input_view.dart" ] - deps = [ - "//flutter/shell/platform/fuchsia/dart:args", - "//flutter/tools/fuchsia/dart:fuchsia_services", - "//flutter/tools/fuchsia/dart:zircon", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.test.input", - ] + deps = [ "//flutter/shell/platform/fuchsia/dart:args" ] } flutter_component("component") { diff --git a/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/lib/text_input_view.dart b/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/lib/text_input_view.dart index c460a309b6ae6..32aa2b77c93a3 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/lib/text_input_view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/text-input/text-input-view/lib/text_input_view.dart @@ -10,10 +10,6 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:fidl_fuchsia_ui_test_input/fidl_async.dart' as test_text; -import 'package:fuchsia_services/services.dart'; -import 'package:zircon/zircon.dart'; - // Corresponds to the USB HID values provided in fidl.fuchsia.input // https://fuchsia.dev/reference/fidl/fuchsia.input final Map hidToKey = { @@ -39,11 +35,7 @@ class TestApp { static const _yellow = Color.fromARGB(255, 255, 255, 0); Color _backgroundColor = _yellow; - final _responseListener = test_text.KeyboardInputListenerProxy(); - void run() { - // Connect to keyboard input response listener - Incoming.fromSvcPath().connectToService(_responseListener); // Set up window callbacks window.onPlatformMessage = (String name, ByteData data, PlatformMessageResponseCallback callback) { this.decodeAndReportPlatformMessage(name, data); @@ -89,17 +81,20 @@ class TestApp { if (name == "flutter/keyevent" && decodedJson["type"] == "keydown") { if (hidToKey[decodedJson["hidUsage"]] != null) { - await _respond(test_text.KeyboardInputListenerReportTextInputRequest( - text: hidToKey[decodedJson["hidUsage"]], - )); + _reportTextInput(hidToKey[decodedJson["hidUsage"]]); } } window.scheduleFrame(); } - void _respond(test_text.KeyboardInputListenerReportTextInputRequest request) async { + void _reportTextInput(String text) { print('text-input-view reporting keyboard input to KeyboardInputListener'); - await _responseListener.reportTextInput(request); + + final message = utf8.encoder.convert(json.encode({ + 'method': 'KeyboardInputListener.ReportTextInput', + 'text': text, + })).buffer.asByteData(); + PlatformDispatcher.instance.sendPlatformMessage('fuchsia/input_test', message, null); } } diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn index dda2ac7cc5808..8ae28f7fb615b 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn @@ -19,7 +19,6 @@ dart_library("lib") { "//flutter/tools/fuchsia/dart:zircon", "//flutter/tools/fuchsia/fidl:fuchsia.ui.app", "//flutter/tools/fuchsia/fidl:fuchsia.ui.scenic", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.test.input", "//flutter/tools/fuchsia/fidl:fuchsia.ui.views", ] } diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart index 950d931b87bba..f62dc9c9523ae 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart @@ -10,7 +10,6 @@ import 'dart:ui'; import 'package:args/args.dart'; import 'package:fidl_fuchsia_ui_app/fidl_async.dart'; import 'package:fidl_fuchsia_ui_views/fidl_async.dart'; -import 'package:fidl_fuchsia_ui_test_input/fidl_async.dart' as test_touch; import 'package:fuchsia_services/services.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math_64; import 'package:zircon/zircon.dart'; @@ -50,7 +49,6 @@ class TestApp { final bool showOverlay; final bool hitTestable; final bool focusable; - final _responseListener = test_touch.TouchInputListenerProxy(); Color _backgroundColor = _blue; @@ -159,25 +157,27 @@ class TestApp { } if (data.change == PointerChange.down || data.change == PointerChange.move) { - Incoming.fromSvcPath() - ..connectToService(_responseListener) - ..close(); - - _respond(test_touch.TouchInputListenerReportTouchInputRequest( + _reportTouchInput( localX: data.physicalX, localY: data.physicalY, timeReceived: nowNanos, - componentName: 'embedding-flutter-view', - )); + ); } } window.scheduleFrame(); } - void _respond(test_touch.TouchInputListenerReportTouchInputRequest request) async { + void _reportTouchInput({double localX, double localY, int timeReceived}) { print('embedding-flutter-view reporting touch input to TouchInputListener'); - await _responseListener.reportTouchInput(request); + final message = utf8.encoder.convert(json.encode({ + 'method': 'TouchInputListener.ReportTouchInput', + 'local_x': localX, + 'local_y': localY, + 'time_received': timeReceived, + 'component_name': 'embedding-flutter-view', + })).buffer.asByteData(); + PlatformDispatcher.instance.sendPlatformMessage('fuchsia/input_test', message, null); } } diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn b/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn index bbaf6ca65fc5a..6e5c378ae1942 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/BUILD.gn @@ -14,9 +14,7 @@ dart_library("lib") { deps = [ "//flutter/shell/platform/fuchsia/dart:args", - "//flutter/tools/fuchsia/dart:fuchsia_services", "//flutter/tools/fuchsia/dart:zircon", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.test.input", ] } diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart b/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart index b3b9d514061cf..687d318d0e8c9 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/touch-input-view/lib/touch-input-view.dart @@ -6,8 +6,6 @@ import 'dart:convert'; import 'dart:typed_data'; import 'dart:ui'; -import 'package:fidl_fuchsia_ui_test_input/fidl_async.dart' as test_touch; -import 'package:fuchsia_services/services.dart'; import 'package:zircon/zircon.dart'; void main() { @@ -22,8 +20,6 @@ class TestApp { Color _backgroundColor = _pink; - final _responseListener = test_touch.TouchInputListenerProxy(); - void run() { // Set up window callbacks. window.onPointerDataPacket = (PointerDataPacket packet) { @@ -74,24 +70,26 @@ class TestApp { } if (data.change == PointerChange.down || data.change == PointerChange.move) { - Incoming.fromSvcPath() - ..connectToService(_responseListener) - ..close(); - - _respond(test_touch.TouchInputListenerReportTouchInputRequest( + _reportTouchInput( localX: data.physicalX, localY: data.physicalY, timeReceived: nowNanos, - componentName: 'touch-input-view', - )); + ); } } window.scheduleFrame(); } - void _respond(test_touch.TouchInputListenerReportTouchInputRequest request) async { + void _reportTouchInput({double localX, double localY, int timeReceived}) { print('touch-input-view reporting touch input to TouchInputListener'); - await _responseListener.reportTouchInput(request); + final message = utf8.encoder.convert(json.encode({ + 'method': 'TouchInputListener.ReportTouchInput', + 'local_x': localX, + 'local_y': localY, + 'time_received': timeReceived, + 'component_name': 'touch-input-view', + })).buffer.asByteData(); + PlatformDispatcher.instance.sendPlatformMessage('fuchsia/input_test', message, null); } } From 4e73606678dbd8098d6feaf2c98eb53109c08b4d Mon Sep 17 00:00:00 2001 From: Ian McKellar Date: Wed, 3 May 2023 18:52:12 +0000 Subject: [PATCH 3/4] update 41669 This addresses some earlier comments plus removes fuchsia.ui.app and fuchsia.ui.views. --- .../embedder/script_runner_snapshot.dart | 31 --- .../fuchsia/flutter/flatland_platform_view.cc | 4 +- .../fuchsia/flutter/flatland_platform_view.h | 2 +- .../fuchsia/flutter/gfx_platform_view.cc | 4 +- .../fuchsia/flutter/gfx_platform_view.h | 2 +- .../platform/fuchsia/flutter/platform_view.cc | 207 +++++++++++++----- .../platform/fuchsia/flutter/platform_view.h | 9 +- .../fuchsia/flutter/platform_view_unittest.cc | 3 +- .../embedder/parent-view/lib/parent_view.dart | 179 ++++++--------- .../embedding-flutter-view/BUILD.gn | 4 - .../lib/embedding-flutter-view.dart | 46 ++-- 11 files changed, 250 insertions(+), 241 deletions(-) delete mode 100644 shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart diff --git a/shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart b/shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart deleted file mode 100644 index 39c0b98a0edb9..0000000000000 --- a/shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Core SDK libraries. -import 'dart:async'; -import 'dart:core'; -import 'dart:collection'; -import 'dart:convert'; -import 'dart:io'; -import 'dart:isolate'; -import 'dart:math'; -import 'dart:fuchsia.builtin'; -import 'dart:zircon'; -import 'dart:fuchsia'; -import 'dart:typed_data'; - -// If new imports are added to this list, then it is also necessary to ensure -// that the dart_deps parameter in the rule -// gen_snapshot_cc("script_runner_snapshot") in the BUILD.gn file in this -// directory is updated with any new dependencies. - -import 'package:fuchsia/fuchsia.dart'; -import 'package:zircon/zircon.dart'; - -// FIDL bindings and application libraries. -import 'package:lib.app.dart/app.dart'; -import 'package:fidl/fidl.dart'; - -// From //sdk/fidl/fuchsia.modular -import 'package:fidl_fuchsia_modular/fidl_async.dart'; diff --git a/shell/platform/fuchsia/flutter/flatland_platform_view.cc b/shell/platform/fuchsia/flutter/flatland_platform_view.cc index d6e6721c36fc1..62207e8484199 100644 --- a/shell/platform/fuchsia/flutter/flatland_platform_view.cc +++ b/shell/platform/fuchsia/flutter/flatland_platform_view.cc @@ -33,7 +33,7 @@ FlatlandPlatformView::FlatlandPlatformView( AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc) + std::shared_ptr dart_application_svc) : PlatformView(true /* is_flatland */, delegate, std::move(task_runners), @@ -54,7 +54,7 @@ FlatlandPlatformView::FlatlandPlatformView( std::move(on_shader_warmup), std::move(await_vsync_callback), std::move(await_vsync_for_secondary_callback_callback), - std::move(svc)), + std::move(dart_application_svc)), parent_viewport_watcher_(parent_viewport_watcher.Bind()), on_create_view_callback_(std::move(on_create_view_callback)), on_destroy_view_callback_(std::move(on_destroy_view_callback)), diff --git a/shell/platform/fuchsia/flutter/flatland_platform_view.h b/shell/platform/fuchsia/flutter/flatland_platform_view.h index ed95aa042c5a5..8e839c9b1eee4 100644 --- a/shell/platform/fuchsia/flutter/flatland_platform_view.h +++ b/shell/platform/fuchsia/flutter/flatland_platform_view.h @@ -47,7 +47,7 @@ class FlatlandPlatformView final : public flutter_runner::PlatformView { AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc); + std::shared_ptr dart_application_svc); ~FlatlandPlatformView() override; void OnGetLayout(fuchsia::ui::composition::LayoutInfo info); diff --git a/shell/platform/fuchsia/flutter/gfx_platform_view.cc b/shell/platform/fuchsia/flutter/gfx_platform_view.cc index d28b83e60f8c0..7b6fe6d17f209 100644 --- a/shell/platform/fuchsia/flutter/gfx_platform_view.cc +++ b/shell/platform/fuchsia/flutter/gfx_platform_view.cc @@ -34,7 +34,7 @@ GfxPlatformView::GfxPlatformView( AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc) + std::shared_ptr dart_application_svc) : PlatformView(false /* is_flatland */, delegate, std::move(task_runners), @@ -55,7 +55,7 @@ GfxPlatformView::GfxPlatformView( std::move(on_shader_warmup), std::move(await_vsync_callback), std::move(await_vsync_for_secondary_callback_callback), - std::move(svc)), + std::move(dart_application_svc)), session_listener_binding_(this, std::move(session_listener_request)), session_listener_error_callback_( std::move(on_session_listener_error_callback)), diff --git a/shell/platform/fuchsia/flutter/gfx_platform_view.h b/shell/platform/fuchsia/flutter/gfx_platform_view.h index 0d34c1e61d627..2e92a41f0aad6 100644 --- a/shell/platform/fuchsia/flutter/gfx_platform_view.h +++ b/shell/platform/fuchsia/flutter/gfx_platform_view.h @@ -51,7 +51,7 @@ class GfxPlatformView final : public flutter_runner::PlatformView, AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc); + std::shared_ptr dart_application_svc); ~GfxPlatformView() override; diff --git a/shell/platform/fuchsia/flutter/platform_view.cc b/shell/platform/fuchsia/flutter/platform_view.cc index 112278f1c7463..05658820c9166 100644 --- a/shell/platform/fuchsia/flutter/platform_view.cc +++ b/shell/platform/fuchsia/flutter/platform_view.cc @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include -#include "flow/embedded_views.h" -#include "pointer_injector_delegate.h" #define RAPIDJSON_HAS_STDSTRING 1 #include "platform_view.h" +#include +#include + #include #include #include @@ -25,10 +25,27 @@ #include "third_party/rapidjson/include/rapidjson/writer.h" #include "logging.h" +#include "pointer_injector_delegate.h" #include "runtime/dart/utils/inlines.h" #include "text_delegate.h" #include "vsync_waiter.h" +namespace { +// Helper to extract a given member with a given type from a rapidjson object. +template +bool CallWithMember(O obj, const char* member_name, F func) { + auto it = obj.FindMember(member_name); + if (it == obj.MemberEnd()) { + return false; + } + if (!it->value.template Is()) { + return false; + } + func(it->value.template Get()); + return true; +} +} // namespace + namespace flutter_runner { static constexpr char kFlutterPlatformChannel[] = "flutter/platform"; @@ -36,6 +53,7 @@ static constexpr char kAccessibilityChannel[] = "flutter/accessibility"; static constexpr char kFlutterPlatformViewsChannel[] = "flutter/platform_views"; static constexpr char kFuchsiaShaderWarmupChannel[] = "fuchsia/shader_warmup"; static constexpr char kFuchsiaInputTestChannel[] = "fuchsia/input_test"; +static constexpr char kFuchsiaChildViewChannel[] = "fuchsia/child_view"; PlatformView::PlatformView( bool is_flatland, @@ -59,7 +77,7 @@ PlatformView::PlatformView( AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc) + std::shared_ptr dart_application_svc) : flutter::PlatformView(delegate, std::move(task_runners)), external_view_embedder_(external_view_embedder), focus_delegate_( @@ -78,6 +96,7 @@ PlatformView::PlatformView( await_vsync_callback_(await_vsync_callback), await_vsync_for_secondary_callback_callback_( await_vsync_for_secondary_callback_callback), + dart_application_svc_(dart_application_svc), weak_factory_(this) { fuchsia::ui::views::ViewRef view_ref_clone; fidl::Clone(view_ref, &view_ref_clone); @@ -143,12 +162,14 @@ PlatformView::PlatformView( std::move(pointerinjector_registry), std::move(view_ref_clone), is_flatland); - if (svc) { + // This is only used by the integration tests. + if (dart_application_svc) { // Connect to TouchInputListener fuchsia::ui::test::input::TouchInputListenerHandle touch_input_listener; zx_status_t touch_input_listener_status = - svc->Connect( - touch_input_listener.NewRequest()); + dart_application_svc + ->Connect( + touch_input_listener.NewRequest()); if (touch_input_listener_status != ZX_OK) { FML_LOG(WARNING) << "fuchsia::ui::test::input::TouchInputListener connection failed: " @@ -161,8 +182,9 @@ PlatformView::PlatformView( fuchsia::ui::test::input::KeyboardInputListenerHandle keyboard_input_listener; zx_status_t keyboard_input_listener_status = - svc->Connect( - keyboard_input_listener.NewRequest()); + dart_application_svc + ->Connect( + keyboard_input_listener.NewRequest()); if (keyboard_input_listener_status != ZX_OK) { FML_LOG(WARNING) << "fuchsia::ui::test::input::KeyboardInputListener " "connection failed: " @@ -173,8 +195,9 @@ PlatformView::PlatformView( // Connect to MouseInputListener fuchsia::ui::test::input::MouseInputListenerHandle mouse_input_listener; zx_status_t mouse_input_listener_status = - svc->Connect( - mouse_input_listener.NewRequest()); + dart_application_svc + ->Connect( + mouse_input_listener.NewRequest()); if (mouse_input_listener_status != ZX_OK) { FML_LOG(WARNING) << "fuchsia::ui::test::input::MouseInputListener connection failed: " @@ -209,6 +232,9 @@ void PlatformView::RegisterPlatformMessageHandlers() { platform_message_handlers_[kFuchsiaInputTestChannel] = std::bind(&PlatformView::HandleFuchsiaInputTestChannelPlatformMessage, this, std::placeholders::_1); + platform_message_handlers_[kFuchsiaChildViewChannel] = + std::bind(&PlatformView::HandleFuchsiaChildViewChannelPlatformMessage, + this, std::placeholders::_1); } static flutter::PointerData::Change GetChangeFromPointerEventPhase( @@ -720,21 +746,6 @@ bool PlatformView::HandleFuchsiaShaderWarmupChannelPlatformMessage( return true; } -namespace { -template -bool WithMember(O obj, const char* member_name, F func) { - auto it = obj.FindMember(member_name); - if (it == obj.MemberEnd()) { - return false; - } - if (!it->value.template Is()) { - return false; - } - func(it->value.template Get()); - return true; -} -} // namespace - // Channel handler for kFuchsiaInputTestChannel bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( std::unique_ptr message) { @@ -764,17 +775,17 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( } fuchsia::ui::test::input::TouchInputListenerReportTouchInputRequest request; - WithMember(root, "local_x", - [&](double local_x) { request.set_local_x(local_x); }); - WithMember(root, "local_y", - [&](double local_y) { request.set_local_y(local_y); }); - WithMember(root, "time_received", [&](uint64_t time_received) { + CallWithMember( + root, "local_x", [&](double local_x) { request.set_local_x(local_x); }); + CallWithMember( + root, "local_y", [&](double local_y) { request.set_local_y(local_y); }); + CallWithMember(root, "time_received", [&](uint64_t time_received) { request.set_time_received(time_received); }); - WithMember(root, "component_name", - [&](std::string component_name) { - request.set_component_name(component_name); - }); + CallWithMember(root, "component_name", + [&](std::string component_name) { + request.set_component_name(component_name); + }); touch_input_listener_->ReportTouchInput(std::move(request)); return true; @@ -788,8 +799,8 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( fuchsia::ui::test::input::KeyboardInputListenerReportTextInputRequest request; - WithMember(root, "text", - [&](std::string text) { request.set_text(text); }); + CallWithMember( + root, "text", [&](std::string text) { request.set_text(text); }); keyboard_input_listener_->ReportTextInput(std::move(request)); return true; @@ -802,18 +813,18 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( } fuchsia::ui::test::input::MouseInputListenerReportMouseInputRequest request; - WithMember(root, "local_x", - [&](double local_x) { request.set_local_x(local_x); }); - WithMember(root, "local_y", - [&](double local_y) { request.set_local_y(local_y); }); - WithMember(root, "time_received", [&](uint64_t time_received) { + CallWithMember( + root, "local_x", [&](double local_x) { request.set_local_x(local_x); }); + CallWithMember( + root, "local_y", [&](double local_y) { request.set_local_y(local_y); }); + CallWithMember(root, "time_received", [&](uint64_t time_received) { request.set_time_received(time_received); }); - WithMember(root, "component_name", - [&](std::string component_name) { - request.set_component_name(component_name); - }); - WithMember(root, "buttons", [&](int button_mask) { + CallWithMember(root, "component_name", + [&](std::string component_name) { + request.set_component_name(component_name); + }); + CallWithMember(root, "buttons", [&](int button_mask) { std::vector buttons; if (button_mask & 1) { buttons.push_back(fuchsia::ui::test::input::MouseButton::FIRST); @@ -826,7 +837,7 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( } request.set_buttons(buttons); }); - WithMember(root, "phase", [&](std::string phase) { + CallWithMember(root, "phase", [&](std::string phase) { if (phase == "add") { request.set_phase(fuchsia::ui::test::input::MouseEventPhase::ADD); } else if (phase == "hover") { @@ -841,11 +852,11 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( FML_LOG(ERROR) << "Unexpected mouse phase: " << phase; } }); - WithMember( + CallWithMember( root, "wheel_x_physical_pixel", [&](double wheel_x_physical_pixel) { request.set_wheel_x_physical_pixel(wheel_x_physical_pixel); }); - WithMember( + CallWithMember( root, "wheel_y_physical_pixel", [&](double wheel_y_physical_pixel) { request.set_wheel_y_physical_pixel(wheel_y_physical_pixel); }); @@ -859,4 +870,100 @@ bool PlatformView::HandleFuchsiaInputTestChannelPlatformMessage( return false; } +// Channel handler for kFuchsiaChildViewChannel +bool PlatformView::HandleFuchsiaChildViewChannelPlatformMessage( + std::unique_ptr message) { + FML_DCHECK(message->channel() == kFuchsiaChildViewChannel); + + if (message->data().GetSize() != 1 || + (message->data().GetMapping()[0] != '0' && + message->data().GetMapping()[0] != '1')) { + FML_LOG(ERROR) << kFuchsiaChildViewChannel + << " data must be '0' (for gfx) or '1' (for flatland)."; + return false; + } + + bool flatland = message->data().GetMapping()[0] == '1'; + + if (!message->response()) { + FML_LOG(ERROR) << kFuchsiaChildViewChannel + << " must have a response callback."; + return false; + } + + if (!dart_application_svc_) { + FML_LOG(ERROR) << "No service directory."; + return false; + } + + fuchsia::ui::app::ViewProviderHandle view_provider_handle; + zx_status_t status = + dart_application_svc_->Connect(view_provider_handle.NewRequest()); + if (status != ZX_OK) { + FML_LOG(ERROR) << "Failed to connect to view provider."; + return false; + } + fuchsia::ui::app::ViewProviderPtr view_provider; + view_provider.Bind(std::move(view_provider_handle)); + + zx::handle view_id; + + if (flatland) { + zx::channel view_tokens[2]; + fuchsia::ui::views::ViewportCreationToken viewport_creation_token; + fuchsia::ui::views::ViewCreationToken view_creation_token; + status = zx::channel::create(0, &viewport_creation_token.value, + &view_creation_token.value); + if (status != ZX_OK) { + FML_LOG(ERROR) << "Creating view tokens: " + << zx_status_get_string(status); + return false; + } + + fuchsia::ui::app::CreateView2Args create_view_args; + create_view_args.set_view_creation_token(std::move(view_creation_token)); + view_provider->CreateView2(std::move(create_view_args)); + + view_id = std::move(viewport_creation_token.value); + } else { + zx::eventpair view_tokens[2]; + status = zx::eventpair::create(0, &view_tokens[0], &view_tokens[1]); + if (status != ZX_OK) { + FML_LOG(ERROR) << "Creating view tokens: " + << zx_status_get_string(status); + return false; + } + fuchsia::ui::views::ViewHolderToken view_holder_token; + view_holder_token.value = std::move(view_tokens[0]); + + zx::eventpair view_refs[2]; + status = zx::eventpair::create(0, &view_refs[0], &view_refs[1]); + if (status != ZX_OK) { + FML_LOG(ERROR) << "Creating view refs: " << zx_status_get_string(status); + return false; + } + fuchsia::ui::views::ViewRefControl view_ref_control; + view_refs[0].duplicate(ZX_DEFAULT_EVENTPAIR_RIGHTS & ~ZX_RIGHT_DUPLICATE, + &view_ref_control.reference); + fuchsia::ui::views::ViewRef view_ref; + view_refs[1].duplicate(ZX_RIGHTS_BASIC, &view_ref.reference); + + view_provider->CreateViewWithViewRef(std::move(view_tokens[1]), + std::move(view_ref_control), + std::move(view_ref)); + + view_id = std::move(view_holder_token.value); + } + + if (view_id) { + message->response()->Complete( + std::make_unique(std::to_string(view_id.release()) + + )); + return true; + } else { + return false; + } +} + } // namespace flutter_runner diff --git a/shell/platform/fuchsia/flutter/platform_view.h b/shell/platform/fuchsia/flutter/platform_view.h index bb8d275ba5244..724780dde7e2c 100644 --- a/shell/platform/fuchsia/flutter/platform_view.h +++ b/shell/platform/fuchsia/flutter/platform_view.h @@ -86,7 +86,7 @@ class PlatformView : public flutter::PlatformView { AwaitVsyncCallback await_vsync_callback, AwaitVsyncForSecondaryCallbackCallback await_vsync_for_secondary_callback_callback, - std::shared_ptr svc); + std::shared_ptr dart_application_svc); ~PlatformView() override; @@ -142,6 +142,10 @@ class PlatformView : public flutter::PlatformView { bool HandleFuchsiaInputTestChannelPlatformMessage( std::unique_ptr message); + // Channel handler for kFuchsiaChildViewChannel. + bool HandleFuchsiaChildViewChannelPlatformMessage( + std::unique_ptr message); + virtual void OnCreateView(ViewCallback on_view_created, int64_t view_id_raw, bool hit_testable, @@ -197,6 +201,9 @@ class PlatformView : public flutter::PlatformView { fuchsia::ui::test::input::KeyboardInputListenerPtr keyboard_input_listener_; fuchsia::ui::test::input::MouseInputListenerPtr mouse_input_listener_; + // Component's service directory. + std::shared_ptr dart_application_svc_; + fml::WeakPtrFactory weak_factory_; // Must be the last member. FML_DISALLOW_COPY_AND_ASSIGN(PlatformView); diff --git a/shell/platform/fuchsia/flutter/platform_view_unittest.cc b/shell/platform/fuchsia/flutter/platform_view_unittest.cc index 624ad33b51699..e966cd350ef03 100644 --- a/shell/platform/fuchsia/flutter/platform_view_unittest.cc +++ b/shell/platform/fuchsia/flutter/platform_view_unittest.cc @@ -331,7 +331,8 @@ class PlatformViewBuilder { std::move(on_create_surface_callback_), std::move(on_semantics_node_update_callback_), std::move(on_request_announce_callback_), - std::move(on_shader_warmup_callback_), [](auto...) {}, [](auto...) {}); + std::move(on_shader_warmup_callback_), [](auto...) {}, [](auto...) {}, + nullptr); } private: diff --git a/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart b/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart index 93ab0c585fd57..e64427a8a873a 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/embedder/parent-view/lib/parent_view.dart @@ -2,21 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:convert'; import 'dart:typed_data'; import 'dart:io'; import 'dart:ui'; import 'package:args/args.dart'; -import 'package:fidl_fuchsia_ui_app/fidl_async.dart'; -import 'package:fidl_fuchsia_ui_views/fidl_async.dart'; -import 'package:fuchsia_services/services.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math_64; import 'package:zircon/zircon.dart'; final _argsCsvFilePath = '/config/data/args.csv'; -void main(List args) { +void main(List args) async { print('parent-view: starting'); args = args + _GetArgsFromConfigFile(); @@ -32,21 +30,12 @@ void main(List args) { TestApp app; final useFlatland = arguments['useFlatland']; - if (useFlatland) { - app = TestApp( - ChildView(_launchFlatlandChildView()), - showOverlay: arguments['showOverlay'], - hitTestable: arguments['hitTestable'], - focusable: arguments['focusable'], - ); - } else { - app = TestApp( - ChildView.gfx(_launchGfxChildView()), - showOverlay: arguments['showOverlay'], - hitTestable: arguments['hitTestable'], - focusable: arguments['focusable'], - ); - } + app = TestApp( + ChildView(await _launchChildView(useFlatland)), + showOverlay: arguments['showOverlay'], + hitTestable: arguments['hitTestable'], + focusable: arguments['focusable'], + ); app.run(); } @@ -62,35 +51,33 @@ class TestApp { Color _backgroundColor = _blue; - TestApp( - this.childView, - {this.showOverlay = false, - this.hitTestable = true, - this.focusable = true}) { - } + TestApp(this.childView, + {this.showOverlay = false, + this.hitTestable = true, + this.focusable = true}) {} void run() { childView.create(hitTestable, focusable, (ByteData reply) { - // Set up window allbacks. - window.onPointerDataPacket = (PointerDataPacket packet) { - for (final data in packet.data) { - if (data.change == PointerChange.down) { - this._backgroundColor = _black; - } + // Set up window allbacks. + window.onPointerDataPacket = (PointerDataPacket packet) { + for (final data in packet.data) { + if (data.change == PointerChange.down) { + this._backgroundColor = _black; } - window.scheduleFrame(); - }; - window.onMetricsChanged = () { - window.scheduleFrame(); - }; - window.onBeginFrame = (Duration duration) { - this.beginFrame(duration); - }; - - // The child view should be attached to Scenic now. - // Ready to build the scene. + } window.scheduleFrame(); - }); + }; + window.onMetricsChanged = () { + window.scheduleFrame(); + }; + window.onBeginFrame = (Duration duration) { + this.beginFrame(duration); + }; + + // The child view should be attached to Scenic now. + // Ready to build the scene. + window.scheduleFrame(); + }); } void beginFrame(Duration duration) { @@ -114,18 +101,16 @@ class TestApp { // Alignment.center final windowCenter = windowSize.center(Offset.zero); final windowPhysicalCenter = window.physicalSize.center(Offset.zero); - final childPhysicalOffset = windowPhysicalCenter - childPhysicalSize.center(Offset.zero); + final childPhysicalOffset = + windowPhysicalCenter - childPhysicalSize.center(Offset.zero); sceneBuilder - ..pushTransform( - vector_math_64.Matrix4.translationValues(childPhysicalOffset.dx, - childPhysicalOffset.dy, - 0.0).storage) + ..pushTransform(vector_math_64.Matrix4.translationValues( + childPhysicalOffset.dx, childPhysicalOffset.dy, 0.0) + .storage) ..addPlatformView(childView.viewId, - width: childPhysicalSize.width, - height: childPhysicalSize.height) - ..pop() - ; + width: childPhysicalSize.width, height: childPhysicalSize.height) + ..pop(); if (showOverlay) { final containerSize = windowSize * .66; @@ -135,15 +120,16 @@ class TestApp { final overlaySize = containerSize * 0.5; // Alignment.topRight final overlayOffset = Offset( - containerOffset.dx + containerSize.width - overlaySize.width, - containerOffset.dy); + containerOffset.dx + containerSize.width - overlaySize.width, + containerOffset.dy); final overlayPhysicalSize = overlaySize * pixelRatio; final overlayPhysicalOffset = overlayOffset * pixelRatio; final overlayPhysicalBounds = overlayPhysicalOffset & overlayPhysicalSize; final recorder = PictureRecorder(); - final overlayCullRect = Offset.zero & overlayPhysicalSize; // in canvas physical coordinates + final overlayCullRect = + Offset.zero & overlayPhysicalSize; // in canvas physical coordinates final canvas = Canvas(recorder, overlayCullRect); canvas.scale(pixelRatio); final paint = Paint()..color = Color.fromARGB(255, 0, 255, 0); @@ -152,8 +138,7 @@ class TestApp { sceneBuilder ..pushClipRect(overlayPhysicalBounds) // in window physical coordinates ..addPicture(overlayPhysicalOffset, overlayPicture) - ..pop() - ; + ..pop(); } sceneBuilder.pop(); @@ -162,22 +147,12 @@ class TestApp { } class ChildView { - final ViewHolderToken viewHolderToken; - final ViewportCreationToken viewportCreationToken; final int viewId; - ChildView(this.viewportCreationToken) : viewHolderToken = null, viewId = viewportCreationToken.value.handle.handle { - assert(viewId != null); - } + ChildView(this.viewId); - ChildView.gfx(this.viewHolderToken) : viewportCreationToken = null, viewId = viewHolderToken.value.handle.handle { - assert(viewId != null); - } - - void create( - bool hitTestable, - bool focusable, - PlatformMessageResponseCallback callback) { + void create(bool hitTestable, bool focusable, + PlatformMessageResponseCallback callback) { // Construct the dart:ui platform message to create the view, and when the // return callback is invoked, build the scene. At that point, it is safe // to embed the child-view2 in the scene. @@ -195,59 +170,31 @@ class ChildView { ], }; - final ByteData createViewMessage = utf8.encoder.convert( - json.encode({ - 'method': 'View.create', - 'args': args, - }) - ).buffer.asByteData(); + final ByteData createViewMessage = utf8.encoder + .convert(json.encode({ + 'method': 'View.create', + 'args': args, + })) + .buffer + .asByteData(); final platformViewsChannel = 'flutter/platform_views'; - PlatformDispatcher.instance.sendPlatformMessage( - platformViewsChannel, - createViewMessage, - callback); + PlatformDispatcher.instance + .sendPlatformMessage(platformViewsChannel, createViewMessage, callback); } } -ViewportCreationToken _launchFlatlandChildView() { - ViewProviderProxy viewProvider = ViewProviderProxy(); - Incoming.fromSvcPath() - ..connectToService(viewProvider) - ..close(); - - final viewTokens = ChannelPair(); - assert(viewTokens.status == ZX.OK); - final viewportCreationToken = ViewportCreationToken(value: viewTokens.first); - final viewCreationToken = ViewCreationToken(value: viewTokens.second); - - final createViewArgs = CreateView2Args(viewCreationToken: viewCreationToken); - viewProvider.createView2(createViewArgs); - viewProvider.ctrl.close(); - - return viewportCreationToken; -} - -ViewHolderToken _launchGfxChildView() { - ViewProviderProxy viewProvider = ViewProviderProxy(); - Incoming.fromSvcPath() - ..connectToService(viewProvider) - ..close(); - - final viewTokens = EventPairPair(); - assert(viewTokens.status == ZX.OK); - final viewHolderToken = ViewHolderToken(value: viewTokens.first); - - final viewRefs = EventPairPair(); - assert(viewRefs.status == ZX.OK); - final viewRefControl = ViewRefControl(reference: viewRefs.first.duplicate(ZX.DEFAULT_EVENTPAIR_RIGHTS & ~ZX.RIGHT_DUPLICATE)); - final viewRef = ViewRef(reference: viewRefs.second.duplicate(ZX.RIGHTS_BASIC)); - - viewProvider.createViewWithViewRef(viewTokens.second, viewRefControl, viewRef); - viewProvider.ctrl.close(); +Future _launchChildView(bool useFlatland) async { + final message = Int8List.fromList([useFlatland ? 0x31 : 0x30]); + final completer = new Completer(); + PlatformDispatcher.instance.sendPlatformMessage( + 'fuchsia/child_view', ByteData.sublistView(message), (ByteData reply) { + completer.complete(reply); + }); - return viewHolderToken; + return int.parse( + ascii.decode(((await completer.future).buffer.asUint8List()))); } List _GetArgsFromConfigFile() { diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn index 8ae28f7fb615b..31f9cf378fde6 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/BUILD.gn @@ -15,11 +15,7 @@ dart_library("lib") { deps = [ "//flutter/shell/platform/fuchsia/dart:args", "//flutter/shell/platform/fuchsia/dart:vector_math", - "//flutter/tools/fuchsia/dart:fuchsia_services", "//flutter/tools/fuchsia/dart:zircon", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.app", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.scenic", - "//flutter/tools/fuchsia/fidl:fuchsia.ui.views", ] } diff --git a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart index f62dc9c9523ae..100ebfa9ec4d9 100644 --- a/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart +++ b/shell/platform/fuchsia/flutter/tests/integration/touch-input/embedding-flutter-view/lib/embedding-flutter-view.dart @@ -2,21 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:async'; import 'dart:convert'; import 'dart:typed_data'; import 'dart:io'; import 'dart:ui'; import 'package:args/args.dart'; -import 'package:fidl_fuchsia_ui_app/fidl_async.dart'; -import 'package:fidl_fuchsia_ui_views/fidl_async.dart'; -import 'package:fuchsia_services/services.dart'; import 'package:vector_math/vector_math_64.dart' as vector_math_64; import 'package:zircon/zircon.dart'; final _argsCsvFilePath = '/config/data/args.csv'; -void main(List args) { +void main(List args) async { print('Launching embedding-flutter-view'); args = args + _GetArgsFromConfigFile(); @@ -32,7 +30,7 @@ void main(List args) { // TODO(fxbug.dev/125514): Support Flatland Child View. TestApp app = TestApp( - ChildView.gfx(_launchGfxChildView()), + ChildView(await _launchChildView(false)), showOverlay: arguments['showOverlay'], hitTestable: arguments['hitTestable'], focusable: arguments['focusable'], @@ -182,17 +180,9 @@ class TestApp { } class ChildView { - final ViewHolderToken viewHolderToken; - final ViewportCreationToken viewportCreationToken; final int viewId; - ChildView(this.viewportCreationToken) : viewHolderToken = null, viewId = viewportCreationToken.value.handle.handle { - assert(viewId != null); - } - - ChildView.gfx(this.viewHolderToken) : viewportCreationToken = null, viewId = viewHolderToken.value.handle.handle { - assert(viewId != null); - } + ChildView(this.viewId); void create( bool hitTestable, @@ -230,27 +220,19 @@ class ChildView { } } -ViewHolderToken _launchGfxChildView() { - ViewProviderProxy viewProvider = ViewProviderProxy(); - Incoming.fromSvcPath() - ..connectToService(viewProvider) - ..close(); - - final viewTokens = EventPairPair(); - assert(viewTokens.status == ZX.OK); - final viewHolderToken = ViewHolderToken(value: viewTokens.first); +Future _launchChildView(bool useFlatland) async { + final message = Int8List.fromList([useFlatland ? 0x31 : 0x30]); + final completer = new Completer(); + PlatformDispatcher.instance.sendPlatformMessage( + 'fuchsia/child_view', ByteData.sublistView(message), (ByteData reply) { + completer.complete(reply); + }); - final viewRefs = EventPairPair(); - assert(viewRefs.status == ZX.OK); - final viewRefControl = ViewRefControl(reference: viewRefs.first.duplicate(ZX.DEFAULT_EVENTPAIR_RIGHTS & ~ZX.RIGHT_DUPLICATE)); - final viewRef = ViewRef(reference: viewRefs.second.duplicate(ZX.RIGHTS_BASIC)); - - viewProvider.createViewWithViewRef(viewTokens.second, viewRefControl, viewRef); - viewProvider.ctrl.close(); - - return viewHolderToken; + return int.parse( + ascii.decode(((await completer.future).buffer.asUint8List()))); } + List _GetArgsFromConfigFile() { List args; final f = File(_argsCsvFilePath); From 2863c2614a1adaa4a0473c0cfb16ff8c599de6ad Mon Sep 17 00:00:00 2001 From: Ian McKellar Date: Fri, 5 May 2023 16:19:51 +0000 Subject: [PATCH 4/4] Remove script_runner_snapshot from licenses_flutter --- ci/licenses_golden/licenses_flutter | 2 -- 1 file changed, 2 deletions(-) diff --git a/ci/licenses_golden/licenses_flutter b/ci/licenses_golden/licenses_flutter index 6631d202a9824..bf99718eaaf71 100644 --- a/ci/licenses_golden/licenses_flutter +++ b/ci/licenses_golden/licenses_flutter @@ -2793,7 +2793,6 @@ ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_runner.h + ../. ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_test_component_controller.cc + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_test_component_controller.h + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart + ../../../flutter/LICENSE -ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/shim.dart + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.cc.tmpl + ../../../flutter/LICENSE ORIGIN: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.dart + ../../../flutter/LICENSE @@ -5410,7 +5409,6 @@ FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_runner.h FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_test_component_controller.cc FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/dart_test_component_controller.h FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/builtin.dart -FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/script_runner_snapshot.dart FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/shim.dart FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.cc.tmpl FILE: ../../../flutter/shell/platform/fuchsia/dart_runner/embedder/snapshot.dart