Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit c3485fa

Browse files
author
Chris Yang
committed
fix
remove from slice test
1 parent 7abb06a commit c3485fa

File tree

2 files changed

+84
-0
lines changed

2 files changed

+84
-0
lines changed

shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,17 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect,
876876
current_composition_params_.erase(viewId);
877877
clip_count_.erase(viewId);
878878
views_to_recomposite_.erase(viewId);
879+
slices_.erase(viewId);
879880
}
881+
882+
composition_order_.erase(
883+
std::remove_if(composition_order_.begin(), composition_order_.end(),
884+
[views_to_dispose = views_to_dispose_](const int64_t viewId) {
885+
FML_DCHECK(views_to_dispose.count(viewId) < 2);
886+
return views_to_dispose.count(viewId) > 0;
887+
}),
888+
composition_order_.end());
889+
880890
views_to_dispose_.clear();
881891
}
882892

shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)