@@ -2649,12 +2649,15 @@ - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
2649
2649
[[[FlutterClippingMaskViewPool alloc ] initWithCapacity: 2 ] autorelease ];
2650
2650
FlutterClippingMaskView* view1 = [pool getMaskViewWithFrame: CGRectZero ];
2651
2651
FlutterClippingMaskView* view2 = [pool getMaskViewWithFrame: CGRectZero ];
2652
- [pool recycleMaskViews ];
2652
+ [pool insertViewToPoolIfNeeded: view1];
2653
+ [pool insertViewToPoolIfNeeded: view2];
2653
2654
CGRect newRect = CGRectMake (0 , 0 , 10 , 10 );
2654
2655
FlutterClippingMaskView* view3 = [pool getMaskViewWithFrame: newRect];
2655
2656
FlutterClippingMaskView* view4 = [pool getMaskViewWithFrame: newRect];
2656
- XCTAssertEqual (view1, view3);
2657
- XCTAssertEqual (view2, view4);
2657
+ // view3 and view4 should randomly get either of view1 and view2.
2658
+ NSSet * set1 = [NSSet setWithObjects: view1, view2, nil ];
2659
+ NSSet * set2 = [NSSet setWithObjects: view3, view4, nil ];
2660
+ XCTAssertEqualObjects (set1, set2);
2658
2661
XCTAssertTrue (CGRectEqualToRect (view3.frame , newRect));
2659
2662
XCTAssertTrue (CGRectEqualToRect (view4.frame , newRect));
2660
2663
}
@@ -2727,17 +2730,17 @@ - (void)testClipMaskViewIsReused {
2727
2730
auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
2728
2731
screenScaleMatrix, SkSize::Make (10 , 10 ), stack1);
2729
2732
2730
- flutter::MutatorsStack stack2;
2731
- auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
2732
- screenScaleMatrix, SkSize::Make (10 , 10 ), stack2);
2733
-
2734
2733
flutterPlatformViewsController->PrerollCompositeEmbeddedView (1 , std::move (embeddedViewParams1));
2735
2734
flutterPlatformViewsController->CompositeEmbeddedView (1 );
2736
2735
UIView* childClippingView1 = gMockPlatformView .superview .superview ;
2737
2736
UIView* maskView1 = childClippingView1.maskView ;
2738
2737
XCTAssertNotNil (maskView1);
2739
2738
2740
2739
// Composite a new frame.
2740
+ flutterPlatformViewsController->BeginFrame (SkISize::Make (100 , 100 ));
2741
+ flutter::MutatorsStack stack2;
2742
+ auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
2743
+ screenScaleMatrix, SkSize::Make (10 , 10 ), stack2);
2741
2744
auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
2742
2745
screenScaleMatrix, SkSize::Make (10 , 10 ), stack2);
2743
2746
flutterPlatformViewsController->PrerollCompositeEmbeddedView (1 , std::move (embeddedViewParams3));
@@ -2763,6 +2766,77 @@ - (void)testClipMaskViewIsReused {
2763
2766
XCTAssertNil (childClippingView1.maskView );
2764
2767
}
2765
2768
2769
+ - (void )testDifferentClipMaskViewIsUsedForEachView {
2770
+ flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2771
+ auto thread_task_runner = CreateNewThread (" FlutterPlatformViewsTest" );
2772
+ flutter::TaskRunners runners (/* label=*/ self.name .UTF8String ,
2773
+ /* platform=*/ thread_task_runner,
2774
+ /* raster=*/ thread_task_runner,
2775
+ /* ui=*/ thread_task_runner,
2776
+ /* io=*/ thread_task_runner);
2777
+ auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2778
+ auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2779
+ /* delegate=*/ mock_delegate,
2780
+ /* rendering_api=*/ flutter::IOSRenderingAPI::kSoftware ,
2781
+ /* platform_views_controller=*/ flutterPlatformViewsController,
2782
+ /* task_runners=*/ runners);
2783
+
2784
+ FlutterPlatformViewsTestMockFlutterPlatformFactory* factory =
2785
+ [[FlutterPlatformViewsTestMockFlutterPlatformFactory new ] autorelease ];
2786
+ flutterPlatformViewsController->RegisterViewFactory (
2787
+ factory, @" MockFlutterPlatformView" ,
2788
+ FlutterPlatformViewGestureRecognizersBlockingPolicyEager);
2789
+ FlutterResult result = ^(id result) {
2790
+ };
2791
+
2792
+ flutterPlatformViewsController->OnMethodCall (
2793
+ [FlutterMethodCall
2794
+ methodCallWithMethodName: @" create"
2795
+ arguments: @{@" id" : @1 , @" viewType" : @" MockFlutterPlatformView" }],
2796
+ result);
2797
+ UIView* view1 = gMockPlatformView ;
2798
+
2799
+ // This overwrites `gMockPlatformView` to another view.
2800
+ flutterPlatformViewsController->OnMethodCall (
2801
+ [FlutterMethodCall
2802
+ methodCallWithMethodName: @" create"
2803
+ arguments: @{@" id" : @2 , @" viewType" : @" MockFlutterPlatformView" }],
2804
+ result);
2805
+ UIView* view2 = gMockPlatformView ;
2806
+
2807
+ XCTAssertNotNil (gMockPlatformView );
2808
+ UIView* mockFlutterView = [[[UIView alloc ] initWithFrame: CGRectMake (0 , 0 , 10 , 10 )] autorelease ];
2809
+ flutterPlatformViewsController->SetFlutterView (mockFlutterView);
2810
+ // Create embedded view params
2811
+ flutter::MutatorsStack stack1;
2812
+ // Layer tree always pushes a screen scale factor to the stack
2813
+ SkMatrix screenScaleMatrix =
2814
+ SkMatrix::Scale ([UIScreen mainScreen ].scale , [UIScreen mainScreen ].scale );
2815
+ stack1.PushTransform (screenScaleMatrix);
2816
+ // Push a clip rect
2817
+ SkRect rect = SkRect::MakeXYWH (2 , 2 , 3 , 3 );
2818
+ stack1.PushClipRect (rect);
2819
+
2820
+ auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
2821
+ screenScaleMatrix, SkSize::Make (10 , 10 ), stack1);
2822
+
2823
+ flutter::MutatorsStack stack2;
2824
+ stack2.PushClipRect (rect);
2825
+ auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
2826
+ screenScaleMatrix, SkSize::Make (10 , 10 ), stack2);
2827
+
2828
+ flutterPlatformViewsController->PrerollCompositeEmbeddedView (1 , std::move (embeddedViewParams1));
2829
+ flutterPlatformViewsController->CompositeEmbeddedView (1 );
2830
+ UIView* childClippingView1 = view1.superview .superview ;
2831
+
2832
+ flutterPlatformViewsController->PrerollCompositeEmbeddedView (2 , std::move (embeddedViewParams2));
2833
+ flutterPlatformViewsController->CompositeEmbeddedView (2 );
2834
+ UIView* childClippingView2 = view2.superview .superview ;
2835
+ UIView* maskView1 = childClippingView1.maskView ;
2836
+ UIView* maskView2 = childClippingView2.maskView ;
2837
+ XCTAssertNotEqual (maskView1, maskView2);
2838
+ }
2839
+
2766
2840
// Return true if a correct visual effect view is found. It also implies all the validation in this
2767
2841
// method passes.
2768
2842
//
0 commit comments