@@ -2790,4 +2790,78 @@ - (BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
27902790 return NO ;
27912791}
27922792
2793+ - (void )testDisposingViewInCompositionOrderDoNotCrash {
2794+ flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2795+ auto thread_task_runner = CreateNewThread (" FlutterPlatformViewsTest" );
2796+ flutter::TaskRunners runners (/* label=*/ self.name .UTF8String ,
2797+ /* platform=*/ thread_task_runner,
2798+ /* raster=*/ thread_task_runner,
2799+ /* ui=*/ thread_task_runner,
2800+ /* io=*/ thread_task_runner);
2801+ auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2802+ auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2803+ /* delegate=*/ mock_delegate,
2804+ /* rendering_api=*/ flutter::IOSRenderingAPI::kSoftware ,
2805+ /* platform_views_controller=*/ flutterPlatformViewsController,
2806+ /* task_runners=*/ runners);
2807+
2808+ UIView* mockFlutterView = [[[UIView alloc ] initWithFrame: CGRectMake (0 , 0 , 500 , 500 )] autorelease ];
2809+ flutterPlatformViewsController->SetFlutterView (mockFlutterView);
2810+
2811+ FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
2812+ [[FlutterPlatformViewsTestMockFlutterPlatformFactory new ] autorelease ];
2813+ flutterPlatformViewsController->RegisterViewFactory (
2814+ factory, @" MockFlutterPlatformView" ,
2815+ FlutterPlatformViewGestureRecognizersBlockingPolicyEager);
2816+ FlutterResult result = ^(id result) {
2817+ };
2818+
2819+ flutterPlatformViewsController->OnMethodCall (
2820+ [FlutterMethodCall
2821+ methodCallWithMethodName: @" create"
2822+ arguments: @{@" id" : @0 , @" viewType" : @" MockFlutterPlatformView" }],
2823+ result);
2824+ flutterPlatformViewsController->OnMethodCall (
2825+ [FlutterMethodCall
2826+ methodCallWithMethodName: @" create"
2827+ arguments: @{@" id" : @1 , @" viewType" : @" MockFlutterPlatformView" }],
2828+ result);
2829+
2830+ // First frame, |EmbeddedViewCount| is not empty after composite.
2831+ flutterPlatformViewsController->BeginFrame (SkISize::Make (300 , 300 ));
2832+ flutter::MutatorsStack stack;
2833+ SkMatrix finalMatrix;
2834+ auto embeddedViewParams0 =
2835+ std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make (300 , 300 ), stack);
2836+ flutterPlatformViewsController->PrerollCompositeEmbeddedView (0 , std::move (embeddedViewParams0));
2837+ flutterPlatformViewsController->CompositeEmbeddedView (0 );
2838+
2839+ auto embeddedViewParams1 =
2840+ std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make (300 , 300 ), stack);
2841+ flutterPlatformViewsController->PrerollCompositeEmbeddedView (1 , std::move (embeddedViewParams1));
2842+ flutterPlatformViewsController->CompositeEmbeddedView (1 );
2843+ XCTAssertEqual (flutterPlatformViewsController->EmbeddedViewCount (), 2UL );
2844+
2845+ XCTestExpectation* expectation = [self expectationWithDescription: @" dispose call ended." ];
2846+ FlutterResult disposeResult = ^(id result) {
2847+ [expectation fulfill ];
2848+ };
2849+
2850+ flutterPlatformViewsController->OnMethodCall (
2851+ [FlutterMethodCall methodCallWithMethodName: @" dispose" arguments: @0 ], disposeResult);
2852+ [self waitForExpectationsWithTimeout: 30 handler: nil ];
2853+
2854+ const SkImageInfo image_info = SkImageInfo::MakeN32Premul (1000 , 1000 );
2855+ sk_sp<SkSurface> mock_sk_surface = SkSurface::MakeRaster (image_info);
2856+ flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
2857+ auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2858+ std::move (mock_sk_surface), framebuffer_info,
2859+ [](const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) { return true ; },
2860+ /* frame_size=*/ SkISize::Make (800 , 600 ));
2861+ XCTAssertTrue (
2862+ flutterPlatformViewsController->SubmitFrame (nullptr , nullptr , std::move (mock_surface)));
2863+
2864+ XCTAssertEqual (flutterPlatformViewsController->EmbeddedViewCount (), 1UL );
2865+ }
2866+
27932867@end
0 commit comments