From c63aefd28b0644bc215fb3888df4de8cfefad5f4 Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Thu, 31 Oct 2019 10:30:15 -0700 Subject: [PATCH] Fix iOS crash when multiple platform views are in the scene (#13449) Having 2 or more platform views simultaneously in the layer tree was crashing immediately on iOS with GL backend. This regressed in #11070 which passed gl_context to a function in a loop using std::move (which meant on the second iteration the caller is no longer the owner of the field). I added a scenarios_app test, though this test doesn't run on a physical device on CI so it would have only caught the problem when running locally (flutter/flutter#43852). --- .../framework/Source/FlutterPlatformViews.mm | 2 +- .../Scenarios.xcodeproj/project.pbxproj | 4 ++ .../ios/Scenarios/Scenarios/AppDelegate.m | 1 + .../PlatformViewGoldenTestManager.m | 1 + .../ScenariosUITests/PlatformViewUITests.m | 18 +++++++ ...form_view_multiple_iPhone SE_simulator.png | Bin 0 -> 29685 bytes testing/scenario_app/lib/main.dart | 1 + .../scenario_app/lib/src/platform_view.dart | 50 +++++++++++++++--- 8 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE_simulator.png diff --git a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm index be8574eb3..128a7d68a 100644 --- a/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm +++ b/shell/platform/darwin/ios/framework/Source/FlutterPlatformViews.mm @@ -368,7 +368,7 @@ bool FlutterPlatformViewsController::SubmitFrame(GrContext* gr_context, bool did_submit = true; for (int64_t view_id : composition_order_) { - EnsureOverlayInitialized(view_id, std::move(gl_context), gr_context); + EnsureOverlayInitialized(view_id, gl_context, gr_context); auto frame = overlays_[view_id]->surface->AcquireFrame(frame_size_); SkCanvas* canvas = frame->SkiaCanvas(); canvas->drawPicture(picture_recorders_[view_id]->finishRecordingAsPicture()); diff --git a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj index a95587c1a..622aeb773 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj +++ b/testing/scenario_app/ios/Scenarios/Scenarios.xcodeproj/project.pbxproj @@ -30,6 +30,7 @@ 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */; }; 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */; }; 24F1FB89230B4579005ACE7C /* TextPlatformView.m in Sources */ = {isa = PBXBuildFile; fileRef = 24F1FB87230B4579005ACE7C /* TextPlatformView.m */; }; + 59A97FD8236A49D300B4C066 /* golden_platform_view_multiple_iPhone SE_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 59A97FD7236A49D300B4C066 /* golden_platform_view_multiple_iPhone SE_simulator.png */; }; 6816DB9E231750ED00A51400 /* GoldenPlatformViewTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */; }; 6816DBA12317573300A51400 /* GoldenImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA02317573300A51400 /* GoldenImage.m */; }; 6816DBA42318358200A51400 /* PlatformViewGoldenTestManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 6816DBA32318358200A51400 /* PlatformViewGoldenTestManager.m */; }; @@ -121,6 +122,7 @@ 24D47D1E230CA4480069DD5E /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 24F1FB87230B4579005ACE7C /* TextPlatformView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TextPlatformView.m; sourceTree = ""; }; 24F1FB88230B4579005ACE7C /* TextPlatformView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextPlatformView.h; sourceTree = ""; }; + 59A97FD7236A49D300B4C066 /* golden_platform_view_multiple_iPhone SE_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_multiple_iPhone SE_simulator.png"; sourceTree = ""; }; 6816DB9C231750ED00A51400 /* GoldenPlatformViewTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenPlatformViewTests.h; sourceTree = ""; }; 6816DB9D231750ED00A51400 /* GoldenPlatformViewTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GoldenPlatformViewTests.m; sourceTree = ""; }; 6816DB9F2317573300A51400 /* GoldenImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GoldenImage.h; sourceTree = ""; }; @@ -216,6 +218,7 @@ 248D76ED22E388380012F0C1 /* ScenariosUITests */ = { isa = PBXGroup; children = ( + 59A97FD7236A49D300B4C066 /* golden_platform_view_multiple_iPhone SE_simulator.png */, 244EA6CF230DBE8900B2D26E /* golden_platform_view_D21AP.png */, 24D47D1C230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png */, 24D47D1A230C79840069DD5E /* golden_platform_view_D211AP.png */, @@ -375,6 +378,7 @@ 6816DBAA2318696600A51400 /* golden_platform_view_clippath_iPhone SE_simulator.png in Resources */, 6816DBAD2318696600A51400 /* golden_platform_view_cliprect_iPhone SE_simulator.png in Resources */, 24D47D1B230C79840069DD5E /* golden_platform_view_D211AP.png in Resources */, + 59A97FD8236A49D300B4C066 /* golden_platform_view_multiple_iPhone SE_simulator.png in Resources */, 24D47D1D230CA2700069DD5E /* golden_platform_view_iPhone SE_simulator.png in Resources */, 244EA6D0230DBE8900B2D26E /* golden_platform_view_D21AP.png in Resources */, 6816DBAC2318696600A51400 /* golden_platform_view_opacity_iPhone SE_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 205ce7938..a2a6da971 100644 --- a/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m +++ b/testing/scenario_app/ios/Scenarios/Scenarios/AppDelegate.m @@ -28,6 +28,7 @@ // The launchArgsMap should match the one in the `PlatformVieGoldenTestManager`. NSDictionary* launchArgsMap = @{ @"--platform-view" : @"platform_view", + @"--platform-view-multiple" : @"platform_view_multiple", @"--platform-view-cliprect" : @"platform_view_cliprect", @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-clippath" : @"platform_view_clippath", diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m index 9e512d523..276514bc3 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewGoldenTestManager.m @@ -23,6 +23,7 @@ NSDictionary* launchArgsMap; dispatch_once(&onceToken, ^{ launchArgsMap = @{ @"--platform-view" : @"platform_view", + @"--platform-view-multiple" : @"platform_view_multiple", @"--platform-view-cliprect" : @"platform_view_cliprect", @"--platform-view-cliprrect" : @"platform_view_cliprrect", @"--platform-view-clippath" : @"platform_view_clippath", diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m index 00708ecc2..53dbea11b 100644 --- a/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m +++ b/testing/scenario_app/ios/Scenarios/ScenariosUITests/PlatformViewUITests.m @@ -22,6 +22,24 @@ @end +@interface MultiplePlatformViewsTest : GoldenPlatformViewTests + +@end + +@implementation MultiplePlatformViewsTest + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + PlatformViewGoldenTestManager* manager = + [[PlatformViewGoldenTestManager alloc] initWithLaunchArg:@"--platform-view-multiple"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkGolden]; +} + +@end + // Clip Rect Tests @interface PlatformViewMutationClipRectTests : GoldenPlatformViewTests diff --git a/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE_simulator.png b/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_multiple_iPhone SE_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..f3176650205d4383b1c57b6b2b970fb03688607e GIT binary patch literal 29685 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 literal 0 HcmV?d00001 diff --git a/testing/scenario_app/lib/main.dart b/testing/scenario_app/lib/main.dart index bbc164544..2eabb4f04 100644 --- a/testing/scenario_app/lib/main.dart +++ b/testing/scenario_app/lib/main.dart @@ -22,6 +22,7 @@ Map _scenarios = { 'platform_view_clippath': PlatformViewClipPathScenario(window, 'PlatformViewClipPath', id: 3), 'platform_view_transform': PlatformViewTransformScenario(window, 'PlatformViewTransform', id: 4), 'platform_view_opacity': PlatformViewOpacityScenario(window, 'PlatformViewOpacity', id: 5), + 'platform_view_multiple': MultiPlatformViewScenario(window, firstId: 6, secondId: 7), 'poppable_screen': PoppableScreenScenario(window), }; diff --git a/testing/scenario_app/lib/src/platform_view.dart b/testing/scenario_app/lib/src/platform_view.dart index e24ef2b80..3fda49681 100644 --- a/testing/scenario_app/lib/src/platform_view.dart +++ b/testing/scenario_app/lib/src/platform_view.dart @@ -34,7 +34,7 @@ class PlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin PlatformViewScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { - constructScenario(window, text, id); + createPlatformView(window, text, id); } @override @@ -47,13 +47,45 @@ class PlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin } } +/// Builds a scene with 2 platform views. +class MultiPlatformViewScenario extends Scenario with _BasePlatformViewScenarioMixin { + /// Creates the PlatformView scenario. + /// + /// The [window] parameter must not be null. + MultiPlatformViewScenario(Window window, {this.firstId, this.secondId}) + : assert(window != null), + super(window) { + createPlatformView(window, 'platform view 1', firstId); + createPlatformView(window, 'platform view 2', 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, 0); + + builder.pushOffset(0, 600); + _addPlatformViewtoScene(builder, firstId, 500, 500); + builder.pop(); + + finishBuilderByAddingPlatformViewAndPicture(builder, secondId); + } +} + /// Platform view with clip rect. class PlatformViewClipRectScenario extends Scenario with _BasePlatformViewScenarioMixin { /// Constructs a platform view with clip rect scenario. PlatformViewClipRectScenario(Window window, String text, {int id = 0}) : assert(window != null), super(window) { - constructScenario(window, text, id); + createPlatformView(window, text, id); } @override @@ -165,7 +197,7 @@ mixin _BasePlatformViewScenarioMixin on Scenario { /// It prepare a TextPlatformView so it can be added to the SceneBuilder in `onBeginFrame`. /// Call this method in the constructor of the platform view related scenarios /// to perform necessary set up. - void constructScenario(Window window, String text, int id) { + void createPlatformView(Window window, String text, int id) { const int _valueInt32 = 3; const int _valueFloat64 = 6; const int _valueString = 7; @@ -227,15 +259,19 @@ mixin _BasePlatformViewScenarioMixin on Scenario { ); } - // Add a platform view and a picture to the scene, then finish the `sceneBuilder`. - void finishBuilderByAddingPlatformViewAndPicture(SceneBuilder sceneBuilder, int viewId) { + void _addPlatformViewtoScene(SceneBuilder sceneBuilder, int viewId, double width, double height) { if (Platform.isIOS) { - sceneBuilder.addPlatformView(viewId, width: 500, height: 500); + sceneBuilder.addPlatformView(viewId, width: width, height: height); } else if (Platform.isAndroid && _textureId != null) { - sceneBuilder.addTexture(_textureId, offset: const Offset(150, 300), width: 500, height: 500); + sceneBuilder.addTexture(_textureId, offset: const Offset(150, 300), width: width, height: height); } else { throw UnsupportedError('Platform ${Platform.operatingSystem} is not supported'); } + } + + // Add a platform view and a picture to the scene, then finish the `sceneBuilder`. + void finishBuilderByAddingPlatformViewAndPicture(SceneBuilder sceneBuilder, int viewId) { + _addPlatformViewtoScene(sceneBuilder, viewId, 500, 500); final PictureRecorder recorder = PictureRecorder(); final Canvas canvas = Canvas(recorder); canvas.drawCircle( -- GitLab