@@ -87,6 +87,7 @@ std::unique_ptr<FlutterWindowsEngine> GetTestEngine(
8787 GetTestProject (), std::move (windows_proc_table));
8888
8989 EngineModifier modifier (engine.get ());
90+ modifier.SetEGLManager (nullptr );
9091
9192 auto key_response_controller = std::make_shared<MockKeyResponseController>();
9293 key_response_controller->SetChannelResponse (
@@ -243,25 +244,38 @@ TEST(FlutterWindowsViewTest, Shutdown) {
243244 std::make_unique<NiceMock<MockWindowBindingHandler>>();
244245 auto egl_manager = std::make_unique<egl::MockManager>();
245246 auto surface = std::make_unique<egl::MockWindowSurface>();
247+ egl::MockContext render_context;
246248
247249 auto engine_ptr = engine.get ();
248250 auto surface_ptr = surface.get ();
251+ auto egl_manager_ptr = egl_manager.get ();
249252
250253 EngineModifier modifier{engine.get ()};
251254 modifier.SetEGLManager (std::move (egl_manager));
252255
256+ InSequence s;
257+ std::unique_ptr<FlutterWindowsView> view;
258+
259+ // Mock render surface initialization.
253260 {
254- std::unique_ptr<FlutterWindowsView> view =
255- engine->CreateView (std::move (window_binding_handler));
261+ EXPECT_CALL (*egl_manager_ptr, CreateWindowSurface)
262+ .WillOnce (Return (std::move (surface)));
263+ EXPECT_CALL (*engine_ptr, running).WillOnce (Return (false ));
264+ EXPECT_CALL (*surface_ptr, IsValid).WillOnce (Return (true ));
265+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
266+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
267+ EXPECT_CALL (*egl_manager_ptr, render_context)
268+ .WillOnce (Return (&render_context));
269+ EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
270+
271+ view = engine->CreateView (std::move (window_binding_handler));
272+ }
256273
274+ // The view must be removed before the surface can be destroyed.
275+ {
257276 auto view_id = view->view_id ();
258- ViewModifier view_modifier{view.get ()};
259- view_modifier.SetSurface (std::move (surface));
260-
261277 FlutterWindowsViewController controller{std::move (engine), std::move (view)};
262278
263- // The view must be removed before the surface can be destroyed.
264- InSequence s;
265279 EXPECT_CALL (*engine_ptr, running).WillOnce (Return (true ));
266280 EXPECT_CALL (*engine_ptr, RemoveView (view_id)).Times (1 );
267281 EXPECT_CALL (*engine_ptr, running).WillOnce (Return (true ));
@@ -843,11 +857,22 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
843857 auto egl_manager = std::make_unique<egl::MockManager>();
844858 auto surface = std::make_unique<egl::MockWindowSurface>();
845859 auto resized_surface = std::make_unique<egl::MockWindowSurface>();
860+ egl::MockContext render_context;
861+
862+ auto surface_ptr = surface.get ();
846863 auto resized_surface_ptr = resized_surface.get ();
847864
848- EXPECT_CALL (*surface.get (), IsValid).WillRepeatedly (Return (true ));
849- EXPECT_CALL (*surface.get (), Destroy).WillOnce (Return (true ));
865+ // Mock render surface creation
866+ EXPECT_CALL (*egl_manager, CreateWindowSurface)
867+ .WillOnce (Return (std::move (surface)));
868+ EXPECT_CALL (*surface_ptr, IsValid).WillRepeatedly (Return (true ));
869+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
870+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
871+ EXPECT_CALL (*egl_manager, render_context).WillOnce (Return (&render_context));
872+ EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
850873
874+ // Mock render surface resize
875+ EXPECT_CALL (*surface_ptr, Destroy).WillOnce (Return (true ));
851876 EXPECT_CALL (*egl_manager.get (),
852877 CreateWindowSurface (_, /* width=*/ 500 , /* height=*/ 500 ))
853878 .WillOnce (Return (std::move ((resized_surface))));
@@ -862,9 +887,6 @@ TEST(FlutterWindowsViewTest, WindowResizeTests) {
862887 std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
863888 std::make_unique<NiceMock<MockWindowBindingHandler>>());
864889
865- ViewModifier view_modifier{view.get ()};
866- view_modifier.SetSurface (std::move (surface));
867-
868890 fml::AutoResetWaitableEvent metrics_sent_latch;
869891 engine_modifier.embedder_api ().SendWindowMetricsEvent = MOCK_ENGINE_PROC (
870892 SendWindowMetricsEvent,
@@ -1441,8 +1463,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAtStartup) {
14411463
14421464 std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
14431465 std::make_unique<NiceMock<MockWindowBindingHandler>>());
1444-
1445- view->CreateRenderSurface ();
14461466}
14471467
14481468// Blocks until the v-blank if it is enabled by the window.
@@ -1478,8 +1498,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAtStartup) {
14781498
14791499 std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
14801500 std::make_unique<NiceMock<MockWindowBindingHandler>>());
1481-
1482- view->CreateRenderSurface ();
14831501}
14841502
14851503// Don't block until the v-blank if it is disabled by the window.
@@ -1523,8 +1541,6 @@ TEST(FlutterWindowsViewTest, DisablesVSyncAfterStartup) {
15231541
15241542 std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
15251543 std::make_unique<NiceMock<MockWindowBindingHandler>>());
1526-
1527- view->CreateRenderSurface ();
15281544}
15291545
15301546// Blocks until the v-blank if it is enabled by the window.
@@ -1571,8 +1587,6 @@ TEST(FlutterWindowsViewTest, EnablesVSyncAfterStartup) {
15711587
15721588 std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
15731589 std::make_unique<NiceMock<MockWindowBindingHandler>>());
1574-
1575- view->CreateRenderSurface ();
15761590}
15771591
15781592// Desktop Window Manager composition can be disabled on Windows 7.
@@ -1594,36 +1608,49 @@ TEST(FlutterWindowsViewTest, UpdatesVSyncOnDwmUpdates) {
15941608 return true ;
15951609 });
15961610
1597- EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1598- .WillOnce (Return (false ))
1599- .WillOnce (Return (true ));
1600-
16011611 EXPECT_CALL (*egl_manager.get (), render_context)
16021612 .WillRepeatedly (Return (&render_context));
16031613
16041614 EXPECT_CALL (*surface_ptr, IsValid).WillRepeatedly (Return (true ));
1615+ EXPECT_CALL (*surface_ptr, MakeCurrent).WillRepeatedly (Return (true ));
1616+ EXPECT_CALL (*surface_ptr, Destroy).Times (1 );
1617+ EXPECT_CALL (render_context, ClearCurrent).WillRepeatedly (Return (true ));
16051618
16061619 InSequence s;
1607- EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
1608- EXPECT_CALL (*surface_ptr, SetVSyncEnabled (true )).WillOnce (Return (true ));
1609- EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
16101620
1611- EXPECT_CALL (*surface_ptr, MakeCurrent).WillOnce (Return (true ));
1612- EXPECT_CALL (*surface_ptr, SetVSyncEnabled (false )).WillOnce (Return (true ));
1613- EXPECT_CALL (render_context, ClearCurrent).WillOnce (Return (true ));
1621+ // Mock render surface initialization.
1622+ std::unique_ptr<FlutterWindowsView> view;
1623+ {
1624+ EXPECT_CALL (*egl_manager, CreateWindowSurface)
1625+ .WillOnce (Return (std::move (surface)));
1626+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1627+ .WillOnce (Return (true ));
1628+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled).WillOnce (Return (true ));
16141629
1615- EXPECT_CALL (*surface_ptr, Destroy).Times (1 );
1630+ EngineModifier engine_modifier{engine.get ()};
1631+ engine_modifier.SetEGLManager (std::move (egl_manager));
16161632
1617- EngineModifier engine_modifier{engine.get ()};
1618- engine_modifier.SetEGLManager (std::move (egl_manager));
1633+ view = engine->CreateView (
1634+ std::make_unique<NiceMock<MockWindowBindingHandler>>());
1635+ }
16191636
1620- std::unique_ptr<FlutterWindowsView> view = engine->CreateView (
1621- std::make_unique<NiceMock<MockWindowBindingHandler>>());
1622- ViewModifier view_modifier{view.get ()};
1623- view_modifier.SetSurface (std::move (surface));
1637+ // Disabling DWM composition should enable vsync blocking on the surface.
1638+ {
1639+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1640+ .WillOnce (Return (false ));
1641+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled (true )).WillOnce (Return (true ));
16241642
1625- engine->OnDwmCompositionChanged ();
1626- engine->OnDwmCompositionChanged ();
1643+ engine->OnDwmCompositionChanged ();
1644+ }
1645+
1646+ // Enabling DWM composition should disable vsync blocking on the surface.
1647+ {
1648+ EXPECT_CALL (*windows_proc_table.get (), DwmIsCompositionEnabled)
1649+ .WillOnce (Return (true ));
1650+ EXPECT_CALL (*surface_ptr, SetVSyncEnabled (false )).WillOnce (Return (true ));
1651+
1652+ engine->OnDwmCompositionChanged ();
1653+ }
16271654}
16281655
16291656} // namespace testing
0 commit comments