@@ -287,9 +287,79 @@ void testMain() {
287287 } on AssertionError catch (error) {
288288 expect (
289289 error.toString (),
290- 'Assertion failed: "Cannot render platform view 0. It has not been created, or it has been deleted."' ,
290+ 'Assertion failed: "Cannot render platform views: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. These views have not been created, or they have been deleted."' ,
291291 );
292292 }
293+
294+ // Frame 7:
295+ // Render: a platform view after error.
296+ // Expect: success. Just checking the system is not left in a corrupted state.
297+ await _createPlatformView (0 , 'test-platform-view' );
298+ renderTestScene (viewCount: 0 );
299+ });
300+
301+ test ('embeds and disposes of a platform view' , () async {
302+ ui.platformViewRegistry.registerViewFactory (
303+ 'test-platform-view' ,
304+ (viewId) => html.DivElement ()..id = 'view-0' ,
305+ );
306+ await _createPlatformView (0 , 'test-platform-view' );
307+
308+ final EnginePlatformDispatcher dispatcher =
309+ ui.window.platformDispatcher as EnginePlatformDispatcher ;
310+
311+ LayerSceneBuilder sb = LayerSceneBuilder ();
312+ sb.pushOffset (0 , 0 );
313+ sb.addPlatformView (0 , width: 10 , height: 10 );
314+ dispatcher.rasterizer! .draw (sb.build ().layerTree);
315+
316+ expect (
317+ domRenderer.sceneElement! .querySelectorAll ('#view-0' ),
318+ hasLength (1 ),
319+ );
320+
321+ await _disposePlatformView (0 );
322+
323+ sb = LayerSceneBuilder ();
324+ sb.pushOffset (0 , 0 );
325+ dispatcher.rasterizer! .draw (sb.build ().layerTree);
326+
327+ expect (
328+ domRenderer.sceneElement! .querySelectorAll ('#view-0' ),
329+ hasLength (0 ),
330+ );
331+ });
332+
333+ test ('removed the DOM node of an unrendered platform view' , () async {
334+ ui.platformViewRegistry.registerViewFactory (
335+ 'test-platform-view' ,
336+ (viewId) => html.DivElement ()..id = 'view-0' ,
337+ );
338+ await _createPlatformView (0 , 'test-platform-view' );
339+
340+ final EnginePlatformDispatcher dispatcher =
341+ ui.window.platformDispatcher as EnginePlatformDispatcher ;
342+
343+ LayerSceneBuilder sb = LayerSceneBuilder ();
344+ sb.pushOffset (0 , 0 );
345+ sb.addPlatformView (0 , width: 10 , height: 10 );
346+ dispatcher.rasterizer! .draw (sb.build ().layerTree);
347+
348+ expect (
349+ domRenderer.sceneElement! .querySelectorAll ('#view-0' ),
350+ hasLength (1 ),
351+ );
352+
353+ // Render a frame without a platform view, but also without disposing of
354+ // the platform view.
355+ sb = LayerSceneBuilder ();
356+ sb.pushOffset (0 , 0 );
357+ dispatcher.rasterizer! .draw (sb.build ().layerTree);
358+
359+ expect (
360+ domRenderer.sceneElement! .querySelectorAll ('#view-0' ),
361+ hasLength (0 ),
362+ );
293363 });
294364 // TODO: https://github.com/flutter/flutter/issues/60040
295365 }, skip: isIosSafari);
@@ -311,3 +381,13 @@ Future<void> _createPlatformView(int id, String viewType) {
311381 );
312382 return completer.future;
313383}
384+
385+ Future <void > _disposePlatformView (int id) {
386+ final completer = Completer <void >();
387+ window.sendPlatformMessage (
388+ 'flutter/platform_views' ,
389+ codec.encodeMethodCall (MethodCall ('dispose' , id)),
390+ (dynamic _) => completer.complete (),
391+ );
392+ return completer.future;
393+ }
0 commit comments