@@ -2727,7 +2727,7 @@ TEST_F(EmbedderTest, CanSendPointer) {
2727
2727
2728
2728
// / Send a pointer event to Dart and wait until the Dart code echos with the
2729
2729
// / view ID.
2730
- TEST_F (EmbedderTest, CanSendPointerWithViewId ) {
2730
+ TEST_F (EmbedderTest, CanSendPointerEventWithViewId ) {
2731
2731
auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
2732
2732
EmbedderConfigBuilder builder (context);
2733
2733
builder.SetSoftwareRendererConfig ();
@@ -2767,6 +2767,103 @@ TEST_F(EmbedderTest, CanSendPointerWithViewId) {
2767
2767
message_latch.Wait ();
2768
2768
}
2769
2769
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
+
2770
2867
TEST_F (EmbedderTest, RegisterChannelListener) {
2771
2868
auto & context = GetEmbedderContext (EmbedderTestContextType::kSoftwareContext );
2772
2869
0 commit comments