From 5c27bcf0720f82bbfdcb4e0d9923a406efc69f40 Mon Sep 17 00:00:00 2001 From: Chris Yang Date: Wed, 5 Jul 2023 11:14:14 -0700 Subject: [PATCH] [iOS] Avoid crash when backdrop filter is null for PlatformViews (flutter/engine#43150) During certain partial repaint logic, the backdrop filter layer is present but the filter itself is null. We need to account for it when deciding whether to add such filter to the mutator stack. Fixes https://github.com/flutter/flutter/issues/127095 [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style --- .../flow/layers/backdrop_filter_layer.cc | 2 +- .../Scenarios.xcodeproj/project.pbxproj | 4 ++ .../ios/Scenarios/Scenarios/AppDelegate.m | 2 + .../ScenariosUITests/GoldenTestManager.m | 2 + .../ScenariosUITests/PlatformViewUITests.m | 18 +++++ ...one SE (3rd generation)_16.2_simulator.png | Bin 0 -> 20583 bytes .../scenario_app/lib/src/platform_view.dart | 64 +++++++++++++++++- .../scenario_app/lib/src/scenarios.dart | 1 + 8 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png diff --git a/engine/src/flutter/flow/layers/backdrop_filter_layer.cc b/engine/src/flutter/flow/layers/backdrop_filter_layer.cc index fd3c6561468..44c3fca4a6a 100644 --- a/engine/src/flutter/flow/layers/backdrop_filter_layer.cc +++ b/engine/src/flutter/flow/layers/backdrop_filter_layer.cc @@ -42,7 +42,7 @@ void BackdropFilterLayer::Diff(DiffContext* context, const Layer* old_layer) { void BackdropFilterLayer::Preroll(PrerollContext* context) { Layer::AutoPrerollSaveLayerState save = Layer::AutoPrerollSaveLayerState::Create(context, true, bool(filter_)); - if (context->view_embedder != nullptr) { + if (filter_ && context->view_embedder != nullptr) { context->view_embedder->PushFilterToVisitedPlatformViews( filter_, context->state_stack.device_cull_rect()); } 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 4e692023188..81e3520794d 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 @@ -62,6 +62,7 @@ 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 */; }; + 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */ = {isa = PBXBuildFile; fileRef = 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */; }; F26F15B8268B6B5600EC54D3 /* iPadGestureTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F26F15B7268B6B5500EC54D3 /* iPadGestureTests.m */; }; /* End PBXBuildFile section */ @@ -183,6 +184,7 @@ 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 = ""; }; + 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_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 */ @@ -308,6 +310,7 @@ F7B464DC2759D02B00079189 /* Goldens */ = { isa = PBXGroup; children = ( + 68D93AED2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png */, 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 */, @@ -477,6 +480,7 @@ 684FFF8629F9C10700281002 /* golden_bogus_font_text_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF7E29F9C10700281002 /* golden_platform_view_opacity_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 684FFF8729F9C10700281002 /* golden_platform_view_multiple_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, + 68D93AEE2A46097E0054AB6D /* golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png in Resources */, 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 */, 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 a41ef85866c..d938a895373 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 @@ -55,6 +55,8 @@ @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @"--two-platform-views-with-other-backdrop-filter" : @"two_platform_views_with_other_backdrop_filter", + @"--platform-view-with-negative-backdrop-filter" : + @"platform_view_with_negative_backdrop_filter", @"--platform-view-rotate" : @"platform_view_rotate", @"--non-full-screen-flutter-view-platform-view" : @"non_full_screen_flutter_view_platform_view", @"--gesture-reject-after-touches-ended" : @"platform_view_gesture_reject_after_touches_ended", 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 3bcff696844..78bda2122b8 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 @@ -41,6 +41,8 @@ NSDictionary* launchArgsMap; @"--platform-view-with-other-backdrop-filter" : @"platform_view_with_other_backdrop_filter", @"--two-platform-views-with-other-backdrop-filter" : @"two_platform_views_with_other_backdrop_filter", + @"--platform-view-with-negative-backdrop-filter" : + @"platform_view_with_negative_backdrop_filter", @"--platform-view-rotate" : @"platform_view_rotate", @"--non-full-screen-flutter-view-platform-view" : @"non_full_screen_flutter_view_platform_view", 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 511700b9ac0..03984f27fda 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 @@ -380,6 +380,24 @@ static const NSInteger kSecondsToWaitForPlatformView = 30; @end +@interface PlatformViewWithNegativeOtherBackDropFilterTests : GoldenPlatformViewTests + +@end + +@implementation PlatformViewWithNegativeOtherBackDropFilterTests + +- (instancetype)initWithInvocation:(NSInvocation*)invocation { + GoldenTestManager* manager = [[GoldenTestManager alloc] + initWithLaunchArg:@"--platform-view-with-negative-backdrop-filter"]; + return [super initWithManager:manager invocation:invocation]; +} + +- (void)testPlatformView { + [self checkPlatformViewGolden]; +} + +@end + @interface PlatformViewRotation : GoldenPlatformViewTests @end diff --git a/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png b/engine/src/flutter/testing/scenario_app/ios/Scenarios/ScenariosUITests/golden_platform_view_with_negative_backdrop_filter_iPhone SE (3rd generation)_16.2_simulator.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5162bebdae39fe8d2c50e818cf3e6f5cb94bc7 GIT binary patch literal 20583 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 hY83cCf=ZO1eB5-;?tT{d89@l-z+RU pv1 -> picture 2 -> filter -> pv2 - > picture 3. -/// Because backdrop filter on platform views has not been implemented(see: https://github.com/flutter/flutter/issues/43902), -/// the result will not including a filtered pv1. class TwoPlatformViewsWithOtherBackDropFilter extends Scenario with _BasePlatformViewScenarioMixin { /// Constructs the scenario. @@ -1533,6 +1531,68 @@ class TwoPlatformViewsWithOtherBackDropFilter extends Scenario } } +/// A simple platform view for testing backDropFilter with a platform view in the scene. +/// +/// The backdrop filter sigma value is negative, which tries to reproduce a crash, see: +/// https://github.com/flutter/flutter/issues/127095 +class PlatformViewWithNegativeBackDropFilter extends Scenario + with _BasePlatformViewScenarioMixin { + /// Constructs the scenario. + PlatformViewWithNegativeBackDropFilter( + super.view, { + required int id, + }) : _id = id; + + final int _id; + + @override + void onBeginFrame(Duration duration) { + final SceneBuilder builder = SceneBuilder(); + + final PictureRecorder recorder = PictureRecorder(); + final Canvas canvas = Canvas(recorder); + // This is just a background picture to make the result more viewable. + canvas.drawRect( + const Rect.fromLTRB(0, 0, 600, 1000), + Paint()..color = const Color(0xFFFF0000), + ); + canvas.drawRect( + const Rect.fromLTRB(0, 0, 300, 300), + Paint()..color = const Color(0xFF00FF00), + ); + final Picture picture1 = recorder.endRecording(); + builder.addPicture(Offset.zero, picture1); + + builder.pushOffset(0, 200); + + addPlatformView( + _id, + dispatcher: view.platformDispatcher, + sceneBuilder: builder, + width: 100, + height: 100, + text: 'platform view 1' + ); + + final PictureRecorder recorder2 = PictureRecorder(); + final Canvas canvas2 = Canvas(recorder2); + canvas2.drawCircle( + const Offset(200, 100), + 50, + Paint()..color = const Color(0xFF0000EF), + ); + final Picture picture2 = recorder2.endRecording(); + builder.addPicture(const Offset(100, 100), picture2); + + final ImageFilter filter = ImageFilter.blur(sigmaX: -8, sigmaY: 8); + builder.pushBackdropFilter(filter); + + final Scene scene = builder.build(); + view.render(scene); + scene.dispose(); + } +} + /// Builds a scenario where many platform views are scrolling and pass under a picture. class PlatformViewScrollingUnderWidget extends Scenario with _BasePlatformViewScenarioMixin { 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 9efa352dcc8..d9c586023be 100644 --- a/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart +++ b/engine/src/flutter/testing/scenario_app/lib/src/scenarios.dart @@ -43,6 +43,7 @@ Map _scenarios = { 'platform_view_opacity': (FlutterView view) => PlatformViewOpacityScenario(view, id: _viewId++), 'platform_view_with_other_backdrop_filter': (FlutterView view) => PlatformViewWithOtherBackDropFilter(view, id: _viewId++), 'two_platform_views_with_other_backdrop_filter': (FlutterView view) => TwoPlatformViewsWithOtherBackDropFilter(view, firstId: _viewId++, secondId: _viewId++), + 'platform_view_with_negative_backdrop_filter': (FlutterView view) => PlatformViewWithNegativeBackDropFilter(view, id: _viewId++), 'platform_view_multiple': (FlutterView view) => MultiPlatformViewScenario(view, firstId: _viewId++, secondId: _viewId++), 'platform_view_multiple_background_foreground': (FlutterView view) => MultiPlatformViewBackgroundForegroundScenario(view, firstId: _viewId++, secondId: _viewId++), 'non_full_screen_flutter_view_platform_view': (FlutterView view) => NonFullScreenFlutterViewPlatformViewScenario(view, id: _viewId++),