From 31abbec21c072b800b302e44cafdf510bab6fb40 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 21 Sep 2023 17:41:42 -0700 Subject: [PATCH 01/17] Impl --- examples/glfw/FlutterEmbedderGLFW.cc | 4 ++ examples/glfw_drm/FlutterEmbedderGLFW.cc | 4 ++ examples/vulkan_glfw/src/main.cc | 3 ++ .../macos/framework/Source/FlutterEngine.mm | 7 +-- shell/platform/embedder/embedder.cc | 3 +- shell/platform/embedder/embedder.h | 2 + .../embedder/tests/embedder_gl_unittests.cc | 54 +++++++++++++++++++ .../tests/embedder_metal_unittests.mm | 9 ++++ .../embedder/tests/embedder_unittests.cc | 13 +++++ shell/platform/glfw/flutter_glfw.cc | 3 ++ shell/platform/linux/fl_engine.cc | 6 +++ .../windows/flutter_windows_engine.cc | 3 +- .../platform/windows/flutter_windows_engine.h | 3 +- .../platform/windows/flutter_windows_view.cc | 2 +- .../platform/windows/testing/test_keyboard.cc | 2 +- 15 files changed, 106 insertions(+), 12 deletions(-) diff --git a/examples/glfw/FlutterEmbedderGLFW.cc b/examples/glfw/FlutterEmbedderGLFW.cc index 8b17b25958fc1..dcc88c1867c82 100644 --- a/examples/glfw/FlutterEmbedderGLFW.cc +++ b/examples/glfw/FlutterEmbedderGLFW.cc @@ -13,6 +13,7 @@ static double g_pixelRatio = 1.0; static const size_t kInitialWindowWidth = 800; static const size_t kInitialWindowHeight = 600; +static constexpr int64_t kImplicitViewId = 0; static_assert(FLUTTER_ENGINE_VERSION == 1, "This Flutter Embedder was authored against the stable Flutter " @@ -73,10 +74,13 @@ static void GLFWKeyCallback(GLFWwindow* window, void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; + // TODO(dkwingsmt) + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); diff --git a/examples/glfw_drm/FlutterEmbedderGLFW.cc b/examples/glfw_drm/FlutterEmbedderGLFW.cc index ef9435b8857a3..72e88cd9d8d42 100644 --- a/examples/glfw_drm/FlutterEmbedderGLFW.cc +++ b/examples/glfw_drm/FlutterEmbedderGLFW.cc @@ -26,6 +26,7 @@ static const size_t kInitialWindowHeight = 600; // Maximum damage history - for triple buffering we need to store damage for // last two frames; Some Android devices (Pixel 4) use quad buffering. static const int kMaxHistorySize = 10; +static constexpr int64_t kImplicitViewId = 0; // Keeps track of the most recent frame damages so that existing damage can // be easily computed. @@ -96,10 +97,13 @@ static void GLFWKeyCallback(GLFWwindow* window, void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; + // TODO(dkwingsmt) + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); diff --git a/examples/vulkan_glfw/src/main.cc b/examples/vulkan_glfw/src/main.cc index 7d226055b56ed..4625d94cb350a 100644 --- a/examples/vulkan_glfw/src/main.cc +++ b/examples/vulkan_glfw/src/main.cc @@ -126,10 +126,13 @@ void GLFWframebufferSizeCallback(GLFWwindow* window, int width, int height) { g_state.resize_pending = true; FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; event.pixel_ratio = g_pixelRatio; + // TODO(dkwingsmt) + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent(g_state.engine, &event); } diff --git a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm index ac808395c0c05..595ca17660187 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterEngine.mm @@ -874,12 +874,6 @@ - (nonnull NSString*)executableName { } - (void)updateWindowMetricsForViewController:(FlutterViewController*)viewController { - if (viewController.viewId != kFlutterImplicitViewId) { - // TODO(dkwingsmt): The embedder API only supports single-view for now. As - // embedder APIs are converted to multi-view, this method should support any - // views. - return; - } if (!_engine || !viewController || !viewController.viewLoaded) { return; } @@ -898,6 +892,7 @@ - (void)updateWindowMetricsForViewController:(FlutterViewController*)viewControl .left = static_cast(scaledBounds.origin.x), .top = static_cast(scaledBounds.origin.y), .display_id = static_cast(displayId), + .view_id = viewController.viewId, }; _embedderAPI.SendWindowMetricsEvent(_engine, &windowMetricsEvent); } diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index eb6b4edb85bbf..839af2370addf 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -2133,8 +2133,7 @@ FlutterEngineResult FlutterEngineSendWindowMetricsEvent( if (engine == nullptr || flutter_metrics == nullptr) { return LOG_EMBEDDER_ERROR(kInvalidArguments, "Engine handle was invalid."); } - // TODO(dkwingsmt): Use a real view ID when multiview is supported. - int64_t view_id = kFlutterImplicitViewId; + int64_t view_id = SAFE_ACCESS(flutter_metrics, view_id, 0); flutter::ViewportMetrics metrics; diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index cfef518dcf6fe..1b09f8a1ec845 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -853,6 +853,8 @@ typedef struct { double physical_view_inset_left; /// The identifier of the display the view is rendering on. FlutterEngineDisplayId display_id; + /// The view that this event is describing. + int64_t view_id; } FlutterWindowMetricsEvent; /// The phase of the pointer event. diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index d233f836d9a74..d84122c195d9e 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -43,6 +43,8 @@ namespace flutter { namespace testing { +static constexpr int64_t kImplicitViewId = 0ll; + using EmbedderTest = testing::EmbedderTest; TEST_F(EmbedderTest, CanGetVulkanEmbedderContext) { @@ -189,6 +191,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -310,6 +313,7 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -396,6 +400,7 @@ TEST_F(EmbedderTest, RasterCacheEnabled) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -525,6 +530,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -646,6 +652,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -853,6 +860,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1015,6 +1023,7 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1103,6 +1112,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1227,6 +1237,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1450,6 +1461,7 @@ TEST_F(EmbedderTest, event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1479,6 +1491,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1512,6 +1525,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1539,6 +1553,7 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithoutCompositor) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1573,6 +1588,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1601,6 +1617,7 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithCompositor) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1639,6 +1656,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1771,6 +1789,7 @@ TEST_P(EmbedderTestMultiBackend, event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1914,6 +1933,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2017,6 +2037,7 @@ TEST_F(EmbedderTest, VerifyB141980393) { event.width = flutter_application_rect.width(); event.height = flutter_application_rect.height(); event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2062,6 +2083,7 @@ TEST_F(EmbedderTest, CanCreateEmbedderWithCustomRenderTaskRunner) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); task_latch.Wait(); @@ -2123,6 +2145,7 @@ TEST_P(EmbedderTestMultiBackend, event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); }); @@ -2260,6 +2283,7 @@ TEST_P(EmbedderTestMultiBackend, event.width = 400 * 2.0; event.height = 300 * 2.0; event.pixel_ratio = 2.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2384,6 +2408,7 @@ TEST_F( event.width = 400 * 2.0; event.height = 300 * 2.0; event.pixel_ratio = 2.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2418,6 +2443,7 @@ TEST_F(EmbedderTest, event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2458,6 +2484,7 @@ TEST_F(EmbedderTest, event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2579,6 +2606,7 @@ TEST_P(EmbedderTestMultiBackend, PlatformViewMutatorsAreValid) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2689,6 +2717,7 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValidWithPixelRatio) { event.width = 800; event.height = 600; event.pixel_ratio = 2.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2806,6 +2835,7 @@ TEST_F(EmbedderTest, event.width = 800; event.height = 600; event.pixel_ratio = 2.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2834,6 +2864,7 @@ TEST_F(EmbedderTest, EmptySceneIsAcceptable) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -2862,6 +2893,7 @@ TEST_F(EmbedderTest, SceneWithNoRootContainerIsAcceptable) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -2897,6 +2929,7 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { event.width = 800; event.height = 1024; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2976,6 +3009,7 @@ TEST_F(EmbedderTest, ClipsAreCorrectlyCalculated) { event.width = 400; event.height = 300; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3060,6 +3094,7 @@ TEST_F(EmbedderTest, ComplexClipsAreCorrectlyCalculated) { event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3290,6 +3325,7 @@ TEST_F(EmbedderTest, CompositorCanPostZeroLayersForPresentation) { event.width = 300; event.height = 200; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3353,6 +3389,7 @@ TEST_F(EmbedderTest, CompositorCanPostOnlyPlatformViews) { event.width = 300; event.height = 200; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3392,6 +3429,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreRecycled) { event.width = 300; event.height = 200; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3469,6 +3507,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreInStableOrder) { event.width = 300; event.height = 200; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3495,6 +3534,7 @@ TEST_F(EmbedderTest, FrameInfoContainsValidWidthAndHeight) { event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3626,6 +3666,7 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3700,6 +3741,7 @@ TEST_F(EmbedderTest, event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3776,6 +3818,7 @@ TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3851,6 +3894,7 @@ TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3908,6 +3952,7 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesValidID) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); } @@ -3954,6 +3999,7 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesInvalidID) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); } @@ -3994,6 +4040,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithDisplayId) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4036,6 +4083,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithoutDisplayId) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4085,6 +4133,7 @@ TEST_F(EmbedderTest, SetValidMultiDisplayConfiguration) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4131,6 +4180,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSingleDisplayTrueIsInvalid) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4177,6 +4227,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSameDisplayIdIsInvalid) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4218,6 +4269,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsNotRecycledWhenAvoidsCacheSet) { event.width = 300; event.height = 200; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4380,6 +4432,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLTexture) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -4443,6 +4496,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLFramebuffer) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index c23a6553a5360..ad150c25781dc 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -31,6 +31,8 @@ namespace flutter { namespace testing { +constexpr int64_t kImplicitViewId = 0ll; + using EmbedderTest = testing::EmbedderTest; TEST_F(EmbedderTest, CanRenderGradientWithMetal) { @@ -52,6 +54,7 @@ event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); // TODO (https://github.com/flutter/flutter/issues/73590): re-enable once @@ -121,6 +124,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), event.width = texture_size.width(); event.height = texture_size.height(); event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(ImageMatchesFixture("external_texture_metal.png", rendered_scene)); @@ -231,6 +235,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -256,6 +261,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(ImageMatchesFixture("scene_without_custom_compositor.png", rendered_scene)); @@ -304,6 +310,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -500,6 +507,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -558,6 +566,7 @@ void Collect() { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); latch.Wait(); diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 5a21214a06d22..349d99f1b3999 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -52,6 +52,8 @@ static uint64_t NanosFromEpoch(int millis_from_now) { namespace flutter { namespace testing { +static constexpr int64_t kImplicitViewId = 0ll; + using EmbedderTest = testing::EmbedderTest; TEST(EmbedderTestNoFixture, MustNotRunWithInvalidArgs) { @@ -847,6 +849,7 @@ TEST_F(EmbedderTest, event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -977,6 +980,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForTransparentOverlayOnTopOfPlatformLayer) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1113,6 +1117,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1184,6 +1189,7 @@ TEST_F(EmbedderTest, CanDeinitializeAnEngine) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kInvalidArguments); engine.reset(); @@ -1417,6 +1423,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1909,6 +1916,7 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; // Pixel ratio must be positive. ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), @@ -1919,6 +1927,7 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = -1.0; event.physical_view_inset_bottom = -1.0; event.physical_view_inset_left = -1.0; + event.view_id = kImplicitViewId; // Physical view insets must be non-negative. ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), @@ -1928,6 +1937,7 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = 900; event.physical_view_inset_bottom = 700; event.physical_view_inset_left = 900; + event.view_id = kImplicitViewId; // Top/bottom insets cannot be greater than height. // Left/right insets cannot be greater than width. @@ -1976,6 +1986,7 @@ static void expectSoftwareRenderingOutputMatches( event.width = 1; event.height = 1; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2488,6 +2499,7 @@ TEST_F(EmbedderTest, VsyncCallbackPostedIntoFuture) { event.width = 800; event.height = 600; event.pixel_ratio = 1.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2564,6 +2576,7 @@ TEST_F(EmbedderTest, CanSetNextFrameCallback) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; + event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); diff --git a/shell/platform/glfw/flutter_glfw.cc b/shell/platform/glfw/flutter_glfw.cc index 554a2745baf2f..5453dc8551efa 100644 --- a/shell/platform/glfw/flutter_glfw.cc +++ b/shell/platform/glfw/flutter_glfw.cc @@ -42,6 +42,7 @@ static_assert(FLUTTER_ENGINE_VERSION == 1, ""); const int kFlutterDesktopDontCare = GLFW_DONT_CARE; static constexpr double kDpPerInch = 160.0; +static constexpr int64_t kFlutterImplicitViewId = 0ll; // Struct for storing state within an instance of the GLFW Window. struct FlutterDesktopWindowControllerState { @@ -284,6 +285,7 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, double dpi = controller->window_wrapper->pixels_per_screen_coordinate * controller->monitor_screen_coordinates_per_inch; + int64_t view_id = kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; event.struct_size = sizeof(event); event.width = width; @@ -296,6 +298,7 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, } else { event.pixel_ratio = controller->window_wrapper->pixel_ratio_override; } + event.view_id = view_id; FlutterEngineSendWindowMetricsEvent(controller->engine->flutter_engine, &event); } diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index 507d9e2271470..0e8844190021e 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -26,6 +26,8 @@ #include "flutter/shell/platform/linux/public/flutter_linux/fl_plugin_registry.h" #include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h" +static constexpr int64_t kFlutterImplicitViewId = 0ll; + // Unique number associated with platform tasks. static constexpr size_t kPlatformTaskRunnerIdentifier = 1; @@ -766,11 +768,15 @@ void fl_engine_send_window_metrics_event(FlEngine* self, return; } + // TODO(dkwingsmt) + int64_t view_id = kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(FlutterWindowMetricsEvent); event.width = width; event.height = height; event.pixel_ratio = pixel_ratio; + event.view_id = view_id; self->embedder_api.SendWindowMetricsEvent(self->engine, &event); } diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc index fce1c0531e48c..caeffb7b0308f 100644 --- a/shell/platform/windows/flutter_windows_engine.cc +++ b/shell/platform/windows/flutter_windows_engine.cc @@ -493,9 +493,10 @@ void FlutterWindowsEngine::AddPluginRegistrarDestructionCallback( } void FlutterWindowsEngine::SendWindowMetricsEvent( + int64_t view_id, const FlutterWindowMetricsEvent& event) { if (engine_) { - embedder_api_.SendWindowMetricsEvent(engine_, &event); + embedder_api_.SendWindowMetricsEvent(engine_, view_id, &event); } } diff --git a/shell/platform/windows/flutter_windows_engine.h b/shell/platform/windows/flutter_windows_engine.h index cdbcd375fd119..e92d239714cca 100644 --- a/shell/platform/windows/flutter_windows_engine.h +++ b/shell/platform/windows/flutter_windows_engine.h @@ -146,7 +146,8 @@ class FlutterWindowsEngine { } // Informs the engine that the window metrics have changed. - void SendWindowMetricsEvent(const FlutterWindowMetricsEvent& event); + void SendWindowMetricsEvent(int64_t view_id, + const FlutterWindowMetricsEvent& event); // Informs the engine of an incoming pointer event. void SendPointerEvent(const FlutterPointerEvent& event); diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index d668d2f447b6c..e01a128b949af 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -277,7 +277,7 @@ void FlutterWindowsView::SendWindowMetrics(size_t width, event.width = width; event.height = height; event.pixel_ratio = dpiScale; - engine_->SendWindowMetricsEvent(event); + engine_->SendWindowMetricsEvent(view_id_, event); } void FlutterWindowsView::SendInitialBounds() { diff --git a/shell/platform/windows/testing/test_keyboard.cc b/shell/platform/windows/testing/test_keyboard.cc index 4d2109a657108..e9140088c38c7 100644 --- a/shell/platform/windows/testing/test_keyboard.cc +++ b/shell/platform/windows/testing/test_keyboard.cc @@ -192,7 +192,7 @@ void MockEmbedderApiForKeyboard( return kSuccess; }; modifier.embedder_api().SendWindowMetricsEvent = - [](auto engine, const FlutterWindowMetricsEvent* event) { + [](auto engine, int64_t view_id, const FlutterWindowMetricsEvent* event) { return kSuccess; }; modifier.embedder_api().Shutdown = [](auto engine) { return kSuccess; }; From 520f998de49f7202ae4f909e5be8d1906d0b0b89 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 21 Sep 2023 18:10:42 -0700 Subject: [PATCH 02/17] Fix compile error --- shell/platform/embedder/embedder.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 839af2370addf..bfc4f8ff7ea48 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -102,8 +102,6 @@ extern const intptr_t kPlatformStrongDillSize; const int32_t kFlutterSemanticsNodeIdBatchEnd = -1; const int32_t kFlutterSemanticsCustomActionIdBatchEnd = -1; -static constexpr int64_t kFlutterImplicitViewId = 0; - // A message channel to send platform-independent FlutterKeyData to the // framework. // From 63a70e86533d1c695b8098e4aaa50fe2a4107519 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Thu, 21 Sep 2023 18:23:16 -0700 Subject: [PATCH 03/17] Fix compile and doc --- examples/glfw/FlutterEmbedderGLFW.cc | 6 ++- examples/glfw_drm/FlutterEmbedderGLFW.cc | 6 ++- examples/vulkan_glfw/src/main.cc | 6 ++- .../embedder/tests/embedder_gl_unittests.cc | 51 +++++++++++++++++++ .../tests/embedder_metal_unittests.mm | 7 +++ .../embedder/tests/embedder_unittests.cc | 9 ++++ shell/platform/glfw/flutter_glfw.cc | 3 ++ shell/platform/linux/fl_engine.cc | 3 +- .../windows/flutter_windows_engine.cc | 3 +- .../platform/windows/flutter_windows_view.cc | 7 ++- .../platform/windows/testing/test_keyboard.cc | 2 +- 11 files changed, 92 insertions(+), 11 deletions(-) diff --git a/examples/glfw/FlutterEmbedderGLFW.cc b/examples/glfw/FlutterEmbedderGLFW.cc index dcc88c1867c82..ca9bc0afab45f 100644 --- a/examples/glfw/FlutterEmbedderGLFW.cc +++ b/examples/glfw/FlutterEmbedderGLFW.cc @@ -73,14 +73,16 @@ static void GLFWKeyCallback(GLFWwindow* window, } void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { + // TODO(dkwingsmt): The GLFW embedder doesn't support multi-view for now. Use + // the real view ID when it does. + int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; - // TODO(dkwingsmt) - event.view_id = kImplicitViewId; + event.view_id = view_id; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); diff --git a/examples/glfw_drm/FlutterEmbedderGLFW.cc b/examples/glfw_drm/FlutterEmbedderGLFW.cc index 72e88cd9d8d42..62a382faf6342 100644 --- a/examples/glfw_drm/FlutterEmbedderGLFW.cc +++ b/examples/glfw_drm/FlutterEmbedderGLFW.cc @@ -96,14 +96,16 @@ static void GLFWKeyCallback(GLFWwindow* window, } void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { + // TODO(dkwingsmt): The GLFW embedder doesn't support multi-view for now. Use + // the real view ID when it does. + int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; - // TODO(dkwingsmt) - event.view_id = kImplicitViewId; + event.view_id = view_id; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); diff --git a/examples/vulkan_glfw/src/main.cc b/examples/vulkan_glfw/src/main.cc index 4625d94cb350a..289ac45019e0c 100644 --- a/examples/vulkan_glfw/src/main.cc +++ b/examples/vulkan_glfw/src/main.cc @@ -125,14 +125,16 @@ void GLFWKeyCallback(GLFWwindow* window, void GLFWframebufferSizeCallback(GLFWwindow* window, int width, int height) { g_state.resize_pending = true; + // TODO(dkwingsmt): GLFW doesn't support multi-view for now. Use the real + // view ID when it does. + int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; event.pixel_ratio = g_pixelRatio; - // TODO(dkwingsmt) - event.view_id = kImplicitViewId; + event.view_id = view_id; FlutterEngineSendWindowMetricsEvent(g_state.engine, &event); } diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index d84122c195d9e..3b4bd38704895 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -187,6 +187,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -309,6 +310,7 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -396,6 +398,7 @@ TEST_F(EmbedderTest, RasterCacheEnabled) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -526,6 +529,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -648,6 +652,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -856,6 +861,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1019,6 +1025,7 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1108,6 +1115,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1233,6 +1241,7 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1456,6 +1465,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. Only the root surface is rotated. event.width = 800; @@ -1487,6 +1497,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1519,6 +1530,7 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. @@ -1549,6 +1561,7 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithoutCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1583,6 +1596,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; @@ -1613,6 +1627,7 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1651,6 +1666,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; @@ -1785,6 +1801,7 @@ TEST_P(EmbedderTestMultiBackend, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1928,6 +1945,7 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; @@ -2030,6 +2048,7 @@ TEST_F(EmbedderTest, VerifyB141980393) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // The Flutter application is 800 x 600 rendering on a surface 600 x 800 @@ -2079,6 +2098,7 @@ TEST_F(EmbedderTest, CanCreateEmbedderWithCustomRenderTaskRunner) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2141,6 +2161,7 @@ TEST_P(EmbedderTestMultiBackend, ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2279,6 +2300,7 @@ TEST_P(EmbedderTestMultiBackend, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400 * 2.0; event.height = 300 * 2.0; @@ -2404,6 +2426,7 @@ TEST_F( // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400 * 2.0; event.height = 300 * 2.0; @@ -2439,6 +2462,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -2480,6 +2504,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -2602,6 +2627,7 @@ TEST_P(EmbedderTestMultiBackend, PlatformViewMutatorsAreValid) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2713,6 +2739,7 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValidWithPixelRatio) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2831,6 +2858,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2860,6 +2888,7 @@ TEST_F(EmbedderTest, EmptySceneIsAcceptable) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2889,6 +2918,7 @@ TEST_F(EmbedderTest, SceneWithNoRootContainerIsAcceptable) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2925,6 +2955,7 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 1024; @@ -3005,6 +3036,7 @@ TEST_F(EmbedderTest, ClipsAreCorrectlyCalculated) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400; event.height = 300; @@ -3090,6 +3122,7 @@ TEST_F(EmbedderTest, ComplexClipsAreCorrectlyCalculated) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -3321,6 +3354,7 @@ TEST_F(EmbedderTest, CompositorCanPostZeroLayersForPresentation) { auto engine = builder.LaunchEngine(); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; @@ -3385,6 +3419,7 @@ TEST_F(EmbedderTest, CompositorCanPostOnlyPlatformViews) { auto engine = builder.LaunchEngine(); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; @@ -3425,6 +3460,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreRecycled) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; @@ -3503,6 +3539,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreInStableOrder) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; @@ -3662,6 +3699,7 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -3737,6 +3775,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -3814,6 +3853,7 @@ TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -3890,6 +3930,7 @@ TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -3948,6 +3989,7 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesValidID) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -3995,6 +4037,7 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesInvalidID) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4036,6 +4079,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithDisplayId) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display.refresh_rate); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4079,6 +4123,7 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithoutDisplayId) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display.refresh_rate); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4129,6 +4174,7 @@ TEST_F(EmbedderTest, SetValidMultiDisplayConfiguration) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display_1.refresh_rate); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4176,6 +4222,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSingleDisplayTrueIsInvalid) { ASSERT_NE(result, kSuccess); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4223,6 +4270,7 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSameDisplayIdIsInvalid) { ASSERT_NE(result, kSuccess); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4265,6 +4313,7 @@ TEST_F(EmbedderTest, CompositorRenderTargetsNotRecycledWhenAvoidsCacheSet) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; @@ -4428,6 +4477,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLTexture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -4492,6 +4542,7 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLFramebuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index ad150c25781dc..90f99ee4d1070 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -50,6 +50,7 @@ // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -120,6 +121,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = texture_size.width(); event.height = texture_size.height(); @@ -231,6 +233,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -257,6 +260,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -306,6 +310,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -502,6 +507,7 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. Only the root surface is rotated. event.width = 800; @@ -562,6 +568,7 @@ void Collect() { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 349d99f1b3999..0b30af7bdbb45 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -841,6 +841,7 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -972,6 +973,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForTransparentOverlayOnTopOfPlatformLayer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1109,6 +1111,7 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1181,6 +1184,7 @@ TEST_F(EmbedderTest, CanDeinitializeAnEngine) { // Sending events to a deinitialized engine fails. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1415,6 +1419,7 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -1908,6 +1913,7 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1982,6 +1988,7 @@ static void expectSoftwareRenderingOutputMatches( // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1; event.height = 1; @@ -2495,6 +2502,7 @@ TEST_F(EmbedderTest, VsyncCallbackPostedIntoFuture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2568,6 +2576,7 @@ TEST_F(EmbedderTest, CanSetNextFrameCallback) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; diff --git a/shell/platform/glfw/flutter_glfw.cc b/shell/platform/glfw/flutter_glfw.cc index 5453dc8551efa..b95ec9293c998 100644 --- a/shell/platform/glfw/flutter_glfw.cc +++ b/shell/platform/glfw/flutter_glfw.cc @@ -285,8 +285,11 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, double dpi = controller->window_wrapper->pixels_per_screen_coordinate * controller->monitor_screen_coordinates_per_inch; + // TODO(dkwingsmt): GLFW doesn't support multi-view for now. Use the real + // view ID when it does. int64_t view_id = kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index 0e8844190021e..522cee94d2fb6 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -768,7 +768,8 @@ void fl_engine_send_window_metrics_event(FlEngine* self, return; } - // TODO(dkwingsmt) + // TODO(dkwingsmt): The Linux embedder doesn't support multi-view for now. Use + // the real view ID when it does. int64_t view_id = kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); diff --git a/shell/platform/windows/flutter_windows_engine.cc b/shell/platform/windows/flutter_windows_engine.cc index caeffb7b0308f..fce1c0531e48c 100644 --- a/shell/platform/windows/flutter_windows_engine.cc +++ b/shell/platform/windows/flutter_windows_engine.cc @@ -493,10 +493,9 @@ void FlutterWindowsEngine::AddPluginRegistrarDestructionCallback( } void FlutterWindowsEngine::SendWindowMetricsEvent( - int64_t view_id, const FlutterWindowMetricsEvent& event) { if (engine_) { - embedder_api_.SendWindowMetricsEvent(engine_, view_id, &event); + embedder_api_.SendWindowMetricsEvent(engine_, &event); } } diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index e01a128b949af..f76ad79b3c4b3 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -272,12 +272,17 @@ void FlutterWindowsView::OnResetImeComposing() { void FlutterWindowsView::SendWindowMetrics(size_t width, size_t height, double dpiScale) const { + // TODO(dkwingsmt): The Windows embedder doesn't support multi-view for now. + // Use the real view ID when it does. + int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; + memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; event.pixel_ratio = dpiScale; - engine_->SendWindowMetricsEvent(view_id_, event); + event.view_id = view_id; + engine_->SendWindowMetricsEvent(event); } void FlutterWindowsView::SendInitialBounds() { diff --git a/shell/platform/windows/testing/test_keyboard.cc b/shell/platform/windows/testing/test_keyboard.cc index e9140088c38c7..4d2109a657108 100644 --- a/shell/platform/windows/testing/test_keyboard.cc +++ b/shell/platform/windows/testing/test_keyboard.cc @@ -192,7 +192,7 @@ void MockEmbedderApiForKeyboard( return kSuccess; }; modifier.embedder_api().SendWindowMetricsEvent = - [](auto engine, int64_t view_id, const FlutterWindowMetricsEvent* event) { + [](auto engine, const FlutterWindowMetricsEvent* event) { return kSuccess; }; modifier.embedder_api().Shutdown = [](auto engine) { return kSuccess; }; From 14e5081ece6524b5eac10abde55f7c0eb48ad40e Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Fri, 22 Sep 2023 14:22:09 -0700 Subject: [PATCH 04/17] Fix constant --- shell/platform/glfw/flutter_glfw.cc | 4 ++-- shell/platform/linux/fl_engine.cc | 5 ++--- shell/platform/windows/flutter_windows_engine.h | 3 +-- shell/platform/windows/flutter_windows_view.cc | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/shell/platform/glfw/flutter_glfw.cc b/shell/platform/glfw/flutter_glfw.cc index b95ec9293c998..0cec25d9fb7f7 100644 --- a/shell/platform/glfw/flutter_glfw.cc +++ b/shell/platform/glfw/flutter_glfw.cc @@ -14,6 +14,7 @@ #include #include +#include "flutter/common/constants.h" #include "flutter/shell/platform/common/client_wrapper/include/flutter/plugin_registrar.h" #include "flutter/shell/platform/common/incoming_message_dispatcher.h" #include "flutter/shell/platform/common/path_utils.h" @@ -42,7 +43,6 @@ static_assert(FLUTTER_ENGINE_VERSION == 1, ""); const int kFlutterDesktopDontCare = GLFW_DONT_CARE; static constexpr double kDpPerInch = 160.0; -static constexpr int64_t kFlutterImplicitViewId = 0ll; // Struct for storing state within an instance of the GLFW Window. struct FlutterDesktopWindowControllerState { @@ -287,7 +287,7 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, // TODO(dkwingsmt): GLFW doesn't support multi-view for now. Use the real // view ID when it does. - int64_t view_id = kFlutterImplicitViewId; + int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index 522cee94d2fb6..1d12c91bc5e4e 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -10,6 +10,7 @@ #include #include +#include "flutter/common/constants.h" #include "flutter/shell/platform/common/app_lifecycle_state.h" #include "flutter/shell/platform/common/engine_switches.h" #include "flutter/shell/platform/embedder/embedder.h" @@ -26,8 +27,6 @@ #include "flutter/shell/platform/linux/public/flutter_linux/fl_plugin_registry.h" #include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h" -static constexpr int64_t kFlutterImplicitViewId = 0ll; - // Unique number associated with platform tasks. static constexpr size_t kPlatformTaskRunnerIdentifier = 1; @@ -770,7 +769,7 @@ void fl_engine_send_window_metrics_event(FlEngine* self, // TODO(dkwingsmt): The Linux embedder doesn't support multi-view for now. Use // the real view ID when it does. - int64_t view_id = kFlutterImplicitViewId; + int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(FlutterWindowMetricsEvent); diff --git a/shell/platform/windows/flutter_windows_engine.h b/shell/platform/windows/flutter_windows_engine.h index e92d239714cca..cdbcd375fd119 100644 --- a/shell/platform/windows/flutter_windows_engine.h +++ b/shell/platform/windows/flutter_windows_engine.h @@ -146,8 +146,7 @@ class FlutterWindowsEngine { } // Informs the engine that the window metrics have changed. - void SendWindowMetricsEvent(int64_t view_id, - const FlutterWindowMetricsEvent& event); + void SendWindowMetricsEvent(const FlutterWindowMetricsEvent& event); // Informs the engine of an incoming pointer event. void SendPointerEvent(const FlutterPointerEvent& event); diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index f76ad79b3c4b3..df48ee7c8da74 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -274,7 +274,7 @@ void FlutterWindowsView::SendWindowMetrics(size_t width, double dpiScale) const { // TODO(dkwingsmt): The Windows embedder doesn't support multi-view for now. // Use the real view ID when it does. - int64_t view_id = kImplicitViewId; + int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); From 1507fea4f9499df710d6a4e79c240653bffe1dd0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Fri, 22 Sep 2023 16:06:10 -0700 Subject: [PATCH 05/17] Add constants --- shell/platform/windows/flutter_windows_view.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index df48ee7c8da74..d5398fd7e0a89 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -6,6 +6,7 @@ #include +#include "flutter/common/constants.h" #include "flutter/fml/platform/win/wstring_conversion.h" #include "flutter/shell/platform/common/accessibility_bridge.h" #include "flutter/shell/platform/windows/keyboard_key_channel_handler.h" From 79b55432c4f6be60354516cb96f5311b25d2d7bf Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Fri, 10 Nov 2023 15:47:39 -0800 Subject: [PATCH 06/17] Remove glfw todo --- examples/glfw/FlutterEmbedderGLFW.cc | 7 +++---- examples/glfw_drm/FlutterEmbedderGLFW.cc | 7 +++---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/examples/glfw/FlutterEmbedderGLFW.cc b/examples/glfw/FlutterEmbedderGLFW.cc index ca9bc0afab45f..76ae29c857e78 100644 --- a/examples/glfw/FlutterEmbedderGLFW.cc +++ b/examples/glfw/FlutterEmbedderGLFW.cc @@ -73,16 +73,15 @@ static void GLFWKeyCallback(GLFWwindow* window, } void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { - // TODO(dkwingsmt): The GLFW embedder doesn't support multi-view for now. Use - // the real view ID when it does. - int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; - event.view_id = view_id; + // This example only supports a single window, therefore we assume the event + // occurred in the only view, the implicit view. + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); diff --git a/examples/glfw_drm/FlutterEmbedderGLFW.cc b/examples/glfw_drm/FlutterEmbedderGLFW.cc index 62a382faf6342..dd7b49968fa96 100644 --- a/examples/glfw_drm/FlutterEmbedderGLFW.cc +++ b/examples/glfw_drm/FlutterEmbedderGLFW.cc @@ -96,16 +96,15 @@ static void GLFWKeyCallback(GLFWwindow* window, } void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { - // TODO(dkwingsmt): The GLFW embedder doesn't support multi-view for now. Use - // the real view ID when it does. - int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; event.pixel_ratio = g_pixelRatio; - event.view_id = view_id; + // This example only supports a single window, therefore we assume the event + // occurred in the only view, the implicit view. + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent( reinterpret_cast(glfwGetWindowUserPointer(window)), &event); From 29060e1d348c2196d77cff1612b5fe05036b7bc0 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Dec 2023 10:39:47 -0800 Subject: [PATCH 07/17] Small fixes --- examples/glfw/FlutterEmbedderGLFW.cc | 2 +- examples/glfw_drm/FlutterEmbedderGLFW.cc | 2 +- shell/platform/embedder/embedder.h | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/examples/glfw/FlutterEmbedderGLFW.cc b/examples/glfw/FlutterEmbedderGLFW.cc index 76ae29c857e78..85a8ac1dea931 100644 --- a/examples/glfw/FlutterEmbedderGLFW.cc +++ b/examples/glfw/FlutterEmbedderGLFW.cc @@ -13,7 +13,7 @@ static double g_pixelRatio = 1.0; static const size_t kInitialWindowWidth = 800; static const size_t kInitialWindowHeight = 600; -static constexpr int64_t kImplicitViewId = 0; +static constexpr FlutterViewId kImplicitViewId = 0; static_assert(FLUTTER_ENGINE_VERSION == 1, "This Flutter Embedder was authored against the stable Flutter " diff --git a/examples/glfw_drm/FlutterEmbedderGLFW.cc b/examples/glfw_drm/FlutterEmbedderGLFW.cc index dd7b49968fa96..c21c06ec58a0a 100644 --- a/examples/glfw_drm/FlutterEmbedderGLFW.cc +++ b/examples/glfw_drm/FlutterEmbedderGLFW.cc @@ -26,7 +26,7 @@ static const size_t kInitialWindowHeight = 600; // Maximum damage history - for triple buffering we need to store damage for // last two frames; Some Android devices (Pixel 4) use quad buffering. static const int kMaxHistorySize = 10; -static constexpr int64_t kImplicitViewId = 0; +static constexpr FlutterViewId kImplicitViewId = 0; // Keeps track of the most recent frame damages so that existing damage can // be easily computed. diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 00ba969e16053..964cffc5009c0 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -266,6 +266,15 @@ typedef enum { typedef struct _FlutterEngine* FLUTTER_API_SYMBOL(FlutterEngine); +/// Identifier for views. +/// +/// How view IDs are generated is decided by the embedding. The engine does not +/// assume any specifics about the generation algorithm, including whether it +/// utilizes the entire range of int64_t or permits the use of zero or negative +/// IDs. The only requirement is that at any given moment, no two views share +/// the same ID. +typedef int64_t FlutterViewId; + typedef struct { /// horizontal scale factor double scaleX; From c42ce5e27f7056b3f5b924e6186516e0298abbc7 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 15:20:50 -0800 Subject: [PATCH 08/17] Fix some --- examples/glfw/FlutterEmbedderGLFW.cc | 1 - examples/glfw_drm/FlutterEmbedderGLFW.cc | 1 - examples/vulkan_glfw/src/main.cc | 12 ++++--- shell/platform/embedder/embedder.cc | 3 +- .../embedder/tests/embedder_gl_unittests.cc | 36 +------------------ .../tests/embedder_metal_unittests.mm | 14 -------- shell/platform/glfw/flutter_glfw.cc | 1 - shell/platform/linux/fl_engine.cc | 1 - .../platform/windows/flutter_windows_view.cc | 1 - 9 files changed, 10 insertions(+), 60 deletions(-) diff --git a/examples/glfw/FlutterEmbedderGLFW.cc b/examples/glfw/FlutterEmbedderGLFW.cc index 789330fb4fddf..a5e5e63643809 100644 --- a/examples/glfw/FlutterEmbedderGLFW.cc +++ b/examples/glfw/FlutterEmbedderGLFW.cc @@ -77,7 +77,6 @@ static void GLFWKeyCallback(GLFWwindow* window, void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; diff --git a/examples/glfw_drm/FlutterEmbedderGLFW.cc b/examples/glfw_drm/FlutterEmbedderGLFW.cc index 24f47de31d6e5..79caba2dc2fef 100644 --- a/examples/glfw_drm/FlutterEmbedderGLFW.cc +++ b/examples/glfw_drm/FlutterEmbedderGLFW.cc @@ -100,7 +100,6 @@ static void GLFWKeyCallback(GLFWwindow* window, void GLFWwindowSizeCallback(GLFWwindow* window, int width, int height) { FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width * g_pixelRatio; event.height = height * g_pixelRatio; diff --git a/examples/vulkan_glfw/src/main.cc b/examples/vulkan_glfw/src/main.cc index 289ac45019e0c..3408be71fe0ff 100644 --- a/examples/vulkan_glfw/src/main.cc +++ b/examples/vulkan_glfw/src/main.cc @@ -32,6 +32,7 @@ static const size_t kInitialWindowHeight = 600; // `VK_PRESENT_MODE_MAILBOX_KHR` for continual swap without horizontal tearing, // or `VK_PRESENT_MODE_IMMEDIATE_KHR` for no vsync. static const VkPresentModeKHR kPreferredPresentMode = VK_PRESENT_MODE_FIFO_KHR; +static constexpr FlutterViewId kImplicitViewId = 0; static_assert(FLUTTER_ENGINE_VERSION == 1, "This Flutter Embedder was authored against the stable Flutter " @@ -86,6 +87,9 @@ void GLFWcursorPositionCallbackAtPhase(GLFWwindow* window, std::chrono::duration_cast( std::chrono::high_resolution_clock::now().time_since_epoch()) .count(); + // This example only supports a single window, therefore we assume the event + // occurred in the only view, the implicit view. + event.view_id = kImplicitViewId; FlutterEngineSendPointerEvent(g_state.engine, &event, 1); } @@ -125,16 +129,14 @@ void GLFWKeyCallback(GLFWwindow* window, void GLFWframebufferSizeCallback(GLFWwindow* window, int width, int height) { g_state.resize_pending = true; - // TODO(dkwingsmt): GLFW doesn't support multi-view for now. Use the real - // view ID when it does. - int64_t view_id = kImplicitViewId; FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; event.pixel_ratio = g_pixelRatio; - event.view_id = view_id; + // This example only supports a single window, therefore we assume the event + // occurred in the only view, the implicit view. + event.view_id = kImplicitViewId; FlutterEngineSendWindowMetricsEvent(g_state.engine, &event); } diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index e12ffe66ea76f..444a6e08ed048 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -2125,7 +2125,8 @@ FlutterEngineResult FlutterEngineSendWindowMetricsEvent( if (engine == nullptr || flutter_metrics == nullptr) { return LOG_EMBEDDER_ERROR(kInvalidArguments, "Engine handle was invalid."); } - int64_t view_id = SAFE_ACCESS(flutter_metrics, view_id, 0); + int64_t view_id = + SAFE_ACCESS(flutter_metrics, view_id, kFlutterImplicitViewId); flutter::ViewportMetrics metrics; diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index 0e308d770fcb8..6c6652f51d87c 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -43,7 +43,7 @@ namespace flutter { namespace testing { -static constexpr int64_t kImplicitViewId = 0ll; +static constexpr int64_t kImplicitViewId = 0; using EmbedderTest = testing::EmbedderTest; @@ -187,12 +187,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLFramebuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -310,12 +308,10 @@ TEST_F(EmbedderTest, RasterCacheDisabledWithPlatformViews) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -398,12 +394,10 @@ TEST_F(EmbedderTest, RasterCacheEnabled) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -529,12 +523,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToOpenGLTexture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -652,12 +644,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderToSoftwareBuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -861,12 +851,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderKnownScene) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1025,12 +1013,10 @@ TEST_F(EmbedderTest, CustomCompositorMustWorkWithCustomTaskRunner) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1115,12 +1101,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithRootLayerOnly) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1241,12 +1225,10 @@ TEST_F(EmbedderTest, CompositorMustBeAbleToRenderWithPlatformLayerOnBottom) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1465,13 +1447,11 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. Only the root surface is rotated. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1497,12 +1477,10 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1530,14 +1508,12 @@ TEST_F(EmbedderTest, CanRenderSceneWithoutCustomCompositorWithTransformation) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1561,12 +1537,10 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithoutCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1596,13 +1570,11 @@ TEST_F(EmbedderTest, CanRenderGradientWithoutCompositorWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1627,12 +1599,10 @@ TEST_P(EmbedderTestMultiBackend, CanRenderGradientWithCompositor) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1666,13 +1636,11 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -1801,12 +1769,10 @@ TEST_P(EmbedderTestMultiBackend, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index 90f99ee4d1070..0372702cc5063 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -50,12 +50,10 @@ // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); // TODO (https://github.com/flutter/flutter/issues/73590): re-enable once @@ -121,12 +119,10 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = texture_size.width(); event.height = texture_size.height(); event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(ImageMatchesFixture("external_texture_metal.png", rendered_scene)); @@ -233,12 +229,10 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -260,12 +254,10 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(ImageMatchesFixture("scene_without_custom_compositor.png", rendered_scene)); @@ -310,12 +302,10 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -507,13 +497,11 @@ GrBackendTexture backend_texture(texture_size.width(), texture_size.height(), // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. Only the root surface is rotated. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -568,12 +556,10 @@ void Collect() { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); latch.Wait(); diff --git a/shell/platform/glfw/flutter_glfw.cc b/shell/platform/glfw/flutter_glfw.cc index 9a5f5737675c7..18d1f758aa597 100644 --- a/shell/platform/glfw/flutter_glfw.cc +++ b/shell/platform/glfw/flutter_glfw.cc @@ -289,7 +289,6 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, // view ID when it does. int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index 1ecbaa8177046..55ce4f36bb79a 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -771,7 +771,6 @@ void fl_engine_send_window_metrics_event(FlEngine* self, // the real view ID when it does. int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(FlutterWindowMetricsEvent); event.width = width; event.height = height; diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index 60c7abadfaafc..8fcb334b59461 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -311,7 +311,6 @@ void FlutterWindowsView::SendWindowMetrics(size_t width, // Use the real view ID when it does. int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = width; event.height = height; From ba805a4fc794c73c7fbf5631853ab9e957052a76 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 15:25:47 -0800 Subject: [PATCH 09/17] Remove more unnecessary memset --- .../embedder/tests/embedder_gl_unittests.cc | 67 ------------------- .../embedder/tests/embedder_unittests.cc | 18 ----- 2 files changed, 85 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index 6c6652f51d87c..81f36c291f18d 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -1911,13 +1911,11 @@ TEST_F(EmbedderTest, CanRenderGradientWithCompositorOnNonRootLayerWithXform) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // Flutter still thinks it is 800 x 600. event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2014,7 +2012,6 @@ TEST_F(EmbedderTest, VerifyB141980393) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); // The Flutter application is 800 x 600 rendering on a surface 600 x 800 @@ -2022,7 +2019,6 @@ TEST_F(EmbedderTest, VerifyB141980393) { event.width = flutter_application_rect.width(); event.height = flutter_application_rect.height(); event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2064,12 +2060,10 @@ TEST_F(EmbedderTest, CanCreateEmbedderWithCustomRenderTaskRunner) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); task_latch.Wait(); @@ -2266,12 +2260,10 @@ TEST_P(EmbedderTestMultiBackend, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400 * 2.0; event.height = 300 * 2.0; event.pixel_ratio = 2.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2392,12 +2384,10 @@ TEST_F( // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400 * 2.0; event.height = 300 * 2.0; event.pixel_ratio = 2.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2428,12 +2418,10 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2470,12 +2458,10 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2593,12 +2579,10 @@ TEST_P(EmbedderTestMultiBackend, PlatformViewMutatorsAreValid) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2705,12 +2689,10 @@ TEST_F(EmbedderTest, PlatformViewMutatorsAreValidWithPixelRatio) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 2.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2824,12 +2806,10 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 2.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -2854,12 +2834,10 @@ TEST_F(EmbedderTest, EmptySceneIsAcceptable) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -2884,12 +2862,10 @@ TEST_F(EmbedderTest, SceneWithNoRootContainerIsAcceptable) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -2921,12 +2897,10 @@ TEST_F(EmbedderTest, ArcEndCapsAreDrawnCorrectly) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 1024; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3002,12 +2976,10 @@ TEST_F(EmbedderTest, ClipsAreCorrectlyCalculated) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 400; event.height = 300; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3088,12 +3060,10 @@ TEST_F(EmbedderTest, ComplexClipsAreCorrectlyCalculated) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3320,12 +3290,10 @@ TEST_F(EmbedderTest, CompositorCanPostZeroLayersForPresentation) { auto engine = builder.LaunchEngine(); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3385,12 +3353,10 @@ TEST_F(EmbedderTest, CompositorCanPostOnlyPlatformViews) { auto engine = builder.LaunchEngine(); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3426,12 +3392,10 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreRecycled) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3505,12 +3469,10 @@ TEST_F(EmbedderTest, CompositorRenderTargetsAreInStableOrder) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -3537,7 +3499,6 @@ TEST_F(EmbedderTest, FrameInfoContainsValidWidthAndHeight) { event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3665,12 +3626,10 @@ TEST_F(EmbedderTest, PresentInfoContainsValidFBOId) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -3746,12 +3705,10 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -3833,12 +3790,10 @@ TEST_F(EmbedderTest, PresentInfoReceivesEmptyDamage) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -3919,12 +3874,10 @@ TEST_F(EmbedderTest, PresentInfoReceivesPartialDamage) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); latch.Wait(); @@ -3984,12 +3937,10 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesValidID) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); } @@ -4034,12 +3985,10 @@ TEST_F(EmbedderTest, PopulateExistingDamageReceivesInvalidID) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); } @@ -4076,12 +4025,10 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithDisplayId) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display.refresh_rate); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4120,12 +4067,10 @@ TEST_F(EmbedderTest, SetSingleDisplayConfigurationWithoutDisplayId) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display.refresh_rate); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4171,12 +4116,10 @@ TEST_F(EmbedderTest, SetValidMultiDisplayConfiguration) { ASSERT_EQ(shell.GetMainDisplayRefreshRate(), display_1.refresh_rate); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4219,12 +4162,10 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSingleDisplayTrueIsInvalid) { ASSERT_NE(result, kSuccess); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4267,12 +4208,10 @@ TEST_F(EmbedderTest, MultipleDisplaysWithSameDisplayIdIsInvalid) { ASSERT_NE(result, kSuccess); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4310,12 +4249,10 @@ TEST_F(EmbedderTest, CompositorRenderTargetsNotRecycledWhenAvoidsCacheSet) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 300; event.height = 200; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -4474,12 +4411,10 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLTexture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -4539,12 +4474,10 @@ TEST_F(EmbedderTest, CreateInvalidBackingstoreOpenGLFramebuffer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index ee8109be50081..e96e56cd3179d 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -841,7 +841,6 @@ TEST_F(EmbedderTest, // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -850,7 +849,6 @@ TEST_F(EmbedderTest, event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -973,7 +971,6 @@ TEST_F(EmbedderTest, NoLayerCreatedForTransparentOverlayOnTopOfPlatformLayer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -982,7 +979,6 @@ TEST_F(EmbedderTest, NoLayerCreatedForTransparentOverlayOnTopOfPlatformLayer) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1111,7 +1107,6 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1120,7 +1115,6 @@ TEST_F(EmbedderTest, NoLayerCreatedForNoOverlayOnTopOfPlatformLayer) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1184,7 +1178,6 @@ TEST_F(EmbedderTest, CanDeinitializeAnEngine) { // Sending events to a deinitialized engine fails. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1193,7 +1186,6 @@ TEST_F(EmbedderTest, CanDeinitializeAnEngine) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kInvalidArguments); engine.reset(); @@ -1389,7 +1381,6 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1024; event.height = 600; @@ -1398,7 +1389,6 @@ TEST_F(EmbedderTest, VerifyB143464703WithSoftwareBackend) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); ASSERT_TRUE(engine.is_valid()); @@ -1883,7 +1873,6 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -1892,7 +1881,6 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; // Pixel ratio must be positive. ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), @@ -1903,7 +1891,6 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = -1.0; event.physical_view_inset_bottom = -1.0; event.physical_view_inset_left = -1.0; - event.view_id = kImplicitViewId; // Physical view insets must be non-negative. ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), @@ -1913,7 +1900,6 @@ TEST_F(EmbedderTest, InvalidFlutterWindowMetricsEvent) { event.physical_view_inset_right = 900; event.physical_view_inset_bottom = 700; event.physical_view_inset_left = 900; - event.view_id = kImplicitViewId; // Top/bottom insets cannot be greater than height. // Left/right insets cannot be greater than width. @@ -1958,12 +1944,10 @@ static void expectSoftwareRenderingOutputMatches( // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 1; event.height = 1; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); @@ -2582,7 +2566,6 @@ TEST_F(EmbedderTest, CanSetNextFrameCallback) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; @@ -2591,7 +2574,6 @@ TEST_F(EmbedderTest, CanSetNextFrameCallback) { event.physical_view_inset_right = 0.0; event.physical_view_inset_bottom = 0.0; event.physical_view_inset_left = 0.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); From 4f3d7e0a0b32b4baa0d5a6ad112b8dc56014620c Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 15:30:40 -0800 Subject: [PATCH 10/17] Fix more --- .../platform/embedder/tests/embedder_gl_unittests.cc | 2 -- shell/platform/embedder/tests/embedder_unittests.cc | 2 -- shell/platform/glfw/flutter_glfw.cc | 7 +++---- shell/platform/linux/fl_engine.cc | 8 ++++---- shell/platform/windows/flutter_windows_view.cc | 12 ++++++------ 5 files changed, 13 insertions(+), 18 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index 81f36c291f18d..caa0d340adf4d 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -2121,12 +2121,10 @@ TEST_P(EmbedderTestMultiBackend, ASSERT_TRUE(engine.is_valid()); FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); }); diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index e96e56cd3179d..5dd4590a39267 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2492,12 +2492,10 @@ TEST_F(EmbedderTest, VsyncCallbackPostedIntoFuture) { // Send a window metrics events so frames may be scheduled. FlutterWindowMetricsEvent event = {}; - memset(&event, 0, sizeof(FlutterWindowMetricsEvent)); event.struct_size = sizeof(event); event.width = 800; event.height = 600; event.pixel_ratio = 1.0; - event.view_id = kImplicitViewId; ASSERT_EQ(FlutterEngineSendWindowMetricsEvent(engine.get(), &event), kSuccess); diff --git a/shell/platform/glfw/flutter_glfw.cc b/shell/platform/glfw/flutter_glfw.cc index 18d1f758aa597..b00bab8cedbca 100644 --- a/shell/platform/glfw/flutter_glfw.cc +++ b/shell/platform/glfw/flutter_glfw.cc @@ -285,9 +285,6 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, double dpi = controller->window_wrapper->pixels_per_screen_coordinate * controller->monitor_screen_coordinates_per_inch; - // TODO(dkwingsmt): GLFW doesn't support multi-view for now. Use the real - // view ID when it does. - int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; event.struct_size = sizeof(event); event.width = width; @@ -300,7 +297,9 @@ static void SendWindowMetrics(FlutterDesktopWindowControllerState* controller, } else { event.pixel_ratio = controller->window_wrapper->pixel_ratio_override; } - event.view_id = view_id; + // The GLFW embedder doesn't support multiple views. We assume all pointer + // events come from the only view, the implicit view. + event.view_id = flutter::kFlutterImplicitViewId; FlutterEngineSendWindowMetricsEvent(controller->engine->flutter_engine, &event); } diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index 55ce4f36bb79a..6d4fdb568996c 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -767,15 +767,15 @@ void fl_engine_send_window_metrics_event(FlEngine* self, return; } - // TODO(dkwingsmt): The Linux embedder doesn't support multi-view for now. Use - // the real view ID when it does. - int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; event.struct_size = sizeof(FlutterWindowMetricsEvent); event.width = width; event.height = height; event.pixel_ratio = pixel_ratio; - event.view_id = view_id; + // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder + // supports multiple views. + // https://github.com/flutter/flutter/issues/138178 + fl_event.view_id = flutter::kFlutterImplicitViewId; self->embedder_api.SendWindowMetricsEvent(self->engine, &event); } diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index 8fcb334b59461..3d9e70574ef25 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -307,15 +307,15 @@ void FlutterWindowsView::OnResetImeComposing() { void FlutterWindowsView::SendWindowMetrics(size_t width, size_t height, double dpiScale) const { - // TODO(dkwingsmt): The Windows embedder doesn't support multi-view for now. - // Use the real view ID when it does. - int64_t view_id = flutter::kFlutterImplicitViewId; FlutterWindowMetricsEvent event = {}; event.struct_size = sizeof(event); event.width = width; event.height = height; event.pixel_ratio = dpiScale; - event.view_id = view_id; + // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder + // supports multiple views. + // https://github.com/flutter/flutter/issues/138179 + event.view_id = flutter::kFlutterImplicitViewId; engine_->SendWindowMetricsEvent(event); } @@ -552,8 +552,8 @@ void FlutterWindowsView::SendPointerEventWithData( event.device_kind = state->device_kind; event.device = state->pointer_id; event.buttons = state->buttons; - // TODO(dkwingsmt): Use the correct view ID for pointer events once the - // Windows embedder supports multiple views. + // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder + // supports multiple views. // https://github.com/flutter/flutter/issues/138179 event.view_id = flutter::kFlutterImplicitViewId; From f945f8fb16d806c9cbf47a447c48584f1425dd75 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 15:35:41 -0800 Subject: [PATCH 11/17] Remove unnecessary vars --- shell/platform/embedder/tests/embedder_gl_unittests.cc | 2 -- shell/platform/embedder/tests/embedder_metal_unittests.mm | 2 -- shell/platform/embedder/tests/embedder_unittests.cc | 2 -- 3 files changed, 6 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_gl_unittests.cc b/shell/platform/embedder/tests/embedder_gl_unittests.cc index caa0d340adf4d..dfca7ff6fb8a0 100644 --- a/shell/platform/embedder/tests/embedder_gl_unittests.cc +++ b/shell/platform/embedder/tests/embedder_gl_unittests.cc @@ -43,8 +43,6 @@ namespace flutter { namespace testing { -static constexpr int64_t kImplicitViewId = 0; - using EmbedderTest = testing::EmbedderTest; TEST_F(EmbedderTest, CanGetVulkanEmbedderContext) { diff --git a/shell/platform/embedder/tests/embedder_metal_unittests.mm b/shell/platform/embedder/tests/embedder_metal_unittests.mm index 0372702cc5063..c23a6553a5360 100644 --- a/shell/platform/embedder/tests/embedder_metal_unittests.mm +++ b/shell/platform/embedder/tests/embedder_metal_unittests.mm @@ -31,8 +31,6 @@ namespace flutter { namespace testing { -constexpr int64_t kImplicitViewId = 0ll; - using EmbedderTest = testing::EmbedderTest; TEST_F(EmbedderTest, CanRenderGradientWithMetal) { diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 5dd4590a39267..a9e0e72a919f0 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -52,8 +52,6 @@ static uint64_t NanosFromEpoch(int millis_from_now) { namespace flutter { namespace testing { -static constexpr int64_t kImplicitViewId = 0ll; - using EmbedderTest = testing::EmbedderTest; TEST(EmbedderTestNoFixture, MustNotRunWithInvalidArgs) { From cfda7f078d17258eaa473fffdc9e802e6118f7ca Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 16:42:11 -0800 Subject: [PATCH 12/17] WIP unit test --- shell/platform/embedder/fixtures/main.dart | 10 +++++ .../embedder/tests/embedder_unittests.cc | 43 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index 046692f6b8f92..fcee8c551bc72 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -1329,6 +1329,16 @@ void pointer_data_packet_view_id() { signalNativeTest(); } +@pragma('vm:entry-point') +void window_metrics_event_view_id() { + PlatformDispatcher.instance.onMetricsChanged = () { + signalNativeMessage('ViewID: ${event.viewId}'); + }; + + signalNativeTest(); +} + + @pragma('vm:entry-point') Future channel_listener_response() async { channelBuffers.setListener('test/listen', diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index a9e0e72a919f0..ec09ff1cc2250 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2668,7 +2668,7 @@ TEST_F(EmbedderTest, CanSendPointer) { /// Send a pointer event to Dart and wait until the Dart code echos with the /// view ID. -TEST_F(EmbedderTest, CanSendPointerWithViewId) { +TEST_F(EmbedderTest, CanSendPointerEventWithViewId) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); builder.SetSoftwareRendererConfig(); @@ -2708,6 +2708,47 @@ TEST_F(EmbedderTest, CanSendPointerWithViewId) { message_latch.Wait(); } +/// Send a window metrics event to Dart and wait until the Dart code echos with the +/// view ID. +TEST_F(EmbedderTest, CanSendWindowMetricsEventWithViewId) { + auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); + EmbedderConfigBuilder builder(context); + builder.SetSoftwareRendererConfig(); + builder.SetDartEntrypoint("window_metrics_event_view_id"); + + fml::AutoResetWaitableEvent ready_latch, count_latch, message_latch; + context.AddNativeCallback( + "SignalNativeTest", + CREATE_NATIVE_ENTRY( + [&ready_latch](Dart_NativeArguments args) { ready_latch.Signal(); })); + context.AddNativeCallback( + "SignalNativeMessage", + CREATE_NATIVE_ENTRY([&message_latch](Dart_NativeArguments args) { + auto message = tonic::DartConverter::FromDart( + Dart_GetNativeArgument(args, 0)); + ASSERT_EQ("ViewID: 2", message); + message_latch.Signal(); + })); + + auto engine = builder.LaunchEngine(); + ASSERT_TRUE(engine.is_valid()); + + ready_latch.Wait(); + + FlutterWindowMetricsEvent event = {}; + event.struct_size = sizeof(FlutterWindowMetricsEvent); + event.width = 200; + event.height = 300; + event.pixel_ratio = 1.5; + event.view_id = 2; + + FlutterEngineResult result = + FlutterEngineSendWindowMetricsEvent(engine.get(), &event); + ASSERT_EQ(result, kSuccess); + + message_latch.Wait(); +} + TEST_F(EmbedderTest, RegisterChannelListener) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); From 3860d023f7e868d0361fd5dd159ab5e599bd719d Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Wed, 20 Dec 2023 16:42:53 -0800 Subject: [PATCH 13/17] Format --- shell/platform/embedder/tests/embedder_unittests.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index ec09ff1cc2250..7e984e833249f 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2708,8 +2708,8 @@ TEST_F(EmbedderTest, CanSendPointerEventWithViewId) { message_latch.Wait(); } -/// Send a window metrics event to Dart and wait until the Dart code echos with the -/// view ID. +/// Send a window metrics event to Dart and wait until the Dart code echos with +/// the view ID. TEST_F(EmbedderTest, CanSendWindowMetricsEventWithViewId) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); From 0e8f61e8e83cece3f93b56fc9ca786ad05176fe5 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Mar 2024 13:55:10 -0700 Subject: [PATCH 14/17] WindowMetricsEventDefaultsToImplicitView --- shell/platform/embedder/fixtures/main.dart | 29 ++++++++++++++++++- .../embedder/tests/embedder_unittests.cc | 8 ++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index c4f71e0804281..9bf25cec86f8a 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -1334,10 +1334,37 @@ void pointer_data_packet_view_id() { signalNativeTest(); } +Map _getAllViewSizes() { + final Map result = {}; + for (final FlutterView view in PlatformDispatcher.instance.views) { + result[view.viewId] = view.physicalSize; + } + return result; +} + +List _findDifferences(Map a, Map b) { + final Set result = {}; + a.forEach((int viewId, Size sizeA) { + if (!b.containsKey(viewId) || b[viewId] != sizeA) { + result.add(viewId); + } + }); + b.forEach((int viewId, Size sizeB) { + if (!a.containsKey(viewId)) { + result.add(viewId); + } + }); + return result.toList()..sort(); +} + @pragma('vm:entry-point') void window_metrics_event_view_id() { + Map sizes = _getAllViewSizes(); PlatformDispatcher.instance.onMetricsChanged = () { - signalNativeMessage('ViewID: ${event.viewId}'); + final Map newSizes = _getAllViewSizes(); + final List differences = _findDifferences(sizes, newSizes); + sizes = newSizes; + signalNativeMessage('Changed: $differences'); }; signalNativeTest(); diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 39a8ae8fe09ea..16dc0ba8ccc5b 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2766,9 +2766,7 @@ TEST_F(EmbedderTest, CanSendPointerEventWithViewId) { message_latch.Wait(); } -/// Send a window metrics event to Dart and wait until the Dart code echos with -/// the view ID. -TEST_F(EmbedderTest, CanSendWindowMetricsEventWithViewId) { +TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); EmbedderConfigBuilder builder(context); builder.SetSoftwareRendererConfig(); @@ -2784,7 +2782,7 @@ TEST_F(EmbedderTest, CanSendWindowMetricsEventWithViewId) { CREATE_NATIVE_ENTRY([&message_latch](Dart_NativeArguments args) { auto message = tonic::DartConverter::FromDart( Dart_GetNativeArgument(args, 0)); - ASSERT_EQ("ViewID: 2", message); + ASSERT_EQ("Changed: [0]", message); message_latch.Signal(); })); @@ -2798,7 +2796,7 @@ TEST_F(EmbedderTest, CanSendWindowMetricsEventWithViewId) { event.width = 200; event.height = 300; event.pixel_ratio = 1.5; - event.view_id = 2; + // Don't assign event.view_id here to test the default behavior. FlutterEngineResult result = FlutterEngineSendWindowMetricsEvent(engine.get(), &event); From b36c2dac588c7c73cede5f6ba8347f7c2f93ee96 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Mar 2024 13:56:05 -0700 Subject: [PATCH 15/17] Empty line --- shell/platform/embedder/fixtures/main.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/shell/platform/embedder/fixtures/main.dart b/shell/platform/embedder/fixtures/main.dart index 9bf25cec86f8a..7270526b830e1 100644 --- a/shell/platform/embedder/fixtures/main.dart +++ b/shell/platform/embedder/fixtures/main.dart @@ -1370,7 +1370,6 @@ void window_metrics_event_view_id() { signalNativeTest(); } - @pragma('vm:entry-point') Future channel_listener_response() async { channelBuffers.setListener('test/listen', From 77b429be075b4b5ff641deff73505d3067f33362 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Mar 2024 13:58:30 -0700 Subject: [PATCH 16/17] Windows has view id --- shell/platform/embedder/tests/embedder_unittests.cc | 2 +- shell/platform/windows/flutter_windows_view.cc | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index 16dc0ba8ccc5b..c766adb039151 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2796,7 +2796,7 @@ TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { event.width = 200; event.height = 300; event.pixel_ratio = 1.5; - // Don't assign event.view_id here to test the default behavior. + // Skip assigning event.view_id here to test the default behavior. FlutterEngineResult result = FlutterEngineSendWindowMetricsEvent(engine.get(), &event); diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index b065a049a449b..58815373945c3 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -352,10 +352,7 @@ void FlutterWindowsView::SendWindowMetrics(size_t width, event.width = width; event.height = height; event.pixel_ratio = dpiScale; - // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder - // supports multiple views. - // https://github.com/flutter/flutter/issues/138179 - event.view_id = flutter::kFlutterImplicitViewId; + event.view_id = view_id(); engine_->SendWindowMetricsEvent(event); } @@ -592,10 +589,7 @@ void FlutterWindowsView::SendPointerEventWithData( event.device_kind = state->device_kind; event.device = state->pointer_id; event.buttons = state->buttons; - // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder - // supports multiple views. - // https://github.com/flutter/flutter/issues/138179 - event.view_id = flutter::kFlutterImplicitViewId; + event.view_id = view_id(); // Set metadata that's always the same regardless of the event. event.struct_size = sizeof(event); From 19e6b65db656f7905bb9540354a3f3c38c46fd30 Mon Sep 17 00:00:00 2001 From: Tong Mu Date: Tue, 12 Mar 2024 15:50:31 -0700 Subject: [PATCH 17/17] Comments --- shell/platform/embedder/embedder.cc | 2 +- .../embedder/tests/embedder_unittests.cc | 62 ++++++++++++++++++- shell/platform/linux/fl_engine.cc | 2 +- .../platform/windows/flutter_windows_view.cc | 4 +- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index ce2bd670eb3f7..81bbfa1c2deea 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -2143,7 +2143,7 @@ FlutterEngineResult FlutterEngineSendWindowMetricsEvent( if (engine == nullptr || flutter_metrics == nullptr) { return LOG_EMBEDDER_ERROR(kInvalidArguments, "Engine handle was invalid."); } - int64_t view_id = + FlutterViewId view_id = SAFE_ACCESS(flutter_metrics, view_id, kFlutterImplicitViewId); flutter::ViewportMetrics metrics; diff --git a/shell/platform/embedder/tests/embedder_unittests.cc b/shell/platform/embedder/tests/embedder_unittests.cc index c766adb039151..a33c133ecb024 100644 --- a/shell/platform/embedder/tests/embedder_unittests.cc +++ b/shell/platform/embedder/tests/embedder_unittests.cc @@ -2772,7 +2772,7 @@ TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { builder.SetSoftwareRendererConfig(); builder.SetDartEntrypoint("window_metrics_event_view_id"); - fml::AutoResetWaitableEvent ready_latch, count_latch, message_latch; + fml::AutoResetWaitableEvent ready_latch, message_latch; context.AddNativeCallback( "SignalNativeTest", CREATE_NATIVE_ENTRY( @@ -2792,7 +2792,9 @@ TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { ready_latch.Wait(); FlutterWindowMetricsEvent event = {}; - event.struct_size = sizeof(FlutterWindowMetricsEvent); + // Simulate an event that comes from an old version of embedder.h that doesn't + // have the view_id field. + event.struct_size = offsetof(FlutterWindowMetricsEvent, view_id); event.width = 200; event.height = 300; event.pixel_ratio = 1.5; @@ -2805,6 +2807,62 @@ TEST_F(EmbedderTest, WindowMetricsEventDefaultsToImplicitView) { message_latch.Wait(); } +TEST_F(EmbedderTest, IgnoresWindowMetricsEventForUnknownView) { + auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); + EmbedderConfigBuilder builder(context); + builder.SetSoftwareRendererConfig(); + builder.SetDartEntrypoint("window_metrics_event_view_id"); + + fml::AutoResetWaitableEvent ready_latch, message_latch; + context.AddNativeCallback( + "SignalNativeTest", + CREATE_NATIVE_ENTRY( + [&ready_latch](Dart_NativeArguments args) { ready_latch.Signal(); })); + + context.AddNativeCallback( + "SignalNativeMessage", + CREATE_NATIVE_ENTRY([&message_latch](Dart_NativeArguments args) { + auto message = tonic::DartConverter::FromDart( + Dart_GetNativeArgument(args, 0)); + // Message latch should only be signaled once as the bad + // view metric should be dropped by the engine. + ASSERT_FALSE(message_latch.IsSignaledForTest()); + ASSERT_EQ("Changed: [0]", message); + message_latch.Signal(); + })); + + auto engine = builder.LaunchEngine(); + ASSERT_TRUE(engine.is_valid()); + + ready_latch.Wait(); + + // Send a window metric for a nonexistent view, which should be dropped by the + // engine. + FlutterWindowMetricsEvent bad_event = {}; + bad_event.struct_size = sizeof(FlutterWindowMetricsEvent); + bad_event.width = 200; + bad_event.height = 300; + bad_event.pixel_ratio = 1.5; + bad_event.view_id = 100; + + FlutterEngineResult result = + FlutterEngineSendWindowMetricsEvent(engine.get(), &bad_event); + ASSERT_EQ(result, kSuccess); + + // Send a window metric for a valid view. The engine notifies the Dart app. + FlutterWindowMetricsEvent event = {}; + event.struct_size = sizeof(FlutterWindowMetricsEvent); + event.width = 200; + event.height = 300; + event.pixel_ratio = 1.5; + event.view_id = 0; + + result = FlutterEngineSendWindowMetricsEvent(engine.get(), &event); + ASSERT_EQ(result, kSuccess); + + message_latch.Wait(); +} + TEST_F(EmbedderTest, RegisterChannelListener) { auto& context = GetEmbedderContext(EmbedderTestContextType::kSoftwareContext); diff --git a/shell/platform/linux/fl_engine.cc b/shell/platform/linux/fl_engine.cc index d5986bcc74787..f2c8040aa41d2 100644 --- a/shell/platform/linux/fl_engine.cc +++ b/shell/platform/linux/fl_engine.cc @@ -763,7 +763,7 @@ void fl_engine_send_window_metrics_event(FlEngine* self, // TODO(dkwingsmt): Assign the correct view ID once the Linux embedder // supports multiple views. // https://github.com/flutter/flutter/issues/138178 - fl_event.view_id = flutter::kFlutterImplicitViewId; + event.view_id = flutter::kFlutterImplicitViewId; self->embedder_api.SendWindowMetricsEvent(self->engine, &event); } diff --git a/shell/platform/windows/flutter_windows_view.cc b/shell/platform/windows/flutter_windows_view.cc index 58815373945c3..f8a87c825979f 100644 --- a/shell/platform/windows/flutter_windows_view.cc +++ b/shell/platform/windows/flutter_windows_view.cc @@ -352,7 +352,7 @@ void FlutterWindowsView::SendWindowMetrics(size_t width, event.width = width; event.height = height; event.pixel_ratio = dpiScale; - event.view_id = view_id(); + event.view_id = view_id_; engine_->SendWindowMetricsEvent(event); } @@ -589,7 +589,7 @@ void FlutterWindowsView::SendPointerEventWithData( event.device_kind = state->device_kind; event.device = state->pointer_id; event.buttons = state->buttons; - event.view_id = view_id(); + event.view_id = view_id_; // Set metadata that's always the same regardless of the event. event.struct_size = sizeof(event);