From 550765eac47c7a1fa14cf17d9e69a6e16517cd69 Mon Sep 17 00:00:00 2001 From: hellohuanlin <41930132+hellohuanlin@users.noreply.github.com> Date: Tue, 3 Sep 2024 13:36:48 -0700 Subject: [PATCH 1/2] [ios][platform_view] fix platform view clipping path intersection (#54820) It turns out that when there are multiple paths to clip, they are unioned together, rather than intersected. But clipping paths need to be intersected. There isn't any good way to intersect arbitrary paths. However, it is easy to intersect rect paths, which is the most common use case. Then we simply fallback to software rendering if we have to intersect non-rect paths. That is: **Case 1** Only 1 clipping path (either rect path or arbitrary path): Hardware rendering. This should be the most common use case **Case 2** Multiple rect clipping path: Hardware rendering. This is also common, and it's the linked issue that we are fixing. **Case 3** Other complex case (multiple non-rect clipping path) Fallback to software rendering. This should be rare. After https://github.com/flutter/engine/pull/53826, we don't have a working benchmark that measures the main thread anymore. However, this PR shouldn't impact our ad benchmark, since it only has 1 clipping path. I will verify manually by checking Instruments and make sure no software rendering is happening. But we really should make the benchmark working again, not just for performance improvement, but also for monitoring regression. *List which issues are fixed by this PR. You must list at least one issue.* Fixes https://github.com/flutter/flutter/issues/153904 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style --- .../Source/FlutterPlatformViewsTest.mm | 337 ++++++++ .../Source/FlutterPlatformViews_Internal.mm | 82 +- .../Scenarios.xcodeproj/project.pbxproj | 48 ++ .../ios/Scenarios/Scenarios/AppDelegate.m | 21 + .../ScenariosUITests/GoldenTestManager.m | 21 + .../ScenariosUITests/PlatformViewUITests.m | 268 +++++++ ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 25534 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 26495 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 24308 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 24007 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 18763 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 26290 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 28259 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 28283 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 32213 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 25806 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 22545 bytes ...one SE (3rd generation)_17.0_simulator.png | Bin 0 -> 31839 bytes .../scenario_app/lib/src/platform_view.dart | 741 ++++++++++++++++-- testing/scenario_app/lib/src/scenarios.dart | 13 + testing/scenario_app/run_ios_tests.sh | 12 + 21 files changed, 1482 insertions(+), 61 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index 8a65d7c1cff16..fc45ede26dddb 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -1787,6 +1787,102 @@ - (void)testClipRect { } } +- (void)testClipRect_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip rect + SkRect rect1 = SkRect::MakeXYWH(2, 2, 3, 3); + stack.PushClipRect(rect1); + // Push another clip rect + SkRect rect2 = SkRect::MakeXYWH(3, 3, 3, 3); + stack.PushClipRect(rect2); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 2 3 4 5 6 + 2 + - - + 2 + 3 | | 3 + - - + + 4 | | 4 | | + 5 + - - + 5 | | + 6 6 + - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 + 2 + 3 + - + + 4 | | + 5 + - + + 6 + */ + CGRect insideClipping = CGRectMake(3, 3, 2, 2); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (CGRectContainsPoint(insideClipping, point)) { + XCTAssertEqual(alpha, 255); + } else { + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testClipRRect { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); @@ -1887,6 +1983,126 @@ - (void)testClipRRect { } } +- (void)testClipRRect_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip rrect + SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1); + stack.PushClipRRect(rrect); + // Push a clip rect + SkRect rect = SkRect::MakeXYWH(4, 2, 6, 6); + stack.PushClipRect(rect); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 + 2 / - - - - \ 2 + - - - - + + 3 | | 3 | | + 4 | | 4 | | + 5 | | 5 | | + 6 | | 6 | | + 7 \ - - - - / 7 + - - - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / + */ + CGRect clipping = CGRectMake(4, 2, 4, 6); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (i == 7 && (j == 2 || j == 7)) { + // Upper and lower right corners should be partially transparent. + XCTAssert(0 < alpha && alpha < 255); + } else if ( + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully opaque. + XCTAssert(alpha > 127); + } else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully transparent. + XCTAssert(alpha < 127); + } else if (CGRectContainsPoint(clipping, point)) { + // Other pixels inside clipping should be fully opaque. + XCTAssertEqual(alpha, 255); + } else { + // Pixels outside clipping should be fully transparent. + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testClipPath { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); @@ -1988,6 +2204,127 @@ - (void)testClipPath { } } +- (void)testClipPath_multipleClips { + flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; + + flutter::TaskRunners runners(/*label=*/self.name.UTF8String, + /*platform=*/GetDefaultTaskRunner(), + /*raster=*/GetDefaultTaskRunner(), + /*ui=*/GetDefaultTaskRunner(), + /*io=*/GetDefaultTaskRunner()); + auto flutterPlatformViewsController = std::make_shared(); + flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + auto platform_view = std::make_unique( + /*delegate=*/mock_delegate, + /*rendering_api=*/mock_delegate.settings_.enable_impeller + ? flutter::IOSRenderingAPI::kMetal + : flutter::IOSRenderingAPI::kSoftware, + /*platform_views_controller=*/flutterPlatformViewsController, + /*task_runners=*/runners, + /*worker_task_runner=*/nil, + /*is_gpu_disabled_jsync_switch=*/std::make_shared()); + + FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = + [[FlutterPlatformViewsTestMockFlutterPlatformFactory alloc] init]; + flutterPlatformViewsController->RegisterViewFactory( + factory, @"MockFlutterPlatformView", + FlutterPlatformViewGestureRecognizersBlockingPolicyEager); + FlutterResult result = ^(id result) { + }; + flutterPlatformViewsController->OnMethodCall( + [FlutterMethodCall + methodCallWithMethodName:@"create" + arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], + result); + + XCTAssertNotNil(gMockPlatformView); + + UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)]; + flutterPlatformViewsController->SetFlutterView(flutterView); + // Create embedded view params + flutter::MutatorsStack stack; + // Layer tree always pushes a screen scale factor to the stack + SkMatrix screenScaleMatrix = + SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); + stack.PushTransform(screenScaleMatrix); + // Push a clip path + SkPath path; + path.addRoundRect(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1); + stack.PushClipPath(path); + // Push a clip rect + SkRect rect = SkRect::MakeXYWH(4, 2, 6, 6); + stack.PushClipRect(rect); + + auto embeddedViewParams = + std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); + + flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); + flutterPlatformViewsController->CompositeWithParams( + 2, flutterPlatformViewsController->GetCompositionParams(2)); + + gMockPlatformView.backgroundColor = UIColor.redColor; + XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); + ChildClippingView* childClippingView = (ChildClippingView*)gMockPlatformView.superview.superview; + [flutterView addSubview:childClippingView]; + + [flutterView setNeedsLayout]; + [flutterView layoutIfNeeded]; + + /* + clip 1 clip 2 + 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 + 2 / - - - - \ 2 + - - - - + + 3 | | 3 | | + 4 | | 4 | | + 5 | | 5 | | + 6 | | 6 | | + 7 \ - - - - / 7 + - - - - + + + Result should be the intersection of 2 clips + 2 3 4 5 6 7 8 9 + 2 + - - \ + 3 | | + 4 | | + 5 | | + 6 | | + 7 + - - / + */ + CGRect clipping = CGRectMake(4, 2, 4, 6); + for (int i = 0; i < 10; i++) { + for (int j = 0; j < 10; j++) { + CGPoint point = CGPointMake(i, j); + int alpha = [self alphaOfPoint:CGPointMake(i, j) onView:flutterView]; + if (i == 7 && (j == 2 || j == 7)) { + // Upper and lower right corners should be partially transparent. + XCTAssert(0 < alpha && alpha < 255); + } else if ( + // left + (i == 4 && j >= 2 && j <= 7) || + // right + (i == 7 && j >= 2 && j <= 7) || + // top + (j == 2 && i >= 4 && i <= 7) || + // bottom + (j == 7 && i >= 4 && i <= 7)) { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully opaque. + XCTAssert(alpha > 127); + } else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) || + (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) { + // Since we are falling back to software rendering for this case + // The edge pixels can be anti-aliased, so it may not be fully transparent. + XCTAssert(alpha < 127); + } else if (CGRectContainsPoint(clipping, point)) { + // Other pixels inside clipping should be fully opaque. + XCTAssertEqual(alpha, 255); + } else { + // Pixels outside clipping should be fully transparent. + XCTAssertEqual(alpha, 0); + } + } + } +} + - (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index c11bd1da28500..2589e780a49b7 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -236,12 +236,14 @@ @interface FlutterClippingMaskView () // information about screen scale. @property(nonatomic) CATransform3D reverseScreenScale; -- (void)addTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix; +- (fml::CFRef)getTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix; @end @implementation FlutterClippingMaskView { - CGMutablePathRef pathSoFar_; + std::vector> paths_; + BOOL containsNonRectPath_; + CGRect rectSoFar_; } - (instancetype)initWithFrame:(CGRect)frame { @@ -252,7 +254,8 @@ - (instancetype)initWithFrame:(CGRect)frame screenScale:(CGFloat)screenScale { if (self = [super initWithFrame:frame]) { self.backgroundColor = UIColor.clearColor; _reverseScreenScale = CATransform3DMakeScale(1 / screenScale, 1 / screenScale, 1); - pathSoFar_ = CGPathCreateMutable(); + rectSoFar_ = self.bounds; + containsNonRectPath_ = NO; } return self; } @@ -266,16 +269,13 @@ - (CAShapeLayer*)shapeLayer { } - (void)reset { - CGPathRelease(pathSoFar_); - pathSoFar_ = CGPathCreateMutable(); + paths_.clear(); + rectSoFar_ = self.bounds; + containsNonRectPath_ = NO; [self shapeLayer].path = nil; [self setNeedsDisplay]; } -- (void)dealloc { - CGPathRelease(pathSoFar_); -} - // In some scenarios, when we add this view as a maskView of the ChildClippingView, iOS added // this view as a subview of the ChildClippingView. // This results this view blocking touch events on the ChildClippingView. @@ -285,16 +285,58 @@ - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event { return NO; } +- (void)drawRect:(CGRect)rect { + // It's hard to compute intersection of arbitrary non-rect paths. + // So we fallback to software rendering. + if (containsNonRectPath_ && paths_.size() > 1) { + CGContextRef context = UIGraphicsGetCurrentContext(); + CGContextSaveGState(context); + + // For mask view, only the alpha channel is used. + CGContextSetAlpha(context, 1); + + for (size_t i = 0; i < paths_.size(); i++) { + CGContextAddPath(context, paths_.at(i)); + CGContextClip(context); + } + CGContextFillRect(context, rect); + CGContextRestoreGState(context); + } else { + // Either a single path, or multiple rect paths. + // Use hardware rendering with CAShapeLayer. + [super drawRect:rect]; + if (![self shapeLayer].path) { + if (paths_.size() == 1) { + // A single path, either rect or non-rect. + [self shapeLayer].path = paths_.at(0); + } else { + // Multiple paths, all paths must be rects. + CGPathRef pathSoFar = CGPathCreateWithRect(rectSoFar_, nil); + [self shapeLayer].path = pathSoFar; + CGPathRelease(pathSoFar); + } + } + } +} + - (void)clipRect:(const SkRect&)clipSkRect matrix:(const SkMatrix&)matrix { CGRect clipRect = flutter::GetCGRectFromSkRect(clipSkRect); CGPathRef path = CGPathCreateWithRect(clipRect, nil); // The `matrix` is based on the physical pixels, convert it to UIKit points. CATransform3D matrixInPoints = CATransform3DConcat(flutter::GetCATransform3DFromSkMatrix(matrix), _reverseScreenScale); - [self addTransformedPath:path matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:path matrix:matrixInPoints]); + CGAffineTransform affine = [self affineWithMatrix:matrixInPoints]; + // Make sure the rect is not rotated (only translated or scaled). + if (affine.b == 0 && affine.c == 0) { + rectSoFar_ = CGRectIntersection(rectSoFar_, CGRectApplyAffineTransform(clipRect, affine)); + } else { + containsNonRectPath_ = YES; + } } - (void)clipRRect:(const SkRRect&)clipSkRRect matrix:(const SkMatrix&)matrix { + containsNonRectPath_ = YES; CGPathRef pathRef = nullptr; switch (clipSkRRect.getType()) { case SkRRect::kEmpty_Type: { @@ -360,7 +402,7 @@ - (void)clipRRect:(const SkRRect&)clipSkRRect matrix:(const SkMatrix&)matrix { // TODO(cyanglaz): iOS does not seem to support hard edge on CAShapeLayer. It clearly stated that // the CAShaperLayer will be drawn antialiased. Need to figure out a way to do the hard edge // clipping on iOS. - [self addTransformedPath:pathRef matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:pathRef matrix:matrixInPoints]); } - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { @@ -370,6 +412,7 @@ - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { if (path.isEmpty()) { return; } + containsNonRectPath_ = YES; CGMutablePathRef pathRef = CGPathCreateMutable(); // Loop through all verbs and translate them into CGPath @@ -425,15 +468,20 @@ - (void)clipPath:(const SkPath&)path matrix:(const SkMatrix&)matrix { // The `matrix` is based on the physical pixels, convert it to UIKit points. CATransform3D matrixInPoints = CATransform3DConcat(flutter::GetCATransform3DFromSkMatrix(matrix), _reverseScreenScale); - [self addTransformedPath:pathRef matrix:matrixInPoints]; + paths_.push_back([self getTransformedPath:pathRef matrix:matrixInPoints]); } -- (void)addTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix { - CGAffineTransform affine = - CGAffineTransformMake(matrix.m11, matrix.m12, matrix.m21, matrix.m22, matrix.m41, matrix.m42); - CGPathAddPath(pathSoFar_, &affine, path); - [self shapeLayer].path = pathSoFar_; +- (CGAffineTransform)affineWithMatrix:(CATransform3D)matrix { + return CGAffineTransformMake(matrix.m11, matrix.m12, matrix.m21, matrix.m22, matrix.m41, + matrix.m42); +} + +- (fml::CFRef)getTransformedPath:(CGPathRef)path matrix:(CATransform3D)matrix { + CGAffineTransform affine = [self affineWithMatrix:matrix]; + CGPathRef transformedPath = CGPathCreateCopyByTransformingPath(path, &affine); + CGPathRelease(path); + return fml::CFRef(transformedPath); } @end diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 29355ef4a5872..7f8c0bac1756a 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -73,6 +73,18 @@ 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68C9D8082AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png */; }; 68D4017D2564859300ECD91A /* ContinuousTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 68D4017C2564859300ECD91A /* ContinuousTexture.m */; }; 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1DE2C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1DF2C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E02C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E12C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E22C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E32C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E42C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E52C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E62C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E72C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E82C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; + E0D5A1E92C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */; }; F26F15B8268B6B5600EC54D3 /* iPadGestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */; }; /* End PBXBuildFile section */ @@ -249,6 +261,18 @@ 68D4017B2564859300ECD91A /* ContinuousTexture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ContinuousTexture.h; sourceTree = ""; }; 68D4017C2564859300ECD91A /* ContinuousTexture.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ContinuousTexture.m; sourceTree = ""; }; 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; + E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png"; sourceTree = ""; }; F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = iPadGestureTests.m; sourceTree = ""; }; F72114B628EF99F500184A2D /* Info_Impeller.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info_Impeller.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -433,6 +457,18 @@ 684FFF7B29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */, 684FFF7A29F9C10700281002 /* golden_spawn_engine_works_iPhone SE (3rd generation)_17.0_simulator.png */, 684FFF6E29F9C10400281002 /* golden_two_platform_views_with_other_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D22C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D32C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D42C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D52C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D62C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D72C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D82C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1D92C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DA2C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DB2C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DC2C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, + E0D5A1DD2C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png */, ); name = Goldens; sourceTree = ""; @@ -623,6 +659,18 @@ 684FFF8729F9C10700281002 /* golden_platform_view_multiple_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 3BFD97202A990CF50094F51B /* golden_bogus_font_text_impeller_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1DE2C8115F7003BB890 /* golden_platform_view_cliprect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1DF2C8115F7003BB890 /* golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E02C8115F7003BB890 /* golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E12C8115F7003BB890 /* golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E22C8115F7003BB890 /* golden_platform_view_large_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E32C8115F7003BB890 /* golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E42C8115F7003BB890 /* golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E52C8115F7003BB890 /* golden_two_platform_view_clip_rect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E62C8115F7003BB890 /* golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E72C8115F7003BB890 /* golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E82C8115F7003BB890 /* golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, + E0D5A1E92C8115F7003BB890 /* golden_platform_view_cliprect_after_moved_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 68C9D8092AD9B6C800DF9D79 /* golden_darwin_system_font_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, 684FFF8329F9C10700281002 /* golden_platform_view_transform_iPhone SE (3rd generation)_17.0_simulator.png in Resources */, diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 47188144fcca7..c7f86cf200c2b 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -60,14 +60,27 @@ - (BOOL)application:(UIApplication*)application @"--platform-view-multiple-background-foreground" : @"platform_view_multiple_background_foreground", @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", + @"--platform-view-large-cliprrect-multiple-clips" : + @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", + @"--platform-view-cliprrect-with-transform-multiple-clips" : + @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", + @"--platform-view-large-cliprrect-with-transform-multiple-clips" : + @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", + @"--platform-view-cliprect-with-transform-multiple-clips" : + @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", + @"--platform-view-clippath-with-transform-multiple-clips" : + @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -91,10 +104,18 @@ - (BOOL)application:(UIApplication*)application @"--pointer-events" : @"pointer_events", @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget", @"--platform-views-with-clips-scrolling" : @"platform_views_with_clips_scrolling", + @"--platform-views-with-clips-scrolling-multiple-clips" : + @"platform_views_with_clips_scrolling_multiple_clips", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", + @"--platform-view-cliprect-after-moved-multiple-clips" : + @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", + @"--two-platform-view-clip-rect-multiple-clips" : @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", + @"--two-platform-view-clip-rrect-multiple-clips" : + @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--two-platform-view-clip-path-multiple-clips" : @"two_platform_view_clip_path_multiple_clips", @"--darwin-system-font" : @"darwin_system_font", }; __block NSString* flutterViewControllerTestName = nil; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index ac55da74642bb..a4650a5d3616c 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -29,14 +29,27 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--platform-view-multiple-background-foreground" : @"platform_view_multiple_background_foreground", @"--platform-view-cliprect" : @"platform_view_cliprect", + @"--platform-view-cliprect-multiple-clips" : @"platform_view_cliprect_multiple_clips", @"--platform-view-cliprrect" : @"platform_view_cliprrect", + @"--platform-view-cliprrect-multiple-clips" : @"platform_view_cliprrect_multiple_clips", @"--platform-view-large-cliprrect" : @"platform_view_large_cliprrect", + @"--platform-view-large-cliprrect-multiple-clips" : + @"platform_view_large_cliprrect_multiple_clips", @"--platform-view-clippath" : @"platform_view_clippath", + @"--platform-view-clippath-multiple-clips" : @"platform_view_clippath_multiple_clips", @"--platform-view-cliprrect-with-transform" : @"platform_view_cliprrect_with_transform", + @"--platform-view-cliprrect-with-transform-multiple-clips" : + @"platform_view_cliprrect_with_transform_multiple_clips", @"--platform-view-large-cliprrect-with-transform" : @"platform_view_large_cliprrect_with_transform", + @"--platform-view-large-cliprrect-with-transform-multiple-clips" : + @"platform_view_large_cliprrect_with_transform_multiple_clips", @"--platform-view-cliprect-with-transform" : @"platform_view_cliprect_with_transform", + @"--platform-view-cliprect-with-transform-multiple-clips" : + @"platform_view_cliprect_with_transform_multiple_clips", @"--platform-view-clippath-with-transform" : @"platform_view_clippath_with_transform", + @"--platform-view-clippath-with-transform-multiple-clips" : + @"platform_view_clippath_with_transform_multiple_clips", @"--platform-view-transform" : @"platform_view_transform", @"--platform-view-opacity" : @"platform_view_opacity", @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @@ -50,9 +63,17 @@ - (instancetype)initWithLaunchArg:(NSString*)launchArg { @"--bogus-font-text" : @"bogus_font_text", @"--spawn-engine-works" : @"spawn_engine_works", @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", + @"--platform-view-cliprect-after-moved-multiple-clips" : + @"platform_view_cliprect_after_moved_multiple_clips", @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", + @"--two-platform-view-clip-rect-multiple-clips" : + @"two_platform_view_clip_rect_multiple_clips", @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", + @"--two-platform-view-clip-rrect-multiple-clips" : + @"two_platform_view_clip_rrect_multiple_clips", @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--two-platform-view-clip-path-multiple-clips" : + @"two_platform_view_clip_path_multiple_clips", @"--app-extension" : @"app_extension", @"--darwin-system-font" : @"darwin_system_font", }; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 7415a51717ddb..156a2dbe76c24 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -98,6 +98,25 @@ - (void)testPlatformView { @end +// Clip Rect Tests +@interface PlatformViewMutationClipRectWithMultiupleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectWithMultiupleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRectAfterMovedTests : GoldenPlatformViewTests @end @@ -128,6 +147,36 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRectAfterMovedMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectAfterMovedMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprect-after-moved-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + // This test needs to wait for several frames for the PlatformView to settle to + // the correct position. The PlatformView accessiblity is set to platform_view[10000] when it is + // ready. + XCUIElement* element = self.application.otherElements[@"platform_view[10000]"]; + BOOL exists = [element waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kSecondsToWaitForPlatformView)); + } + + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRRectTests : GoldenPlatformViewTests @end @@ -146,6 +195,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprrect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationLargeClipRRectTests : GoldenPlatformViewTests @end @@ -164,6 +231,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationLargeClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationLargeClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-large-cliprrect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipPathTests : GoldenPlatformViewTests @end @@ -182,6 +267,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipPathMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipPathMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-clippath-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRectWithTransformTests : GoldenPlatformViewTests @end @@ -200,6 +303,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRectWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipRRectWithTransformTests : GoldenPlatformViewTests @end @@ -218,6 +339,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipRRectWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-cliprrect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationLargeClipRRectWithTransformTests : GoldenPlatformViewTests @end @@ -236,6 +375,25 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests + : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-large-cliprrect-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationClipPathWithTransformTests : GoldenPlatformViewTests @end @@ -254,6 +412,24 @@ - (void)testPlatformView { @end +@interface PlatformViewMutationClipPathWithTransformMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipPathWithTransformMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-clippath-with-transform-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipRectTests : GoldenPlatformViewTests @end @@ -272,6 +448,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipRRectTests : GoldenPlatformViewTests @end @@ -290,6 +484,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipRRectMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipRRectMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--two-platform-view-clip-rrect-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface TwoPlatformViewClipPathTests : GoldenPlatformViewTests @end @@ -308,6 +520,24 @@ - (void)testPlatformView { @end +@interface TwoPlatformViewClipPathMultipleClipsTests : GoldenPlatformViewTests + +@end + +@implementation TwoPlatformViewClipPathMultipleClipsTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-path-multiple-clips"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewMutationTransformTests : GoldenPlatformViewTests @end @@ -528,3 +758,41 @@ - (void)testPlatformViewsWithClipsScrolling { } @end + +@interface PlatformViewWithClipsScrollingMultipleClips : XCTestCase + +@end + +@implementation PlatformViewWithClipsScrollingMultipleClips + +- (void)setUp { + [super setUp]; + self.continueAfterFailure = NO; +} + +- (void)testPlatformViewsWithClipsScrolling { + XCUIApplication* app = [[XCUIApplication alloc] init]; + app.launchArguments = @[ + @"--platform-views-with-clips-scrolling", @"platform_views_with_clips_scrolling-multiple-clips" + ]; + [app launch]; + + XCUIElement* platformView = app.textViews.firstMatch; + BOOL exists = [platformView waitForExistenceWithTimeout:kSecondsToWaitForPlatformView]; + if (!exists) { + XCTFail(@"It took longer than %@ second to find the platform view." + @"There might be issues with the platform view's construction," + @"or with how the scenario is built.", + @(kSecondsToWaitForPlatformView)); + } + + // Wait and let the scenario app scroll a bit. + XCTWaiterResult waitResult = [XCTWaiter + waitForExpectations:@[ [[XCTestExpectation alloc] initWithDescription:@"Wait for 5 seconds"] ] + timeout:5]; + // If the waiter is not interrupted, we know the app is in a valid state after timeout, thus the + // test passes. + XCTAssert(waitResult != XCTWaiterResultInterrupted); +} + +@end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..0215aa6f0aa76200aa3350a42771dd1519fc0578 GIT binary patch literal 25534 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_clippath_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..0992ec0ea909f42c09cf264b8f62bfc186ddf5bf GIT binary patch literal 26495 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 WeuRYayr;-Z)V)1@J#sb?&;KtAYuz{i literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..7504b1f0257c245a21c22b733b24c5ad3a5f0553 GIT binary patch literal 18763 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 NwGD4nUc2|~e*kQ$ak2ma literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..11cbf55d18f9277e4d73400e3868ed96a7fac6c9 GIT binary patch literal 26290 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 VhwL>zLjN!3gt3KD{t=fy{sV~h&zt}N literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprrect_with_transform_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..c5411cd124336d1b7eac0e297be4d35dd51103b5 GIT binary patch literal 28259 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_large_cliprrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..23427f2057b42896df3fcd331dde0f0d95a51de0 GIT binary patch literal 28283 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..27dbbccbea8c4adb92590d88d4cd94ffa805de71 GIT binary patch literal 25806 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 NIjdcck*dc1{{r|YV~zj- literal 0 HcmV?d00001 diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_multiple_clips_iPhone SE (3rd generation)_17.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..cb51fc70f477754d72dedd3c8690ee000cee9729 GIT binary patch literal 31839 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 -1) { + _movingUp = true; + } + + if (_movingUp) { + _offset -= 100; + } else { + _offset += 100; + } + view.platformDispatcher.scheduleFrame(); + super.onDrawFrame(); + } + + Future _buildOneFrame(double offset) async { + const double cellWidth = 1000; + double localOffset = offset; + final SceneBuilder builder = SceneBuilder(); + const double cellHeight = 300; + for (int i = _firstPlatformViewId; i <= _lastPlatformViewId; i++) { + // Build a list view with platform views. + builder.pushOffset(0, localOffset); + bool addedClipRRect = false; + if (localOffset > -1) { + addedClipRRect = true; + builder..pushClipRRect( + RRect.fromLTRBAndCorners( + 100, + 100, + 400, + 400, + topLeft: const Radius.circular(15), + topRight: const Radius.circular(50), + bottomLeft: const Radius.circular(50), + ), + ) + ..pushClipRect(const Rect.fromLTRB(200, 0, 600, 600)); + + } + addPlatformView( + i, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + text: 'platform view $i', + width: cellWidth, + height: cellHeight, + ); + if (addedClipRRect) { + builder.pop(); + } + builder.pop(); + localOffset += cellHeight; + } + + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); + } +} + final Map _createdPlatformViews = {}; final Map _calledToBeCreatedPlatformViews = {}; diff --git a/testing/scenario_app/lib/src/scenarios.dart b/testing/scenario_app/lib/src/scenarios.dart index bcd2c0cd908b6..db50779fb2292 100644 --- a/testing/scenario_app/lib/src/scenarios.dart +++ b/testing/scenario_app/lib/src/scenarios.dart @@ -37,14 +37,23 @@ Map _scenarios = { 'platform_view_surrounding_layers_fractional_coordinate': (FlutterView view) => PlatformViewSurroundingLayersFractionalCoordinateScenario(view, id: _viewId++), 'platform_view_partial_intersection_fractional_coordinate': (FlutterView view) => PlatformViewPartialIntersectionFractionalCoordinateScenario(view, id: _viewId++), 'platform_view_cliprect': (FlutterView view) => PlatformViewClipRectScenario(view, id: _viewId++), + 'platform_view_cliprect_multiple_clips': (FlutterView view) => PlatformViewClipRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprect_with_transform': (FlutterView view) => PlatformViewClipRectWithTransformScenario(view, id: _viewId++), + 'platform_view_cliprect_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprect_after_moved': (FlutterView view) => PlatformViewClipRectAfterMovedScenario(view, id: _viewId++), + 'platform_view_cliprect_after_moved_multiple_clips': (FlutterView view) => PlatformViewClipRectAfterMovedMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprrect': (FlutterView view) => PlatformViewClipRRectScenario(view, id: _viewId++), + 'platform_view_cliprrect_multiple_clips': (FlutterView view) => PlatformViewClipRRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_large_cliprrect': (FlutterView view) => PlatformViewLargeClipRRectScenario(view, id: _viewId++), + 'platform_view_large_cliprrect_multiple_clips': (FlutterView view) => PlatformViewLargeClipRRectMultipleClipsScenario(view, id: _viewId++), 'platform_view_cliprrect_with_transform': (FlutterView view) => PlatformViewClipRRectWithTransformScenario(view, id: _viewId++), + 'platform_view_cliprrect_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipRRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_large_cliprrect_with_transform': (FlutterView view) => PlatformViewLargeClipRRectWithTransformScenario(view, id: _viewId++), + 'platform_view_large_cliprrect_with_transform_multiple_clips': (FlutterView view) => PlatformViewLargeClipRRectWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_clippath': (FlutterView view) => PlatformViewClipPathScenario(view, id: _viewId++), + 'platform_view_clippath_multiple_clips': (FlutterView view) => PlatformViewClipPathMultipleClipsScenario(view, id: _viewId++), 'platform_view_clippath_with_transform': (FlutterView view) => PlatformViewClipPathWithTransformScenario(view, id: _viewId++), + 'platform_view_clippath_with_transform_multiple_clips': (FlutterView view) => PlatformViewClipPathWithTransformMultipleClipsScenario(view, id: _viewId++), 'platform_view_transform': (FlutterView view) => PlatformViewTransformScenario(view, id: _viewId++), 'platform_view_opacity': (FlutterView view) => PlatformViewOpacityScenario(view, id: _viewId++), 'platform_view_with_other_backdrop_filter': (FlutterView view) => PlatformViewWithOtherBackDropFilter(view, id: _viewId++), @@ -61,9 +70,13 @@ Map _scenarios = { 'platform_view_gesture_accept_with_overlapping_platform_views': (FlutterView view) => PlatformViewForOverlappingPlatformViewsScenario(view, foregroundId: _viewId++, backgroundId: _viewId++), 'platform_view_scrolling_under_widget':(FlutterView view) => PlatformViewScrollingUnderWidget(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), 'platform_views_with_clips_scrolling':(FlutterView view) => PlatformViewsWithClipsScrolling(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), + 'platform_views_with_clips_scrolling_multiple_clips':(FlutterView view) => PlatformViewsWithClipsScrollingMultipleClips(view, firstPlatformViewId: _viewId++, lastPlatformViewId: _viewId+=16), 'two_platform_view_clip_rect': (FlutterView view) => TwoPlatformViewClipRect(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_rect_multiple_clips': (FlutterView view) => TwoPlatformViewClipRectMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'two_platform_view_clip_rrect': (FlutterView view) => TwoPlatformViewClipRRect(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_rrect_multiple_clips': (FlutterView view) => TwoPlatformViewClipRRectMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'two_platform_view_clip_path': (FlutterView view) => TwoPlatformViewClipPath(view, firstId: _viewId++, secondId: _viewId++), + 'two_platform_view_clip_path_multiple_clips': (FlutterView view) => TwoPlatformViewClipPathMultipleClips(view, firstId: _viewId++, secondId: _viewId++), 'tap_status_bar': (FlutterView view) => TouchesScenario(view), 'initial_route_reply': (FlutterView view) => InitialRouteReply(view), 'platform_view_with_continuous_texture': (FlutterView view) => PlatformViewWithContinuousTexture(view, id: _viewId++), diff --git a/testing/scenario_app/run_ios_tests.sh b/testing/scenario_app/run_ios_tests.sh index ed040b16d1b47..66b13fddb0c52 100755 --- a/testing/scenario_app/run_ios_tests.sh +++ b/testing/scenario_app/run_ios_tests.sh @@ -110,14 +110,23 @@ if set -o pipefail && xcodebuild -sdk iphonesimulator \ -skip-testing ScenariosUITests/MultiplePlatformViewsTest/testPlatformView \ -skip-testing ScenariosUITests/NonFullScreenFlutterViewPlatformViewUITests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipPathTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipPathMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipPathWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipPathWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectAfterMovedTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectAfterMovedMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationClipRRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationClipRRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformTests/testPlatformView \ + -skip-testing ScenariosUITests/PlatformViewMutationLargeClipRRectWithTransformMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationOpacityTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewMutationTransformTests/testPlatformView \ -skip-testing ScenariosUITests/PlatformViewRotation/testPlatformView \ @@ -126,8 +135,11 @@ if set -o pipefail && xcodebuild -sdk iphonesimulator \ -skip-testing ScenariosUITests/PlatformViewWithOtherBackdropFilterTests/testPlatformView \ -skip-testing ScenariosUITests/RenderingSelectionTest/testSoftwareRendering \ -skip-testing ScenariosUITests/TwoPlatformViewClipPathTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipPathMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewClipRectTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewClipRRectTests/testPlatformView \ + -skip-testing ScenariosUITests/TwoPlatformViewClipRRectMultipleClipsTests/testPlatformView \ -skip-testing ScenariosUITests/TwoPlatformViewsWithOtherBackDropFilterTests/testPlatformView \ -skip-testing ScenariosUITests/UnobstructedPlatformViewTests/testMultiplePlatformViewsWithOverlays \ # Plist with FLTEnableImpeller=YES, all projects in the workspace requires this file. From e0a630d7f09505896797b8dd30acff2d172f72bf Mon Sep 17 00:00:00 2001 From: Jenn Magder Date: Fri, 6 Sep 2024 11:32:05 -0700 Subject: [PATCH 2/2] Fix up mixmatches from #54335 --- .../Source/FlutterPlatformViewsTest.mm | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index fc45ede26dddb..cb02e16bf5e15 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -1789,14 +1789,13 @@ - (void)testClipRect { - (void)testClipRect_multipleClips { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; - + auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); flutter::TaskRunners runners(/*label=*/self.name.UTF8String, - /*platform=*/GetDefaultTaskRunner(), - /*raster=*/GetDefaultTaskRunner(), - /*ui=*/GetDefaultTaskRunner(), - /*io=*/GetDefaultTaskRunner()); - auto flutterPlatformViewsController = std::make_shared(); - flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + /*platform=*/thread_task_runner, + /*raster=*/thread_task_runner, + /*ui=*/thread_task_runner, + /*io=*/thread_task_runner); + auto flutterPlatformViewsController = std::make_shared(); auto platform_view = std::make_unique( /*delegate=*/mock_delegate, /*rendering_api=*/mock_delegate.settings_.enable_impeller @@ -1841,8 +1840,7 @@ - (void)testClipRect_multipleClips { std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); - flutterPlatformViewsController->CompositeWithParams( - 2, flutterPlatformViewsController->GetCompositionParams(2)); + flutterPlatformViewsController->CompositeEmbeddedView(2); gMockPlatformView.backgroundColor = UIColor.redColor; XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); @@ -1985,14 +1983,13 @@ - (void)testClipRRect { - (void)testClipRRect_multipleClips { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; - + auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); flutter::TaskRunners runners(/*label=*/self.name.UTF8String, - /*platform=*/GetDefaultTaskRunner(), - /*raster=*/GetDefaultTaskRunner(), - /*ui=*/GetDefaultTaskRunner(), - /*io=*/GetDefaultTaskRunner()); - auto flutterPlatformViewsController = std::make_shared(); - flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + /*platform=*/thread_task_runner, + /*raster=*/thread_task_runner, + /*ui=*/thread_task_runner, + /*io=*/thread_task_runner); + auto flutterPlatformViewsController = std::make_shared(); auto platform_view = std::make_unique( /*delegate=*/mock_delegate, /*rendering_api=*/mock_delegate.settings_.enable_impeller @@ -2037,8 +2034,7 @@ - (void)testClipRRect_multipleClips { std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); - flutterPlatformViewsController->CompositeWithParams( - 2, flutterPlatformViewsController->GetCompositionParams(2)); + flutterPlatformViewsController->CompositeEmbeddedView(2); gMockPlatformView.backgroundColor = UIColor.redColor; XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]); @@ -2206,14 +2202,13 @@ - (void)testClipPath { - (void)testClipPath_multipleClips { flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; - + auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); flutter::TaskRunners runners(/*label=*/self.name.UTF8String, - /*platform=*/GetDefaultTaskRunner(), - /*raster=*/GetDefaultTaskRunner(), - /*ui=*/GetDefaultTaskRunner(), - /*io=*/GetDefaultTaskRunner()); - auto flutterPlatformViewsController = std::make_shared(); - flutterPlatformViewsController->SetTaskRunner(GetDefaultTaskRunner()); + /*platform=*/thread_task_runner, + /*raster=*/thread_task_runner, + /*ui=*/thread_task_runner, + /*io=*/thread_task_runner); + auto flutterPlatformViewsController = std::make_shared(); auto platform_view = std::make_unique( /*delegate=*/mock_delegate, /*rendering_api=*/mock_delegate.settings_.enable_impeller @@ -2259,8 +2254,7 @@ - (void)testClipPath_multipleClips { std::make_unique(screenScaleMatrix, SkSize::Make(10, 10), stack); flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams)); - flutterPlatformViewsController->CompositeWithParams( - 2, flutterPlatformViewsController->GetCompositionParams(2)); + flutterPlatformViewsController->CompositeEmbeddedView(2); gMockPlatformView.backgroundColor = UIColor.redColor; XCTAssertTrue([gMockPlatformView.superview.superview isKindOfClass:ChildClippingView.class]);