From eda5bd2614b1cdd4a99b3f31f247bdb1d4c50432 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 14 Mar 2024 18:03:34 -0700 Subject: [PATCH 1/4] Impl --- .../macos/framework/Source/FlutterEngine.mm | 12 ++--- .../framework/Source/FlutterEngineTest.mm | 51 ++++++++++++++++++- .../Source/fixtures/flutter_desktop_test.dart | 4 ++ 3 files changed, 57 insertions(+), 10 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index 56419b18a661c..f354a23675952 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -847,15 +847,9 @@ - (FlutterCompositor*)createFlutterCompositor { void* user_data // ) { return true; }; - _compositor.present_layers_callback = [](const FlutterLayer** layers, // - size_t layers_count, // - void* user_data // - ) { - // TODO(dkwingsmt): This callback only supports single-view, therefore it - // only operates on the implicit view. To support multi-view, we need a new - // callback that also receives a view ID. - return reinterpret_cast(user_data)->Present(kFlutterImplicitViewId, - layers, layers_count); + _compositor.present_view_callback = [](const FlutterPresentViewInfo* info) { + return reinterpret_cast(info->user_data) + ->Present(info->view_id, info->layers, info->layers_count); }; _compositor.avoid_backing_store_cache = true; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm index 209903d8fa549..2685530bd35f6 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm @@ -535,7 +535,56 @@ @implementation MockableFlutterEngine // TODO(gw280): add support for screenshot tests in this test harness [engine shutDownEngine]; -} // namespace flutter::testing +} + +TEST_F(FlutterEngineTest, CompositorIgnoresUnknownView) { + FlutterEngine* engine = GetFlutterEngine(); + auto original_init = engine.embedderAPI.Initialize; + ::FlutterCompositor compositor; + engine.embedderAPI.Initialize = MOCK_ENGINE_PROC( + Initialize, ([&compositor, &original_init]( + size_t version, const FlutterRendererConfig* config, + const FlutterProjectArgs* args, void* user_data, auto engine_out) { + compositor = *args->compositor; + return original_init(version, config, args, user_data, engine_out); + })); + + FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engine + nibName:nil + bundle:nil]; + [viewController loadView]; + + EXPECT_TRUE([engine runWithEntrypoint:@"empty"]); + + FlutterBackingStoreConfig config = { + .struct_size = sizeof(FlutterBackingStoreConfig), + .size = FlutterSize{10, 10}, + }; + FlutterBackingStore backing_store = {}; + EXPECT_NE(compositor.create_backing_store_callback, nullptr); + EXPECT_TRUE( + compositor.create_backing_store_callback(&config, &backing_store, compositor.user_data)); + + FlutterLayer layer{ + .type = kFlutterLayerContentTypeBackingStore, + .backing_store = &backing_store, + }; + std::vector layers = {&layer}; + + FlutterPresentViewInfo info = { + .struct_size = sizeof(FlutterPresentViewInfo), + .view_id = 123, + .layers = const_cast(layers.data()), + .layers_count = 1, + .user_data = compositor.user_data, + }; + EXPECT_NE(compositor.present_view_callback, nullptr); + EXPECT_FALSE(compositor.present_view_callback(&info)); + EXPECT_TRUE(compositor.collect_backing_store_callback(&backing_store, compositor.user_data)); + + (void)viewController; + [engine shutDownEngine]; +} TEST_F(FlutterEngineTest, DartEntrypointArguments) { NSString* fixtures = @(flutter::testing::GetFixturesPath()); diff --git a/shell/platform/darwin/macos/framework/Source/fixtures/flutter_desktop_test.dart b/shell/platform/darwin/macos/framework/Source/fixtures/flutter_desktop_test.dart index 835588ff354ac..7a9a69db73de7 100644 --- a/shell/platform/darwin/macos/framework/Source/fixtures/flutter_desktop_test.dart +++ b/shell/platform/darwin/macos/framework/Source/fixtures/flutter_desktop_test.dart @@ -12,6 +12,10 @@ external void signalNativeTest(); void main() { } +@pragma('vm:entry-point') +void empty() { +} + /// Notifies the test of a string value. /// /// This is used to notify the native side of the test of a string value from From 6425120ae6a911a9a69b31c0de9894f522617232 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 14 Mar 2024 18:05:39 -0700 Subject: [PATCH 2/4] Format --- .../darwin/macos/framework/Source/FlutterEngineTest.mm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm index 2685530bd35f6..e181199dfe839 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngineTest.mm @@ -557,8 +557,8 @@ @implementation MockableFlutterEngine EXPECT_TRUE([engine runWithEntrypoint:@"empty"]); FlutterBackingStoreConfig config = { - .struct_size = sizeof(FlutterBackingStoreConfig), - .size = FlutterSize{10, 10}, + .struct_size = sizeof(FlutterBackingStoreConfig), + .size = FlutterSize{10, 10}, }; FlutterBackingStore backing_store = {}; EXPECT_NE(compositor.create_backing_store_callback, nullptr); From 227e9f186e2b3cba2e5c58f6f53604e34f8788bc Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Fri, 15 Mar 2024 11:17:02 -0700 Subject: [PATCH 3/4] Add assertion --- .../darwin/macos/framework/Source/FlutterCompositor.mm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm index 890a4c0cfca3b..0346e279c80dc 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm @@ -55,6 +55,10 @@ bool FlutterCompositor::Present(FlutterViewId view_id, const FlutterLayer** layers, size_t layers_count) { + // TODO(dkwignsmt): https://github.com/flutter/flutter/issues/144810 + // There is only one mutator_views_, which can't be shared between views. + FML_DCHECK(view_id == kFlutterImplicitViewId) + << "macOS FlutterCompositor doesn't support non-implicit views yet."; FlutterView* view = [view_provider_ viewForId:view_id]; if (!view) { return false; From 70ef118fa336fd8a873f0a1b3663729de310acfb Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Mon, 18 Mar 2024 11:52:42 -0700 Subject: [PATCH 4/4] Remove assertion --- .../darwin/macos/framework/Source/FlutterCompositor.mm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm index 0346e279c80dc..890a4c0cfca3b 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterCompositor.mm @@ -55,10 +55,6 @@ bool FlutterCompositor::Present(FlutterViewId view_id, const FlutterLayer** layers, size_t layers_count) { - // TODO(dkwignsmt): https://github.com/flutter/flutter/issues/144810 - // There is only one mutator_views_, which can't be shared between views. - FML_DCHECK(view_id == kFlutterImplicitViewId) - << "macOS FlutterCompositor doesn't support non-implicit views yet."; FlutterView* view = [view_provider_ viewForId:view_id]; if (!view) { return false;