From 7e60a47eea49ee687261b93f299ce8d3f67cd0cf Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Thu, 16 Feb 2023 12:26:16 -0800 Subject: [PATCH] test (flutter/engine#39630) more comments --- .../Source/FlutterPlatformViews_Internal.mm | 5 ++ .../Scenarios.xcodeproj/project.pbxproj | 4 ++ .../ios/Scenarios/Scenarios/AppDelegate.m | 3 +- .../ScenariosUITests/GoldenTestManager.m | 1 + .../ScenariosUITests/PlatformViewUITests.m | 30 ++++++++++ ...ct_after_moved_iPhone 8_16.0_simulator.png | Bin 0 -> 17964 bytes .../scenario_app/lib/src/platform_view.dart | 55 ++++++++++++++++++ .../scenario_app/lib/src/scenarios.dart | 1 + 8 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png diff --git a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm index da7f156baf..9520e37ede 100644 --- a/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm +++ b/engine/src/flutter/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews_Internal.mm @@ -271,6 +271,11 @@ static BOOL _preparedOnce = NO; return self; } +- (void)reset { + paths_.clear(); + [self setNeedsDisplay]; +} + // 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. diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index 5294a9b254..cb6fa4b3e2 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -37,6 +37,7 @@ 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */; }; 6816DBA12317573300A51400 /* GoldenImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA02317573300A51400 /* GoldenImage.m */; }; 6816DBA42318358200A51400 /* GoldenTestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA32318358200A51400 /* GoldenTestManager.m */; }; + 682C5873299C182A00915E5C /* golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 682C5872299C182A00915E5C /* golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png */; }; 685B9F392977B73100B45442 /* golden_platform_view_large_cliprrect_with_transform_iPhone 8_16.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 685B9F372977B73100B45442 /* golden_platform_view_large_cliprrect_with_transform_iPhone 8_16.0_simulator.png */; }; 685B9F3A2977B73100B45442 /* golden_platform_view_large_cliprrect_iPhone 8_16.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 685B9F382977B73100B45442 /* golden_platform_view_large_cliprrect_iPhone 8_16.0_simulator.png */; }; 687AF8E9291EBDE0003912C7 /* golden_platform_view_clippath_with_transform_iPhone 8_16.0_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 687AF8E8291EBDE0003912C7 /* golden_platform_view_clippath_with_transform_iPhone 8_16.0_simulator.png */; }; @@ -153,6 +154,7 @@ 6816DBA02317573300A51400 /* GoldenImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenImage.m; sourceTree = ""; }; 6816DBA22318358200A51400 /* GoldenTestManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenTestManager.h; sourceTree = ""; }; 6816DBA32318358200A51400 /* GoldenTestManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenTestManager.m; sourceTree = ""; }; + 682C5872299C182A00915E5C /* golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png"; sourceTree = ""; }; 685B9F372977B73100B45442 /* golden_platform_view_large_cliprrect_with_transform_iPhone 8_16.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_with_transform_iPhone 8_16.0_simulator.png"; sourceTree = ""; }; 685B9F382977B73100B45442 /* golden_platform_view_large_cliprrect_iPhone 8_16.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_large_cliprrect_iPhone 8_16.0_simulator.png"; sourceTree = ""; }; 687AF8E8291EBDE0003912C7 /* golden_platform_view_clippath_with_transform_iPhone 8_16.0_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_clippath_with_transform_iPhone 8_16.0_simulator.png"; sourceTree = ""; }; @@ -300,6 +302,7 @@ F7B464DC2759D02B00079189 /* Goldens */ = { isa = PBXGroup; children = ( + 682C5872299C182A00915E5C /* golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png */, 685B9F382977B73100B45442 /* golden_platform_view_large_cliprrect_iPhone 8_16.0_simulator.png */, 685B9F372977B73100B45442 /* golden_platform_view_large_cliprrect_with_transform_iPhone 8_16.0_simulator.png */, 68D50041291ED8CD001ACFE1 /* golden_platform_view_cliprect_with_transform_iPhone 8_16.0_simulator.png */, @@ -447,6 +450,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 682C5873299C182A00915E5C /* golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png in Resources */, 68D50042291ED8CD001ACFE1 /* golden_platform_view_cliprect_with_transform_iPhone 8_16.0_simulator.png in Resources */, F7B464F62759D0A900079189 /* golden_non_full_screen_flutter_view_platform_view_iPhone 8_16.0_simulator.png in Resources */, F7B464F02759D0A900079189 /* golden_bogus_font_text_iPhone 8_16.0_simulator.png in Resources */, diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m b/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m index 5118a4e6b4..2711d846bc 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/engine/src/flutter/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -66,7 +66,8 @@ @"--bogus-font-text" : @"bogus_font_text", @"--spawn-engine-works" : @"spawn_engine_works", @"--pointer-events" : @"pointer_events", - @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget" + @"--platform-view-scrolling-under-widget" : @"platform_view_scrolling_under_widget", + @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved" }; __block NSString* flutterViewControllerTestName = nil; [launchArgsMap diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m index 26838a3a47..6ecb07a7c7 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m +++ b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/GoldenTestManager.m @@ -46,6 +46,7 @@ NSDictionary* launchArgsMap; @"non_full_screen_flutter_view_platform_view", @"--bogus-font-text" : @"bogus_font_text", @"--spawn-engine-works" : @"spawn_engine_works", + @"--platform-view-cliprect-after-moved" : @"platform_view_cliprect_after_moved", }; }); _identifier = launchArgsMap[launchArg]; diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index a37122b1a4..47d49f3c77 100644 --- a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -98,6 +98,36 @@ static const NSInteger kSecondsToWaitForPlatformView = 30; @end +@interface PlatformViewMutationClipRectAfterMovedTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewMutationClipRectAfterMovedTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = + [[GoldenTestManager alloc] initWithLaunchArg:@"--platform-view-cliprect-after-moved"]; + 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 diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_cliprect_after_moved_iPhone 8_16.0_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..a48b0da44c6a26e1376cb81945550cdcdc2b22ba GIT binary patch literal 17964 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 GLK6Vg+o#F^ literal 0 HcmV?d00001 diff --git a/engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart b/engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart index 96384f1079..adcb6dd736 100644 --- a/engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart +++ b/engine/src/flutter/testing/scenario_app/lib/src/platform_view.dart @@ -573,6 +573,61 @@ class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenar } } +/// Platform view with clip rect then the PlatformView is moved for 10 frames. +/// +/// The clip rect moves with the same transform matrix with the PlatformView. +class PlatformViewClipRectAfterMovedScenario extends Scenario with _BasePlatformViewScenarioMixin { + /// Constructs a platform view with clip rect scenario. + PlatformViewClipRectAfterMovedScenario( + PlatformDispatcher dispatcher, { + required this.id, + }) : super(dispatcher); + + /// The platform view identifier. + final int id; + + int _numberOfFrames = 0; + + double _y = 100.0; + + @override + void onBeginFrame(Duration duration) { + final Matrix4 translateMatrix = Matrix4.identity()..translate(0.0, _y); + final SceneBuilder builder = SceneBuilder() + ..pushTransform(translateMatrix.storage) + ..pushClipRect(const Rect.fromLTRB(100, 100, 400, 400)); + + addPlatformView( + _numberOfFrames == 10? 10000:id, + dispatcher: dispatcher, + sceneBuilder: builder, + ); + + // Add a translucent rect that has the same size of PlatformView. + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + canvas.drawRect( + const Rect.fromLTWH(0, 0, 500, 500), + Paint()..color = const Color(0x22FF0000), + ); + final Picture picture = recorder.endRecording(); + builder.addPicture(Offset.zero, picture); + + finishBuilder(builder); + super.onBeginFrame(duration); + } + + @override + void onDrawFrame() { + if (_numberOfFrames < 10) { + _numberOfFrames ++; + _y -= 10; + window.scheduleFrame(); + } + super.onDrawFrame(); + } +} + /// Platform view with clip rrect. class PlatformViewClipRRectScenario extends PlatformViewScenario { /// Constructs a platform view with clip rrect scenario. diff --git a/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart b/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart index 61c9437cb0..94445d4254 100644 --- a/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart +++ b/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart @@ -32,6 +32,7 @@ Map _scenarios = { 'platform_view_max_overlays': () => PlatformViewMaxOverlaysScenario(PlatformDispatcher.instance, id: _viewId++), 'platform_view_cliprect': () => PlatformViewClipRectScenario(PlatformDispatcher.instance, id: _viewId++), 'platform_view_cliprect_with_transform': () => PlatformViewClipRectWithTransformScenario(PlatformDispatcher.instance, id: _viewId++), + 'platform_view_cliprect_after_moved': () => PlatformViewClipRectAfterMovedScenario(PlatformDispatcher.instance, id: _viewId++), 'platform_view_cliprrect': () => PlatformViewClipRRectScenario(PlatformDispatcher.instance, id: _viewId++), 'platform_view_large_cliprrect': () => PlatformViewLargeClipRRectScenario(PlatformDispatcher.instance, id: _viewId++), 'platform_view_cliprrect_with_transform': () => PlatformViewClipRRectWithTransformScenario(PlatformDispatcher.instance, id: _viewId++),