From 2586cbeeae372263c10f9a6c7928aafa22076d82 Mon Sep 17 00:00:00 2001 From: Zachary Anderson Date: Mon, 22 May 2023 19:35:47 -0700 Subject: [PATCH] Revert "[ios_platform_view] only recycle maskView when the view is applying mutators #41573" (#42231) Reverts flutter/engine#42115 Failing on the framework tree as in https://ci.chromium.org/ui/p/flutter/builders/prod/Mac_ios%20platform_views_scroll_perf_ios__timeline_summary/11103/overview --- .../framework/Source/FlutterPlatformViews.mm | 20 +- .../Source/FlutterPlatformViewsTest.mm | 88 +------- .../Source/FlutterPlatformViews_Internal.h | 21 +- .../Source/FlutterPlatformViews_Internal.mm | 53 ++--- .../Scenarios.xcodeproj/project.pbxproj | 12 -- .../ios/Scenarios/Scenarios/AppDelegate.m | 5 +- .../ScenariosUITests/GoldenTestManager.m | 3 - .../ScenariosUITests/PlatformViewUITests.m | 54 ----- ...one SE (3rd generation)_16.2_simulator.png | Bin 24014 -> 0 bytes ...one SE (3rd generation)_16.2_simulator.png | Bin 18548 -> 0 bytes ...one SE (3rd generation)_16.2_simulator.png | Bin 35060 -> 0 bytes .../scenario_app/lib/src/platform_view.dart | 199 +----------------- testing/scenario_app/lib/src/scenarios.dart | 3 - 13 files changed, 67 insertions(+), 391 deletions(-) delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png delete mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index 70fdf7936bf8d..51349cb70e1ff 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -18,6 +18,8 @@ #import "flutter/shell/platform/darwin/ios/framework/Source/FlutterViewController_Internal.h" #import "flutter/shell/platform/darwin/ios/ios_surface.h" +static const NSUInteger kFlutterClippingMaskViewPoolCapacity = 5; + @implementation UIView (FirstResponder) - (BOOL)flt_hasFirstResponderInViewHierarchySubtree { if (self.isFirstResponder) { @@ -445,8 +447,6 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, clipView.maskView = [mask_view_pool_.get() getMaskViewWithFrame:frame]; } -// This method is only called when the `embedded_view` needs to be re-composited at the current -// frame. See: `CompositeWithParams` for details. void FlutterPlatformViewsController::ApplyMutators(const MutatorsStack& mutators_stack, UIView* embedded_view, const SkRect& bounding_rect) { @@ -461,10 +461,12 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, NSMutableArray* blurFilters = [[[NSMutableArray alloc] init] autorelease]; FML_DCHECK(!clipView.maskView || [clipView.maskView isKindOfClass:[FlutterClippingMaskView class]]); - if (clipView.maskView) { - [mask_view_pool_.get() insertViewToPoolIfNeeded:(FlutterClippingMaskView*)(clipView.maskView)]; - clipView.maskView = nil; + if (mask_view_pool_.get() == nil) { + mask_view_pool_.reset([[FlutterClippingMaskViewPool alloc] + initWithCapacity:kFlutterClippingMaskViewPoolCapacity]); } + [mask_view_pool_.get() recycleMaskViews]; + clipView.maskView = nil; CGFloat screenScale = [UIScreen mainScreen].scale; auto iter = mutators_stack.Begin(); while (iter != mutators_stack.End()) { @@ -568,14 +570,6 @@ static bool ClipRRectContainsPlatformViewBoundingRect(const SkRRect& clip_rrect, embedded_view.layer.transform = flutter::GetCATransform3DFromSkMatrix(transformMatrix); } -// Composite the PlatformView with `view_id`. -// -// Every frame, during the paint traversal of the layer tree, this method is called for all -// the PlatformViews in `views_to_recomposite_`. -// -// Note that `views_to_recomposite_` does not represent all the views in the view hierarchy, -// if a PlatformView does not change its composition parameter from last frame, it is not -// included in the `views_to_recomposite_`. void FlutterPlatformViewsController::CompositeWithParams(int64_t view_id, const EmbeddedViewParams& params) { CGRect frame = CGRectMake(0, 0, params.sizePoints().width(), params.sizePoints().height()); diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm index 01aab6b5478e0..fd656a9d1767f 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViewsTest.mm @@ -2649,15 +2649,12 @@ - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle { [[[FlutterClippingMaskViewPool alloc] initWithCapacity:2] autorelease]; FlutterClippingMaskView* view1 = [pool getMaskViewWithFrame:CGRectZero]; FlutterClippingMaskView* view2 = [pool getMaskViewWithFrame:CGRectZero]; - [pool insertViewToPoolIfNeeded:view1]; - [pool insertViewToPoolIfNeeded:view2]; + [pool recycleMaskViews]; CGRect newRect = CGRectMake(0, 0, 10, 10); FlutterClippingMaskView* view3 = [pool getMaskViewWithFrame:newRect]; FlutterClippingMaskView* view4 = [pool getMaskViewWithFrame:newRect]; - // view3 and view4 should randomly get either of view1 and view2. - NSSet* set1 = [NSSet setWithObjects:view1, view2, nil]; - NSSet* set2 = [NSSet setWithObjects:view3, view4, nil]; - XCTAssertEqualObjects(set1, set2); + XCTAssertEqual(view1, view3); + XCTAssertEqual(view2, view4); XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect)); XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect)); } @@ -2730,6 +2727,10 @@ - (void)testClipMaskViewIsReused { auto embeddedViewParams1 = std::make_unique( screenScaleMatrix, SkSize::Make(10, 10), stack1); + flutter::MutatorsStack stack2; + auto embeddedViewParams2 = std::make_unique( + screenScaleMatrix, SkSize::Make(10, 10), stack2); + flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1)); flutterPlatformViewsController->CompositeEmbeddedView(1); UIView* childClippingView1 = gMockPlatformView.superview.superview; @@ -2737,10 +2738,6 @@ - (void)testClipMaskViewIsReused { XCTAssertNotNil(maskView1); // Composite a new frame. - flutterPlatformViewsController->BeginFrame(SkISize::Make(100, 100)); - flutter::MutatorsStack stack2; - auto embeddedViewParams2 = std::make_unique( - screenScaleMatrix, SkSize::Make(10, 10), stack2); auto embeddedViewParams3 = std::make_unique( screenScaleMatrix, SkSize::Make(10, 10), stack2); flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams3)); @@ -2766,77 +2763,6 @@ - (void)testClipMaskViewIsReused { XCTAssertNil(childClippingView1.maskView); } -- (void)testDifferentClipMaskViewIsUsedForEachView { - flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate; - auto thread_task_runner = CreateNewThread("FlutterPlatformViewsTest"); - flutter::TaskRunners runners(/*label=*/self.name.UTF8String, - /*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=*/flutter::IOSRenderingAPI::kSoftware, - /*platform_views_controller=*/flutterPlatformViewsController, - /*task_runners=*/runners); - - FlutterPlatformViewsTestMockFlutterPlatformFactory* factory = - [[FlutterPlatformViewsTestMockFlutterPlatformFactory new] autorelease]; - flutterPlatformViewsController->RegisterViewFactory( - factory, @"MockFlutterPlatformView", - FlutterPlatformViewGestureRecognizersBlockingPolicyEager); - FlutterResult result = ^(id result) { - }; - - flutterPlatformViewsController->OnMethodCall( - [FlutterMethodCall - methodCallWithMethodName:@"create" - arguments:@{@"id" : @1, @"viewType" : @"MockFlutterPlatformView"}], - result); - UIView* view1 = gMockPlatformView; - - // This overwrites `gMockPlatformView` to another view. - flutterPlatformViewsController->OnMethodCall( - [FlutterMethodCall - methodCallWithMethodName:@"create" - arguments:@{@"id" : @2, @"viewType" : @"MockFlutterPlatformView"}], - result); - UIView* view2 = gMockPlatformView; - - XCTAssertNotNil(gMockPlatformView); - UIView* mockFlutterView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)] autorelease]; - flutterPlatformViewsController->SetFlutterView(mockFlutterView); - // Create embedded view params - flutter::MutatorsStack stack1; - // Layer tree always pushes a screen scale factor to the stack - SkMatrix screenScaleMatrix = - SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale); - stack1.PushTransform(screenScaleMatrix); - // Push a clip rect - SkRect rect = SkRect::MakeXYWH(2, 2, 3, 3); - stack1.PushClipRect(rect); - - auto embeddedViewParams1 = std::make_unique( - screenScaleMatrix, SkSize::Make(10, 10), stack1); - - flutter::MutatorsStack stack2; - stack2.PushClipRect(rect); - auto embeddedViewParams2 = std::make_unique( - screenScaleMatrix, SkSize::Make(10, 10), stack2); - - flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1)); - flutterPlatformViewsController->CompositeEmbeddedView(1); - UIView* childClippingView1 = view1.superview.superview; - - flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams2)); - flutterPlatformViewsController->CompositeEmbeddedView(2); - UIView* childClippingView2 = view2.superview.superview; - UIView* maskView1 = childClippingView1.maskView; - UIView* maskView2 = childClippingView2.maskView; - XCTAssertNotEqual(maskView1, maskView2); -} - // Return true if a correct visual effect view is found. It also implies all the validation in this // method passes. // diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h index 55e9d5a8fc46c..8447d19ca2df9 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.h @@ -56,7 +56,7 @@ // in the pool. If there are none available, a new FlutterClippingMaskView is constructed. If the // capacity is reached, the newly constructed FlutterClippingMaskView is not added to the pool. // -// Call |insertViewToPoolIfNeeded:| to return a maskView to the pool. +// Call |recycleMaskViews| to mark all the FlutterClippingMaskViews in the pool available. @interface FlutterClippingMaskViewPool : NSObject // Initialize the pool with `capacity`. When the `capacity` is reached, a FlutterClippingMaskView is @@ -66,8 +66,8 @@ // Reuse a maskView from the pool, or allocate a new one. - (FlutterClippingMaskView*)getMaskViewWithFrame:(CGRect)frame; -// Insert the `maskView` into the pool. -- (void)insertViewToPoolIfNeeded:(FlutterClippingMaskView*)maskView; +// Mark all the maskViews available. +- (void)recycleMaskViews; @end @@ -291,12 +291,20 @@ class FlutterPlatformViewsController { int CountClips(const MutatorsStack& mutators_stack); void ClipViewSetMaskView(UIView* clipView); - // Applies the mutators in the mutators_stack to the UIView chain that was constructed by // `ReconstructClipViewsChain` // - // Clips are applied to the `embedded_view`'s super view(|ChildClippingView|) using a - // |FlutterClippingMaskView|. Transforms are applied to `embedded_view` + // Clips are applied to the super view with a CALayer mask. Transforms are applied to the + // current view that's at the head of the chain. For example the following mutators stack [T_1, + // C_2, T_3, T_4, C_5, T_6] where T denotes a transform and C denotes a clip, will result in the + // following UIView tree: + // + // C_2 -> C_5 -> PLATFORM_VIEW + // (PLATFORM_VIEW is a subview of C_5 which is a subview of C_2) + // + // T_1 is applied to C_2, T_3 and T_4 are applied to C_5, and T_6 is applied to PLATFORM_VIEW. + // + // After each clip operation, we update the head to the super view of the current head. // // The `bounding_rect` is the final bounding rect of the PlatformView // (EmbeddedViewParams::finalBoundingRect). If a clip mutator's rect contains the final bounding @@ -304,7 +312,6 @@ class FlutterPlatformViewsController { void ApplyMutators(const MutatorsStack& mutators_stack, UIView* embedded_view, const SkRect& bounding_rect); - void CompositeWithParams(int64_t view_id, const EmbeddedViewParams& params); // Allocates a new FlutterPlatformViewLayer if needed, draws the pixels within the rect from diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index ebcfcad0ddfc1..89e1687795248 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -9,7 +9,6 @@ #import "flutter/shell/platform/darwin/ios/ios_surface.h" static int kMaxPointsInVerb = 4; -static const NSUInteger kFlutterClippingMaskViewPoolCapacity = 5; namespace flutter { @@ -27,10 +26,7 @@ FlutterPlatformViewsController::FlutterPlatformViewsController() : layer_pool_(std::make_unique()), - weak_factory_(std::make_unique>(this)) { - mask_view_pool_.reset( - [[FlutterClippingMaskViewPool alloc] initWithCapacity:kFlutterClippingMaskViewPoolCapacity]); -}; + weak_factory_(std::make_unique>(this)){}; FlutterPlatformViewsController::~FlutterPlatformViewsController() = default; @@ -462,10 +458,9 @@ @interface FlutterClippingMaskViewPool () // The maximum number of `FlutterClippingMaskView` the pool can contain. // This prevents the pool to grow infinately and limits the maximum memory a pool can use. @property(assign, nonatomic) NSUInteger capacity; - -// The pool contains the views that are available to use. -// The number of items in the pool must not excceds `capacity`. -@property(retain, nonatomic) NSMutableSet* pool; +@property(retain, nonatomic) NSMutableArray* pool; +// The index points to the first available FlutterClippingMaskView in the `pool`. +@property(assign, nonatomic) NSUInteger availableIndex; @end @@ -473,42 +468,48 @@ @implementation FlutterClippingMaskViewPool : NSObject - (instancetype)initWithCapacity:(NSInteger)capacity { if (self = [super init]) { - // Most of cases, there are only one PlatformView in the scene. - // Thus init with the capacity of 1. - _pool = [[NSMutableSet alloc] initWithCapacity:1]; + _pool = [[NSMutableArray alloc] initWithCapacity:capacity]; _capacity = capacity; + _availableIndex = 0; } return self; } - (FlutterClippingMaskView*)getMaskViewWithFrame:(CGRect)frame { - FML_DCHECK(self.pool.count <= self.capacity); + FML_DCHECK(self.availableIndex <= self.capacity); FlutterClippingMaskView* maskView; - if (self.pool.count == 0) { - // The pool is empty, alloc a new one. + if (self.availableIndex == self.capacity) { + // The pool is full, alloc a new one. maskView = [[[FlutterClippingMaskView alloc] initWithFrame:frame screenScale:[UIScreen mainScreen].scale] autorelease]; return maskView; } - maskView = [self.pool anyObject]; - maskView.frame = frame; - [maskView reset]; - [self.pool removeObject:maskView]; + + if (self.availableIndex >= self.pool.count) { + // The pool doesn't have enough maskViews, alloc a new one and add to the pool. + maskView = + [[[FlutterClippingMaskView alloc] initWithFrame:frame + screenScale:[UIScreen mainScreen].scale] autorelease]; + [self.pool addObject:maskView]; + FML_DCHECK(self.pool.count <= self.capacity); + } else { + // Reuse a maskView from the pool. + maskView = [self.pool objectAtIndex:self.availableIndex]; + maskView.frame = frame; + [maskView reset]; + } + self.availableIndex++; return maskView; } -- (void)insertViewToPoolIfNeeded:(FlutterClippingMaskView*)maskView { - FML_DCHECK(![self.pool containsObject:maskView]); - FML_DCHECK(self.pool.count <= self.capacity); - if (self.pool.count == self.capacity) { - return; - } - [self.pool addObject:maskView]; +- (void)recycleMaskViews { + self.availableIndex = 0; } - (void)dealloc { [_pool release]; + _pool = nil; [super dealloc]; } diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 4e69202318806..0fcb3c83f3e1f 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -57,9 +57,6 @@ 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 684FFF7929F9C10600281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png */; }; 684FFF8E29F9C10700281002 /* golden_spawn_engine_works_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 684FFF7A29F9C10700281002 /* golden_spawn_engine_works_iPhone SE (3rd generation)_16.2_simulator.png */; }; 684FFF8F29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 684FFF7B29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */; }; - 6860CE252A01B2FF00B68EC5 /* golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6860CE222A01B2FF00B68EC5 /* golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png */; }; - 6860CE262A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6860CE232A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png */; }; - 6860CE272A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 6860CE242A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png */; }; 68A5B63423EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 68A5B63323EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m */; }; 68D4017D2564859300ECD91A /* ContinuousTexture.m in Sources */ = {isa = PBXBuildFile; fileRef = 68D4017C2564859300ECD91A /* ContinuousTexture.m */; }; F26F15B8268B6B5600EC54D3 /* iPadGestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */; }; @@ -177,9 +174,6 @@ 684FFF7929F9C10600281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; 684FFF7A29F9C10700281002 /* golden_spawn_engine_works_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_spawn_engine_works_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; 684FFF7B29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; - 6860CE222A01B2FF00B68EC5 /* golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; - 6860CE232A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; - 6860CE242A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png"; sourceTree = ""; }; 68A5B63323EB71D300BDBCDB /* PlatformViewGestureRecognizerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PlatformViewGestureRecognizerTests.m; sourceTree = ""; }; 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 = ""; }; @@ -308,9 +302,6 @@ F7B464DC2759D02B00079189 /* Goldens */ = { isa = PBXGroup; children = ( - 6860CE242A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png */, - 6860CE232A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png */, - 6860CE222A01B2FF00B68EC5 /* golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png */, 684FFF7229F9C10500281002 /* golden_bogus_font_text_iPhone SE (3rd generation)_16.2_simulator.png */, 684FFF7029F9C10500281002 /* golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_16.2_simulator.png */, 684FFF7729F9C10600281002 /* golden_platform_view_clippath_iPhone SE (3rd generation)_16.2_simulator.png */, @@ -465,9 +456,7 @@ 684FFF7D29F9C10700281002 /* golden_platform_view_cliprect_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8829F9C10700281002 /* golden_platform_view_cliprect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8529F9C10700281002 /* golden_platform_view_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, - 6860CE252A01B2FF00B68EC5 /* golden_two_platform_view_clip_rrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8F29F9C10700281002 /* golden_platform_view_with_other_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, - 6860CE262A01B2FF00B68EC5 /* golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8A29F9C10700281002 /* golden_platform_view_clippath_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8429F9C10700281002 /* golden_non_full_screen_flutter_view_platform_view_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF7C29F9C10700281002 /* golden_platform_view_cliprrect_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, @@ -480,7 +469,6 @@ 684FFF8D29F9C10700281002 /* golden_platform_view_large_cliprrect_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8329F9C10700281002 /* golden_platform_view_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8B29F9C10700281002 /* golden_platform_view_clippath_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, - 6860CE272A01B2FF00B68EC5 /* golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8129F9C10700281002 /* golden_platform_view_large_cliprrect_with_transform_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 4dca96551a3b7..28c84f8e6896f 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -69,10 +69,7 @@ - (BOOL)application:(UIApplication*)application @"--spawn-engine-works" : @"spawn_engine_works", @"--pointer-events" : @"pointer_events", @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget", - @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", - @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", - @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", - @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", + @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved" }; __block NSString* flutterViewControllerTestName = nil; [launchArgsMap diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index 3bcff696844a0..6ecb07a7c7c5d 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -47,9 +47,6 @@ - (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", - @"--two-platform-view-clip-rect" : @"two_platform_view_clip_rect", - @"--two-platform-view-clip-rrect" : @"two_platform_view_clip_rrect", - @"--two-platform-view-clip-path" : @"two_platform_view_clip_path", }; }); _identifier = launchArgsMap[launchArg]; diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index cd28f98781440..47d49f3c7779c 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -254,60 +254,6 @@ - (void)testPlatformView { @end -@interface TwoPlatformViewClipRectTests : GoldenPlatformViewTests - -@end - -@implementation TwoPlatformViewClipRectTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rect"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkPlatformViewGolden]; -} - -@end - -@interface TwoPlatformViewClipRRectTests : GoldenPlatformViewTests - -@end - -@implementation TwoPlatformViewClipRRectTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-rrect"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkPlatformViewGolden]; -} - -@end - -@interface TwoPlatformViewClipPathTests : GoldenPlatformViewTests - -@end - -@implementation TwoPlatformViewClipPathTests - -- (instancetype)initWithInvocation:(NSInvocation*)invocation { - GoldenTestManager* manager = - [[GoldenTestManager alloc] initWithLaunchArg:@"--two-platform-view-clip-path"]; - return [super initWithManager:manager invocation:invocation]; -} - -- (void)testPlatformView { - [self checkPlatformViewGolden]; -} - -@end - @interface PlatformViewMutationTransformTests : GoldenPlatformViewTests @end diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_path_iPhone SE (3rd generation)_16.2_simulator.png deleted file mode 100644 index 71caaac361f030626718202b07cf5fcb82de0428..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24014 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 Qzoo9Cpedhy?(*IL2PKCMjsO4v diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_two_platform_view_clip_rect_iPhone SE (3rd generation)_16.2_simulator.png deleted file mode 100644 index d90daed50411ab590f9c985790875d7dcaf04215..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18548 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 ZBcFDM_Z&(&Cwc>TnHZZJJuq+y`x{fER@VRk diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index 741ed0c854cef..75ccd395206be 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -112,6 +112,7 @@ class PlatformViewNoOverlayIntersectionScenario extends Scenario } } + /// A platform view that is larger than the display size. /// This is only applicable on Android while using virtual displays. /// Related issue: https://github.com/flutter/flutter/issues/28978. @@ -575,7 +576,7 @@ class PlatformViewClipRectAfterMovedScenario extends Scenario with _BasePlatform ..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); addPlatformView( - _numberOfFrames == 10? 10000: id, + _numberOfFrames == 10? 10000:id, dispatcher: view.platformDispatcher, sceneBuilder: builder, ); @@ -638,6 +639,7 @@ class PlatformViewClipRRectScenario extends PlatformViewScenario { } } + /// Platform view with clip rrect. /// The bounding rect of the rrect is the same as PlatformView and only the corner radii clips the PlatformView. class PlatformViewLargeClipRRectScenario extends PlatformViewScenario { @@ -876,187 +878,6 @@ class PlatformViewClipPathWithTransformScenario extends PlatformViewScenario { } } -/// Two platform views, both have clip rects -class TwoPlatformViewClipRect extends Scenario - with _BasePlatformViewScenarioMixin { - /// Creates the PlatformView scenario. - TwoPlatformViewClipRect( - super.view, { - required this.firstId, - required this.secondId, - }); - - /// The platform view identifier to use for the first platform view. - final int firstId; - - /// The platform view identifier to use for the second platform view. - final int secondId; - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - builder.pushOffset(0, 600); - builder.pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); - - addPlatformView( - firstId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 1', - ); - - builder.pop(); - builder.pop(); - - // Use a different rect to differentiate from the 1st clip rect. - builder.pushClipRect(const Rect.fromLTRB(100, 100, 300, 300)); - - addPlatformView( - secondId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 2', - ); - - builder.pop(); - final Scene scene = builder.build(); - view.render(scene); - scene.dispose(); - } -} - -/// Two platform views, both have clip rrects -class TwoPlatformViewClipRRect extends Scenario - with _BasePlatformViewScenarioMixin { - /// Creates the PlatformView scenario. - TwoPlatformViewClipRRect( - super.view, { - required this.firstId, - required this.secondId, - }); - - /// The platform view identifier to use for the first platform view. - final int firstId; - - /// The platform view identifier to use for the second platform view. - final int secondId; - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - builder.pushOffset(0, 600); - builder.pushClipRRect( - RRect.fromLTRBAndCorners( - 0, - 0, - 500, - 500, - topLeft: const Radius.circular(15), - topRight: const Radius.circular(50), - bottomLeft: const Radius.circular(50), - ), - ); - - addPlatformView( - firstId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 1', - ); - - builder.pop(); - builder.pop(); - - // Use a different rrect to differentiate from the 1st clip rrect. - builder.pushClipRRect( - RRect.fromLTRBAndCorners( - 0, - 0, - 500, - 500, - topLeft: const Radius.circular(100), - topRight: const Radius.circular(50), - bottomLeft: const Radius.circular(50), - ), - ); - - addPlatformView( - secondId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 2', - ); - - builder.pop(); - final Scene scene = builder.build(); - view.render(scene); - scene.dispose(); - } -} - -/// Two platform views, both have clip path -class TwoPlatformViewClipPath extends Scenario - with _BasePlatformViewScenarioMixin { - /// Creates the PlatformView scenario. - TwoPlatformViewClipPath( - super.view, { - required this.firstId, - required this.secondId, - }); - - /// The platform view identifier to use for the first platform view. - final int firstId; - - /// The platform view identifier to use for the second platform view. - final int secondId; - - @override - void onBeginFrame(Duration duration) { - final SceneBuilder builder = SceneBuilder(); - builder.pushOffset(0, 600); - final Path path = Path() - ..moveTo(100, 100) - ..quadraticBezierTo(50, 250, 100, 400) - ..lineTo(350, 400) - ..cubicTo(400, 300, 300, 200, 350, 100) - ..close(); - - builder.pushClipPath(path); - - addPlatformView( - firstId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 1', - ); - - builder.pop(); - builder.pop(); - - // Use a different path to differentiate from the 1st clip path. - final Path path2 = Path() - ..moveTo(100, 100) - ..quadraticBezierTo(100, 150, 100, 400) - ..lineTo(350, 350) - ..cubicTo(400, 300, 300, 200, 350, 200) - ..close(); - - builder.pushClipPath(path2); - - addPlatformView( - secondId, - dispatcher: view.platformDispatcher, - sceneBuilder: builder, - text: 'platform view 2', - ); - - builder.pop(); - final Scene scene = builder.build(); - view.render(scene); - scene.dispose(); - } -} - /// Platform view with transform. class PlatformViewTransformScenario extends PlatformViewScenario { /// Constructs a platform view with transform scenario. @@ -1223,10 +1044,10 @@ class PlatformViewForOverlappingPlatformViewsScenario extends Scenario /// Creates the PlatformViewForOverlappingPlatformViewsScenario. PlatformViewForOverlappingPlatformViewsScenario( - super.view, { - required this.foregroundId, - required this.backgroundId, - }) { + super.view, { + required this.foregroundId, + required this.backgroundId, + }) { _nextFrame = _firstFrame; } @@ -1330,7 +1151,7 @@ class PlatformViewForOverlappingPlatformViewsScenario extends Scenario view.platformDispatcher.sendPlatformMessage( 'flutter/platform_views', message.buffer.asByteData(), - (ByteData? response) {}, + (ByteData? response) {}, ); } } @@ -1539,7 +1360,7 @@ class PlatformViewScrollingUnderWidget extends Scenario super.view, { required int firstPlatformViewId, required int lastPlatformViewId, - }) : _firstPlatformViewId = firstPlatformViewId, + }) : _firstPlatformViewId = firstPlatformViewId, _lastPlatformViewId = lastPlatformViewId; final int _firstPlatformViewId; @@ -1629,6 +1450,7 @@ void addPlatformView( } final String platformViewKey = '$viewType-$id'; + if (_createdPlatformViews.containsKey(platformViewKey)) { addPlatformViewToSceneBuilder( id, @@ -1651,6 +1473,7 @@ void addPlatformView( const int valueString = 7; const int valueUint8List = 8; const int valueMap = 13; + final Uint8List message = Uint8List.fromList([ valueString, ..._encodeString('create'), diff --git a/testing/scenario_app/lib/src/scenarios.dart b/testing/scenario_app/lib/src/scenarios.dart index e18f3a8009525..ff71e609e0cdd 100644 --- a/testing/scenario_app/lib/src/scenarios.dart +++ b/testing/scenario_app/lib/src/scenarios.dart @@ -53,9 +53,6 @@ Map _scenarios = { 'platform_view_gesture_reject_after_touches_ended': (FlutterView view) => PlatformViewForTouchIOSScenario(view, id: _viewId++, accept: false, rejectUntilTouchesEnded: true), '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), - 'two_platform_view_clip_rect': (FlutterView view) => TwoPlatformViewClipRect(view, firstId: _viewId++, secondId: _viewId++), - 'two_platform_view_clip_rrect': (FlutterView view) => TwoPlatformViewClipRRect(view, firstId: _viewId++, secondId: _viewId++), - 'two_platform_view_clip_path': (FlutterView view) => TwoPlatformViewClipPath(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++),