@@ -2727,7 +2727,7 @@ TEST_F(EmbedderTest, CanSendPointer) {
27272727
27282728// / Send a pointer event to Dart and wait until the Dart code echos with the
27292729// / view ID.
2730- TEST_F (EmbedderTest, CanSendPointerWithViewId ) {
2730+ TEST_F (EmbedderTest, CanSendPointerEventWithViewId ) {
27312731 auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
27322732 EmbedderConfigBuilder builder (context);
27332733 builder.SetSoftwareRendererConfig ();
@@ -2767,6 +2767,103 @@ TEST_F(EmbedderTest, CanSendPointerWithViewId) {
27672767 message_latch.Wait ();
27682768}
27692769
2770+ TEST_F (EmbedderTest, WindowMetricsEventDefaultsToImplicitView) {
2771+ auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
2772+ EmbedderConfigBuilder builder (context);
2773+ builder.SetSoftwareRendererConfig ();
2774+ builder.SetDartEntrypoint (" window_metrics_event_view_id" );
2775+
2776+ fml::AutoResetWaitableEvent ready_latch, message_latch;
2777+ context.AddNativeCallback (
2778+ " SignalNativeTest" ,
2779+ CREATE_NATIVE_ENTRY (
2780+ [&ready_latch](Dart_NativeArguments args) { ready_latch.Signal (); }));
2781+ context.AddNativeCallback (
2782+ " SignalNativeMessage" ,
2783+ CREATE_NATIVE_ENTRY ([&message_latch](Dart_NativeArguments args) {
2784+ auto message = tonic::DartConverter<std::string>::FromDart (
2785+ Dart_GetNativeArgument (args, 0 ));
2786+ ASSERT_EQ (" Changed: [0]" , message);
2787+ message_latch.Signal ();
2788+ }));
2789+
2790+ auto engine = builder.LaunchEngine ();
2791+ ASSERT_TRUE (engine.is_valid ());
2792+
2793+ ready_latch.Wait ();
2794+
2795+ FlutterWindowMetricsEvent event = {};
2796+ // Simulate an event that comes from an old version of embedder.h that doesn't
2797+ // have the view_id field.
2798+ event.struct_size = offsetof (FlutterWindowMetricsEvent, view_id);
2799+ event.width = 200 ;
2800+ event.height = 300 ;
2801+ event.pixel_ratio = 1.5 ;
2802+ // Skip assigning event.view_id here to test the default behavior.
2803+
2804+ FlutterEngineResult result =
2805+ FlutterEngineSendWindowMetricsEvent (engine.get (), &event);
2806+ ASSERT_EQ (result, kSuccess );
2807+
2808+ message_latch.Wait ();
2809+ }
2810+
2811+ TEST_F (EmbedderTest, IgnoresWindowMetricsEventForUnknownView) {
2812+ auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
2813+ EmbedderConfigBuilder builder (context);
2814+ builder.SetSoftwareRendererConfig ();
2815+ builder.SetDartEntrypoint (" window_metrics_event_view_id" );
2816+
2817+ fml::AutoResetWaitableEvent ready_latch, message_latch;
2818+ context.AddNativeCallback (
2819+ " SignalNativeTest" ,
2820+ CREATE_NATIVE_ENTRY (
2821+ [&ready_latch](Dart_NativeArguments args) { ready_latch.Signal (); }));
2822+
2823+ context.AddNativeCallback (
2824+ " SignalNativeMessage" ,
2825+ CREATE_NATIVE_ENTRY ([&message_latch](Dart_NativeArguments args) {
2826+ auto message = tonic::DartConverter<std::string>::FromDart (
2827+ Dart_GetNativeArgument (args, 0 ));
2828+ // Message latch should only be signaled once as the bad
2829+ // view metric should be dropped by the engine.
2830+ ASSERT_FALSE (message_latch.IsSignaledForTest ());
2831+ ASSERT_EQ (" Changed: [0]" , message);
2832+ message_latch.Signal ();
2833+ }));
2834+
2835+ auto engine = builder.LaunchEngine ();
2836+ ASSERT_TRUE (engine.is_valid ());
2837+
2838+ ready_latch.Wait ();
2839+
2840+ // Send a window metric for a nonexistent view, which should be dropped by the
2841+ // engine.
2842+ FlutterWindowMetricsEvent bad_event = {};
2843+ bad_event.struct_size = sizeof (FlutterWindowMetricsEvent);
2844+ bad_event.width = 200 ;
2845+ bad_event.height = 300 ;
2846+ bad_event.pixel_ratio = 1.5 ;
2847+ bad_event.view_id = 100 ;
2848+
2849+ FlutterEngineResult result =
2850+ FlutterEngineSendWindowMetricsEvent (engine.get (), &bad_event);
2851+ ASSERT_EQ (result, kSuccess );
2852+
2853+ // Send a window metric for a valid view. The engine notifies the Dart app.
2854+ FlutterWindowMetricsEvent event = {};
2855+ event.struct_size = sizeof (FlutterWindowMetricsEvent);
2856+ event.width = 200 ;
2857+ event.height = 300 ;
2858+ event.pixel_ratio = 1.5 ;
2859+ event.view_id = 0 ;
2860+
2861+ result = FlutterEngineSendWindowMetricsEvent (engine.get (), &event);
2862+ ASSERT_EQ (result, kSuccess );
2863+
2864+ message_latch.Wait ();
2865+ }
2866+
27702867TEST_F (EmbedderTest, RegisterChannelListener) {
27712868 auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
27722869
0 commit comments