8#import <OCMock/OCMock.h>
10#import <WebKit/WebKit.h>
11#import <XCTest/XCTest.h>
62@property(nonatomic, strong) NSMutableArray<NSNumber*>* toggleHistory;
69 _toggleHistory = [NSMutableArray array];
73- (void)setEnabled:(
BOOL)enabled {
74 [
super setEnabled:enabled];
75 [
self.toggleHistory addObject:@(enabled)];
87@property(nonatomic, strong) UIView*
view;
88@property(nonatomic, assign)
BOOL viewCreated;
94 if (
self = [super init]) {
102 [
self checkViewCreatedOnce];
106- (void)checkViewCreatedOnce {
107 if (
self.viewCreated) {
110 self.viewCreated = YES;
119 : NSObject <FlutterPlatformViewFactory>
124 viewIdentifier:(int64_t)viewId
125 arguments:(
id _Nullable)args {
132@property(nonatomic, strong) UIView*
view;
133@property(nonatomic, assign)
BOOL viewCreated;
137- (instancetype)init {
138 if (
self = [super init]) {
139 _view = [[WKWebView alloc] init];
147 [
self checkViewCreatedOnce];
151- (void)checkViewCreatedOnce {
152 if (
self.viewCreated) {
155 self.viewCreated = YES;
167- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
168 viewIdentifier:(int64_t)viewId
169 arguments:(
id _Nullable)
args {
178- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
179 viewIdentifier:(int64_t)viewId
180 arguments:(
id _Nullable)
args {
187@property(nonatomic, strong) UIView*
view;
188@property(nonatomic, assign)
BOOL viewCreated;
192- (instancetype)init {
193 if (
self = [super init]) {
194 _view = [[UIView alloc] init];
195 [_view addSubview:[[WKWebView alloc] init]];
203 [
self checkViewCreatedOnce];
207- (void)checkViewCreatedOnce {
208 if (
self.viewCreated) {
211 self.viewCreated = YES;
223- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
224 viewIdentifier:(int64_t)viewId
225 arguments:(
id _Nullable)
args {
231@property(nonatomic, strong) UIView*
view;
232@property(nonatomic, assign)
BOOL viewCreated;
236- (instancetype)init {
237 if (
self = [super init]) {
238 _view = [[UIView alloc] init];
239 UIView* childView = [[UIView alloc] init];
240 [_view addSubview:childView];
241 [childView addSubview:[[WKWebView alloc] init]];
249 [
self checkViewCreatedOnce];
253- (void)checkViewCreatedOnce {
254 if (
self.viewCreated) {
257 self.viewCreated = YES;
262 : NSObject <FlutterPlatformViewFactory>
267 viewIdentifier:(int64_t)viewId
268 arguments:(
id _Nullable)args {
275class FlutterPlatformViewsTestMockPlatformViewDelegate :
public PlatformView::Delegate {
277 void OnPlatformViewCreated(std::unique_ptr<Surface> surface)
override {}
278 void OnPlatformViewDestroyed()
override {}
279 void OnPlatformViewScheduleFrame()
override {}
280 void OnPlatformViewAddView(int64_t
view_id,
281 const ViewportMetrics& viewport_metrics,
282 AddViewCallback
callback)
override {}
283 void OnPlatformViewRemoveView(int64_t
view_id, RemoveViewCallback
callback)
override {}
284 void OnPlatformViewSendViewFocusEvent(
const ViewFocusEvent& event)
override {};
285 void OnPlatformViewSetNextFrameCallback(
const fml::closure& closure)
override {}
286 void OnPlatformViewSetViewportMetrics(int64_t
view_id,
const ViewportMetrics& metrics)
override {}
288 void OnPlatformViewDispatchPlatformMessage(std::unique_ptr<PlatformMessage>
message)
override {}
289 void OnPlatformViewDispatchPointerDataPacket(std::unique_ptr<PointerDataPacket> packet)
override {
292 return {.has_platform_view =
false};
294 void OnPlatformViewDispatchSemanticsAction(int64_t
view_id,
298 void OnPlatformViewSetSemanticsEnabled(
bool enabled)
override {}
299 void OnPlatformViewSetAccessibilityFeatures(int32_t flags)
override {}
300 void OnPlatformViewRegisterTexture(std::shared_ptr<Texture>
texture)
override {}
301 void OnPlatformViewUnregisterTexture(int64_t
texture_id)
override {}
302 void OnPlatformViewMarkTextureFrameAvailable(int64_t
texture_id)
override {}
304 void LoadDartDeferredLibrary(intptr_t loading_unit_id,
305 std::unique_ptr<const fml::Mapping> snapshot_data,
306 std::unique_ptr<const fml::Mapping> snapshot_instructions)
override {
308 void LoadDartDeferredLibraryError(intptr_t loading_unit_id,
309 const std::string error_message,
310 bool transient)
override {}
311 void UpdateAssetResolverByType(std::unique_ptr<flutter::AssetResolver> updated_asset_resolver,
313 std::shared_ptr<fml::BasicTaskRunner> OnPlatformViewGetShutdownSafeIOTaskRunner()
const override {
320BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2) {
321 const CGFloat epsilon = 0.01;
322 return std::abs(radius1 - radius2) < epsilon;
348static UIGestureRecognizer* FindForwardingGestureRecognizer(UIView*
view) {
349 for (UIGestureRecognizer* gestureRecognizer in
view.gestureRecognizers) {
351 return gestureRecognizer;
357- (void)testFlutterViewOnlyCreateOnceInOneFrame {
358 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
363 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
366 flutterPlatformViewsController,
368 std::make_shared<fml::SyncSwitch>());
372 [flutterPlatformViewsController
374 withId:@"MockFlutterPlatformView"
378 [flutterPlatformViewsController
382 @"viewType" : @"MockFlutterPlatformView",
383 @"gestureBlockingPolicy" : @"eager"
386 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
387 flutterPlatformViewsController.
flutterView = flutterView;
399 auto embeddedViewParams =
400 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
402 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
403 withParams:std::move(embeddedViewParams)];
407 [flutterPlatformViewsController
reset];
410- (void)testCanCreatePlatformViewWithoutFlutterView {
411 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
416 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
419 flutterPlatformViewsController,
421 std::make_shared<fml::SyncSwitch>());
425 [flutterPlatformViewsController
427 withId:@"MockFlutterPlatformView"
431 [flutterPlatformViewsController
435 @"viewType" : @"MockFlutterPlatformView",
436 @"gestureBlockingPolicy" : @"eager"
443- (void)testChildClippingViewHitTests {
446 UIView* childView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
447 [childClippingView addSubview:childView];
449 XCTAssertFalse([childClippingView pointInside:CGPointMake(50, 50) withEvent:nil]);
450 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 100) withEvent:nil]);
451 XCTAssertFalse([childClippingView pointInside:CGPointMake(100, 99) withEvent:nil]);
452 XCTAssertFalse([childClippingView pointInside:CGPointMake(201, 200) withEvent:nil]);
453 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 201) withEvent:nil]);
454 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 200) withEvent:nil]);
455 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 299) withEvent:nil]);
457 XCTAssertTrue([childClippingView pointInside:CGPointMake(150, 150) withEvent:nil]);
458 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 100) withEvent:nil]);
459 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 100) withEvent:nil]);
460 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 199) withEvent:nil]);
461 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 199) withEvent:nil]);
464- (void)testReleasesBackdropFilterSubviewsOnChildClippingViewDealloc {
465 __weak NSMutableArray<UIVisualEffectView*>* weakBackdropFilterSubviews = nil;
466 __weak UIVisualEffectView* weakVisualEffectView1 = nil;
467 __weak UIVisualEffectView* weakVisualEffectView2 = nil;
471 UIVisualEffectView* visualEffectView1 = [[UIVisualEffectView alloc]
472 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
473 weakVisualEffectView1 = visualEffectView1;
478 isRoundedSuperellipse:NO
479 visualEffectView:visualEffectView1];
484 UIVisualEffectView* visualEffectView2 = [[UIVisualEffectView alloc]
485 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
486 weakVisualEffectView2 = visualEffectView2;
491 isRoundedSuperellipse:NO
492 visualEffectView:visualEffectView2];
496 XCTAssertNotNil(weakBackdropFilterSubviews);
499 XCTAssertNil(weakBackdropFilterSubviews);
500 XCTAssertNil(weakVisualEffectView1);
501 XCTAssertNil(weakVisualEffectView2);
504- (void)testApplyBackdropFilter {
505 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
510 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
513 flutterPlatformViewsController,
515 std::make_shared<fml::SyncSwitch>());
519 [flutterPlatformViewsController
521 withId:@"MockFlutterPlatformView"
525 [flutterPlatformViewsController
529 @"viewType" : @"MockFlutterPlatformView",
530 @"gestureBlockingPolicy" : @"eager"
536 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
537 flutterPlatformViewsController.
flutterView = flutterView;
549 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
552 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
553 withParams:std::move(embeddedViewParams)];
554 [flutterPlatformViewsController
560 [flutterView addSubview:childClippingView];
562 [flutterView setNeedsLayout];
563 [flutterView layoutIfNeeded];
566 NSUInteger numberOfExpectedVisualEffectView = 0;
567 for (UIView* subview in childClippingView.subviews) {
568 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
571 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
572 if ([
self validateOneVisualEffectView:subview
573 expectedFrame:CGRectMake(0, 0, 10, 10)
575 numberOfExpectedVisualEffectView++;
578 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
581- (void)testApplyBackdropFilterWithCorrectFrame {
582 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
587 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
590 flutterPlatformViewsController,
592 std::make_shared<fml::SyncSwitch>());
596 [flutterPlatformViewsController
598 withId:@"MockFlutterPlatformView"
602 [flutterPlatformViewsController
606 @"viewType" : @"MockFlutterPlatformView",
607 @"gestureBlockingPolicy" : @"eager"
613 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
614 flutterPlatformViewsController.
flutterView = flutterView;
626 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
629 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
630 withParams:std::move(embeddedViewParams)];
631 [flutterPlatformViewsController
637 [flutterView addSubview:childClippingView];
639 [flutterView setNeedsLayout];
640 [flutterView layoutIfNeeded];
643 NSUInteger numberOfExpectedVisualEffectView = 0;
644 for (UIView* subview in childClippingView.subviews) {
645 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
648 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
649 if ([
self validateOneVisualEffectView:subview
650 expectedFrame:CGRectMake(0, 0, 5, 8)
652 numberOfExpectedVisualEffectView++;
655 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
658- (void)testApplyMultipleBackdropFilters {
659 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
664 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
667 flutterPlatformViewsController,
669 std::make_shared<fml::SyncSwitch>());
673 [flutterPlatformViewsController
675 withId:@"MockFlutterPlatformView"
679 [flutterPlatformViewsController
683 @"viewType" : @"MockFlutterPlatformView",
684 @"gestureBlockingPolicy" : @"eager"
690 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
691 flutterPlatformViewsController.
flutterView = flutterView;
699 for (
int i = 0;
i < 50;
i++) {
705 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
708 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
709 withParams:std::move(embeddedViewParams)];
710 [flutterPlatformViewsController
716 [flutterView addSubview:childClippingView];
718 [flutterView setNeedsLayout];
719 [flutterView layoutIfNeeded];
721 NSUInteger numberOfExpectedVisualEffectView = 0;
722 for (UIView* subview in childClippingView.subviews) {
723 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
726 XCTAssertLessThan(numberOfExpectedVisualEffectView, 50u);
727 if ([
self validateOneVisualEffectView:subview
728 expectedFrame:CGRectMake(0, 0, 10, 10)
729 inputRadius:(CGFloat)numberOfExpectedVisualEffectView]) {
730 numberOfExpectedVisualEffectView++;
733 XCTAssertEqual(numberOfExpectedVisualEffectView, (NSUInteger)numberOfExpectedVisualEffectView);
736- (void)testAddBackdropFilters {
737 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
743 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
746 flutterPlatformViewsController,
748 std::make_shared<fml::SyncSwitch>());
752 [flutterPlatformViewsController
754 withId:@"MockFlutterPlatformView"
758 [flutterPlatformViewsController
762 @"viewType" : @"MockFlutterPlatformView",
763 @"gestureBlockingPolicy" : @"eager"
769 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
770 flutterPlatformViewsController.
flutterView = flutterView;
782 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
785 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
786 withParams:std::move(embeddedViewParams)];
787 [flutterPlatformViewsController
793 [flutterView addSubview:childClippingView];
795 [flutterView setNeedsLayout];
796 [flutterView layoutIfNeeded];
798 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
799 for (UIView* subview in childClippingView.subviews) {
800 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
803 XCTAssertLessThan(originalVisualEffectViews.count, 1u);
804 if ([
self validateOneVisualEffectView:subview
805 expectedFrame:CGRectMake(0, 0, 10, 10)
806 inputRadius:(CGFloat)5]) {
807 [originalVisualEffectViews addObject:subview];
810 XCTAssertEqual(originalVisualEffectViews.count, 1u);
819 for (
int i = 0;
i < 2;
i++) {
824 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
827 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
828 withParams:std::move(embeddedViewParams)];
829 [flutterPlatformViewsController
833 [flutterView setNeedsLayout];
834 [flutterView layoutIfNeeded];
836 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
837 for (UIView* subview in childClippingView.subviews) {
838 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
841 XCTAssertLessThan(newVisualEffectViews.count, 2u);
843 if ([
self validateOneVisualEffectView:subview
844 expectedFrame:CGRectMake(0, 0, 10, 10)
845 inputRadius:(CGFloat)5]) {
846 [newVisualEffectViews addObject:subview];
849 XCTAssertEqual(newVisualEffectViews.count, 2u);
850 for (NSUInteger
i = 0;
i < originalVisualEffectViews.count;
i++) {
851 UIView* originalView = originalVisualEffectViews[i];
852 UIView* newView = newVisualEffectViews[i];
854 XCTAssertEqual(originalView, newView);
855 id mockOrignalView = OCMPartialMock(originalView);
856 OCMReject([mockOrignalView removeFromSuperview]);
857 [mockOrignalView stopMocking];
861- (void)testRemoveBackdropFilters {
862 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
868 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
871 flutterPlatformViewsController,
873 std::make_shared<fml::SyncSwitch>());
877 [flutterPlatformViewsController
879 withId:@"MockFlutterPlatformView"
883 [flutterPlatformViewsController
887 @"viewType" : @"MockFlutterPlatformView",
888 @"gestureBlockingPolicy" : @"eager"
894 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
895 flutterPlatformViewsController.
flutterView = flutterView;
904 for (
int i = 0;
i < 5;
i++) {
909 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
912 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
913 withParams:std::move(embeddedViewParams)];
914 [flutterPlatformViewsController
920 [flutterView addSubview:childClippingView];
922 [flutterView setNeedsLayout];
923 [flutterView layoutIfNeeded];
925 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
926 for (UIView* subview in childClippingView.subviews) {
927 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
930 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
931 if ([
self validateOneVisualEffectView:subview
932 expectedFrame:CGRectMake(0, 0, 10, 10)
933 inputRadius:(CGFloat)5]) {
934 [originalVisualEffectViews addObject:subview];
944 for (
int i = 0;
i < 4;
i++) {
949 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
952 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
953 withParams:std::move(embeddedViewParams)];
954 [flutterPlatformViewsController
958 [flutterView setNeedsLayout];
959 [flutterView layoutIfNeeded];
961 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
962 for (UIView* subview in childClippingView.subviews) {
963 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
966 XCTAssertLessThan(newVisualEffectViews.count, 4u);
967 if ([
self validateOneVisualEffectView:subview
968 expectedFrame:CGRectMake(0, 0, 10, 10)
969 inputRadius:(CGFloat)5]) {
970 [newVisualEffectViews addObject:subview];
973 XCTAssertEqual(newVisualEffectViews.count, 4u);
975 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
976 UIView* newView = newVisualEffectViews[i];
977 id mockNewView = OCMPartialMock(newView);
978 UIView* originalView = originalVisualEffectViews[i];
980 XCTAssertEqual(originalView, newView);
981 OCMReject([mockNewView removeFromSuperview]);
982 [mockNewView stopMocking];
987 for (
int i = 0;
i < 5;
i++) {
992 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
995 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
996 withParams:std::move(embeddedViewParams)];
997 [flutterPlatformViewsController
1001 [flutterView setNeedsLayout];
1002 [flutterView layoutIfNeeded];
1004 NSUInteger numberOfExpectedVisualEffectView = 0u;
1005 for (UIView* subview in childClippingView.subviews) {
1006 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1007 numberOfExpectedVisualEffectView++;
1010 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1013- (void)testEditBackdropFilters {
1014 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1020 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1023 flutterPlatformViewsController,
1025 std::make_shared<fml::SyncSwitch>());
1029 [flutterPlatformViewsController
1031 withId:@"MockFlutterPlatformView"
1035 [flutterPlatformViewsController
1039 @"viewType" : @"MockFlutterPlatformView",
1040 @"gestureBlockingPolicy" : @"eager"
1046 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1047 flutterPlatformViewsController.
flutterView = flutterView;
1056 for (
int i = 0;
i < 5;
i++) {
1061 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1064 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1065 withParams:std::move(embeddedViewParams)];
1066 [flutterPlatformViewsController
1072 [flutterView addSubview:childClippingView];
1074 [flutterView setNeedsLayout];
1075 [flutterView layoutIfNeeded];
1077 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
1078 for (UIView* subview in childClippingView.subviews) {
1079 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1082 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
1083 if ([
self validateOneVisualEffectView:subview
1084 expectedFrame:CGRectMake(0, 0, 10, 10)
1085 inputRadius:(CGFloat)5]) {
1086 [originalVisualEffectViews addObject:subview];
1096 for (
int i = 0;
i < 5;
i++) {
1109 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1112 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1113 withParams:std::move(embeddedViewParams)];
1114 [flutterPlatformViewsController
1118 [flutterView setNeedsLayout];
1119 [flutterView layoutIfNeeded];
1121 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
1122 for (UIView* subview in childClippingView.subviews) {
1123 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1126 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1127 CGFloat expectInputRadius = 5;
1128 if (newVisualEffectViews.count == 3) {
1129 expectInputRadius = 2;
1131 if ([
self validateOneVisualEffectView:subview
1132 expectedFrame:CGRectMake(0, 0, 10, 10)
1133 inputRadius:expectInputRadius]) {
1134 [newVisualEffectViews addObject:subview];
1137 XCTAssertEqual(newVisualEffectViews.count, 5u);
1138 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1139 UIView* newView = newVisualEffectViews[i];
1140 id mockNewView = OCMPartialMock(newView);
1141 UIView* originalView = originalVisualEffectViews[i];
1143 XCTAssertEqual(originalView, newView);
1144 OCMReject([mockNewView removeFromSuperview]);
1145 [mockNewView stopMocking];
1147 [newVisualEffectViews removeAllObjects];
1151 for (
int i = 0;
i < 5;
i++) {
1155 for (
int i = 0;
i < 5;
i++) {
1167 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1170 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1171 withParams:std::move(embeddedViewParams)];
1172 [flutterPlatformViewsController
1176 [flutterView setNeedsLayout];
1177 [flutterView layoutIfNeeded];
1179 for (UIView* subview in childClippingView.subviews) {
1180 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1183 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1184 CGFloat expectInputRadius = 5;
1185 if (newVisualEffectViews.count == 0) {
1186 expectInputRadius = 2;
1188 if ([
self validateOneVisualEffectView:subview
1189 expectedFrame:CGRectMake(0, 0, 10, 10)
1190 inputRadius:expectInputRadius]) {
1191 [newVisualEffectViews addObject:subview];
1194 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1195 UIView* newView = newVisualEffectViews[i];
1196 id mockNewView = OCMPartialMock(newView);
1197 UIView* originalView = originalVisualEffectViews[i];
1199 XCTAssertEqual(originalView, newView);
1200 OCMReject([mockNewView removeFromSuperview]);
1201 [mockNewView stopMocking];
1203 [newVisualEffectViews removeAllObjects];
1207 for (
int i = 0;
i < 5;
i++) {
1211 for (
int i = 0;
i < 5;
i++) {
1223 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1226 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1227 withParams:std::move(embeddedViewParams)];
1228 [flutterPlatformViewsController
1232 [flutterView setNeedsLayout];
1233 [flutterView layoutIfNeeded];
1235 for (UIView* subview in childClippingView.subviews) {
1236 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1239 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1240 CGFloat expectInputRadius = 5;
1241 if (newVisualEffectViews.count == 4) {
1242 expectInputRadius = 2;
1244 if ([
self validateOneVisualEffectView:subview
1245 expectedFrame:CGRectMake(0, 0, 10, 10)
1246 inputRadius:expectInputRadius]) {
1247 [newVisualEffectViews addObject:subview];
1250 XCTAssertEqual(newVisualEffectViews.count, 5u);
1252 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1253 UIView* newView = newVisualEffectViews[i];
1254 id mockNewView = OCMPartialMock(newView);
1255 UIView* originalView = originalVisualEffectViews[i];
1257 XCTAssertEqual(originalView, newView);
1258 OCMReject([mockNewView removeFromSuperview]);
1259 [mockNewView stopMocking];
1261 [newVisualEffectViews removeAllObjects];
1265 for (
int i = 0;
i < 5;
i++) {
1269 for (
int i = 0;
i < 5;
i++) {
1276 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1279 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1280 withParams:std::move(embeddedViewParams)];
1281 [flutterPlatformViewsController
1285 [flutterView setNeedsLayout];
1286 [flutterView layoutIfNeeded];
1288 for (UIView* subview in childClippingView.subviews) {
1289 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1292 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1293 if ([
self validateOneVisualEffectView:subview
1294 expectedFrame:CGRectMake(0, 0, 10, 10)
1295 inputRadius:(CGFloat)newVisualEffectViews.count]) {
1296 [newVisualEffectViews addObject:subview];
1299 XCTAssertEqual(newVisualEffectViews.count, 5u);
1301 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1302 UIView* newView = newVisualEffectViews[i];
1303 id mockNewView = OCMPartialMock(newView);
1304 UIView* originalView = originalVisualEffectViews[i];
1306 XCTAssertEqual(originalView, newView);
1307 OCMReject([mockNewView removeFromSuperview]);
1308 [mockNewView stopMocking];
1310 [newVisualEffectViews removeAllObjects];
1313- (void)testApplyBackdropFilterNotDlBlurImageFilter {
1314 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1320 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1323 flutterPlatformViewsController,
1325 std::make_shared<fml::SyncSwitch>());
1329 [flutterPlatformViewsController
1331 withId:@"MockFlutterPlatformView"
1335 [flutterPlatformViewsController
1339 @"viewType" : @"MockFlutterPlatformView",
1340 @"gestureBlockingPolicy" : @"eager"
1346 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1347 flutterPlatformViewsController.
flutterView = flutterView;
1358 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1361 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1362 withParams:std::move(embeddedViewParams)];
1363 [flutterPlatformViewsController
1370 [flutterView addSubview:childClippingView];
1372 [flutterView setNeedsLayout];
1373 [flutterView layoutIfNeeded];
1375 NSUInteger numberOfExpectedVisualEffectView = 0;
1376 for (UIView* subview in childClippingView.subviews) {
1377 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1378 numberOfExpectedVisualEffectView++;
1381 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1391 for (
int i = 0;
i < 5;
i++) {
1402 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1405 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1406 withParams:std::move(embeddedViewParams)];
1407 [flutterPlatformViewsController
1411 [flutterView setNeedsLayout];
1412 [flutterView layoutIfNeeded];
1414 numberOfExpectedVisualEffectView = 0;
1415 for (UIView* subview in childClippingView.subviews) {
1416 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1419 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1420 if ([
self validateOneVisualEffectView:subview
1421 expectedFrame:CGRectMake(0, 0, 10, 10)
1422 inputRadius:(CGFloat)5]) {
1423 numberOfExpectedVisualEffectView++;
1426 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1430 for (
int i = 0;
i < 5;
i++) {
1434 for (
int i = 0;
i < 5;
i++) {
1445 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1448 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1449 withParams:std::move(embeddedViewParams)];
1450 [flutterPlatformViewsController
1454 [flutterView setNeedsLayout];
1455 [flutterView layoutIfNeeded];
1457 numberOfExpectedVisualEffectView = 0;
1458 for (UIView* subview in childClippingView.subviews) {
1459 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1462 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1463 if ([
self validateOneVisualEffectView:subview
1464 expectedFrame:CGRectMake(0, 0, 10, 10)
1465 inputRadius:(CGFloat)5]) {
1466 numberOfExpectedVisualEffectView++;
1469 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1473 for (
int i = 0;
i < 5;
i++) {
1477 for (
int i = 0;
i < 5;
i++) {
1488 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1491 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1492 withParams:std::move(embeddedViewParams)];
1493 [flutterPlatformViewsController
1497 [flutterView setNeedsLayout];
1498 [flutterView layoutIfNeeded];
1500 numberOfExpectedVisualEffectView = 0;
1501 for (UIView* subview in childClippingView.subviews) {
1502 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1505 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1506 if ([
self validateOneVisualEffectView:subview
1507 expectedFrame:CGRectMake(0, 0, 10, 10)
1508 inputRadius:(CGFloat)5]) {
1509 numberOfExpectedVisualEffectView++;
1512 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1516 for (
int i = 0;
i < 5;
i++) {
1520 for (
int i = 0;
i < 5;
i++) {
1525 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1528 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1529 withParams:std::move(embeddedViewParams)];
1530 [flutterPlatformViewsController
1534 [flutterView setNeedsLayout];
1535 [flutterView layoutIfNeeded];
1537 numberOfExpectedVisualEffectView = 0;
1538 for (UIView* subview in childClippingView.subviews) {
1539 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1540 numberOfExpectedVisualEffectView++;
1543 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1546- (void)testApplyBackdropFilterCorrectAPI {
1551 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1552 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1557 isRoundedSuperellipse:NO
1558 visualEffectView:visualEffectView];
1559 XCTAssertNotNil(platformViewFilter);
1562- (void)testApplyBackdropFilterAPIChangedInvalidUIVisualEffectView {
1564 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc] init];
1569 isRoundedSuperellipse:NO
1570 visualEffectView:visualEffectView];
1571 XCTAssertNil(platformViewFilter);
1574- (void)testApplyBackdropFilterAPIChangedNoGaussianBlurFilter {
1576 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1577 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1578 NSArray* subviews = editedUIVisualEffectView.subviews;
1579 for (UIView*
view in subviews) {
1580 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1581 for (CIFilter* filter in
view.layer.filters) {
1582 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1583 [filter setValue:@"notGaussianBlur" forKey:@"name"];
1594 isRoundedSuperellipse:NO
1595 visualEffectView:editedUIVisualEffectView];
1596 XCTAssertNil(platformViewFilter);
1599- (void)testApplyBackdropFilterAPIChangedInvalidInputRadius {
1601 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1602 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1603 NSArray* subviews = editedUIVisualEffectView.subviews;
1604 for (UIView*
view in subviews) {
1605 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1606 for (CIFilter* filter in
view.layer.filters) {
1607 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1608 [filter setValue:@"invalidInputRadius" forKey:@"inputRadius"];
1620 isRoundedSuperellipse:NO
1621 visualEffectView:editedUIVisualEffectView];
1622 XCTAssertNil(platformViewFilter);
1625- (void)testApplyBackdropFilterRespectsClipRRect {
1626 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1632 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1635 flutterPlatformViewsController,
1637 std::make_shared<fml::SyncSwitch>());
1641 [flutterPlatformViewsController
1643 withId:@"MockFlutterPlatformView"
1647 [flutterPlatformViewsController
1652 @"viewType" : @"MockFlutterPlatformView",
1653 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
1659 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1660 flutterPlatformViewsController.
flutterView = flutterView;
1678 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1681 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1682 withParams:std::move(embeddedViewParams)];
1683 [flutterPlatformViewsController
1689 [flutterView addSubview:childClippingView];
1691 [flutterView setNeedsLayout];
1692 [flutterView layoutIfNeeded];
1694 NSArray<UIVisualEffectView*>* filters = childClippingView.backdropFilterSubviews;
1695 XCTAssertEqual(filters.count, 1u);
1697 UIVisualEffectView* visualEffectView = filters[0];
1698 auto radii = clipRRect.GetRadii();
1700 XCTAssertEqual(visualEffectView.layer.cornerRadius, radii.top_left.width);
1701 XCTAssertEqual(visualEffectView.layer.cornerCurve, kCACornerCurveCircular);
1704- (void)testApplyBackdropFilterRespectsClipRSuperellipse {
1705 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1711 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1714 flutterPlatformViewsController,
1716 std::make_shared<fml::SyncSwitch>());
1720 [flutterPlatformViewsController
1722 withId:@"MockFlutterPlatformView"
1726 [flutterPlatformViewsController
1731 @"viewType" : @"MockFlutterPlatformView",
1732 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
1738 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1739 flutterPlatformViewsController.
flutterView = flutterView;
1757 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1760 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1761 withParams:std::move(embeddedViewParams)];
1762 [flutterPlatformViewsController
1768 [flutterView addSubview:childClippingView];
1770 [flutterView setNeedsLayout];
1771 [flutterView layoutIfNeeded];
1773 NSArray<UIVisualEffectView*>* filters = childClippingView.backdropFilterSubviews;
1774 XCTAssertEqual(filters.count, 1u);
1776 UIVisualEffectView* visualEffectView = filters[0];
1777 auto radii = clipRSE.GetRadii();
1779 XCTAssertEqual(visualEffectView.layer.cornerRadius, radii.top_left.width);
1780 XCTAssertEqual(visualEffectView.layer.cornerCurve, kCACornerCurveContinuous);
1783- (void)testBackdropFilterVisualEffectSubviewBackgroundColor {
1784 __weak UIVisualEffectView* weakVisualEffectView;
1787 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1788 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1789 weakVisualEffectView = visualEffectView;
1794 isRoundedSuperellipse:NO
1795 visualEffectView:visualEffectView];
1796 CGColorRef visualEffectSubviewBackgroundColor = nil;
1797 for (UIView*
view in [platformViewFilter backdropFilterView].subviews) {
1798 if ([NSStringFromClass([
view class]) hasSuffix:
@"VisualEffectSubview"]) {
1799 visualEffectSubviewBackgroundColor =
view.layer.backgroundColor;
1803 CGColorEqualToColor(visualEffectSubviewBackgroundColor, UIColor.clearColor.CGColor));
1805 XCTAssertNil(weakVisualEffectView);
1808- (void)testCompositePlatformView {
1809 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1815 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1818 flutterPlatformViewsController,
1820 std::make_shared<fml::SyncSwitch>());
1824 [flutterPlatformViewsController
1826 withId:@"MockFlutterPlatformView"
1830 [flutterPlatformViewsController
1834 @"viewType" : @"MockFlutterPlatformView",
1835 @"gestureBlockingPolicy" : @"eager"
1841 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1842 flutterPlatformViewsController.
flutterView = flutterView;
1854 auto embeddedViewParams =
1855 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
1857 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1858 withParams:std::move(embeddedViewParams)];
1859 [flutterPlatformViewsController
1863 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1864 toView:flutterView];
1865 XCTAssertTrue(CGRectEqualToRect(platformViewRectInFlutterView, CGRectMake(100, 100, 300, 300)));
1868- (void)testBackdropFilterCorrectlyPushedAndReset {
1869 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1875 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1878 flutterPlatformViewsController,
1880 std::make_shared<fml::SyncSwitch>());
1884 [flutterPlatformViewsController
1886 withId:@"MockFlutterPlatformView"
1890 [flutterPlatformViewsController
1894 @"viewType" : @"MockFlutterPlatformView",
1895 @"gestureBlockingPolicy" : @"eager"
1901 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1902 flutterPlatformViewsController.
flutterView = flutterView;
1910 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1913 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1914 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1915 withParams:std::move(embeddedViewParams)];
1918 [flutterPlatformViewsController
1919 pushFilterToVisitedPlatformViews:filter
1920 withRect:flutter::DlRect::MakeXYWH(0, 0, screenScale * 10,
1922 [flutterPlatformViewsController
1928 [flutterView addSubview:childClippingView];
1930 [flutterView setNeedsLayout];
1931 [flutterView layoutIfNeeded];
1934 NSUInteger numberOfExpectedVisualEffectView = 0;
1935 for (UIView* subview in childClippingView.subviews) {
1936 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1939 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1940 if ([
self validateOneVisualEffectView:subview
1941 expectedFrame:CGRectMake(0, 0, 10, 10)
1943 numberOfExpectedVisualEffectView++;
1946 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1949 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
1951 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1952 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1953 withParams:std::move(embeddedViewParams2)];
1954 [flutterPlatformViewsController
1960 [flutterView setNeedsLayout];
1961 [flutterView layoutIfNeeded];
1963 numberOfExpectedVisualEffectView = 0;
1964 for (UIView* subview in childClippingView.subviews) {
1965 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1968 numberOfExpectedVisualEffectView++;
1970 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1973- (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1974 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1980 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1983 flutterPlatformViewsController,
1985 std::make_shared<fml::SyncSwitch>());
1989 [flutterPlatformViewsController
1991 withId:@"MockFlutterPlatformView"
1995 [flutterPlatformViewsController
1999 @"viewType" : @"MockFlutterPlatformView",
2000 @"gestureBlockingPolicy" : @"eager"
2006 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2007 flutterPlatformViewsController.
flutterView = flutterView;
2019 auto embeddedViewParams =
2020 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
2022 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2023 withParams:std::move(embeddedViewParams)];
2024 [flutterPlatformViewsController
2028 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
2029 toView:flutterView];
2035 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
2037 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
2040 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
2043 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
2047- (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
2048 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2054 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2057 flutterPlatformViewsController,
2059 std::make_shared<fml::SyncSwitch>());
2063 [flutterPlatformViewsController
2065 withId:@"MockFlutterPlatformView"
2069 [flutterPlatformViewsController
2073 @"viewType" : @"MockFlutterPlatformView",
2074 @"gestureBlockingPolicy" : @"eager"
2080 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
2081 flutterPlatformViewsController.
flutterView = flutterView;
2100 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2103 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2104 withParams:std::move(embeddedViewParams)];
2105 [flutterPlatformViewsController
2112 [flutterView addSubview:childClippingView];
2114 [flutterView setNeedsLayout];
2115 [flutterView layoutIfNeeded];
2116 XCTAssertNil(childClippingView.maskView);
2119- (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
2120 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2126 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2129 flutterPlatformViewsController,
2131 std::make_shared<fml::SyncSwitch>());
2135 [flutterPlatformViewsController
2137 withId:@"MockFlutterPlatformView"
2141 [flutterPlatformViewsController
2145 @"viewType" : @"MockFlutterPlatformView",
2146 @"gestureBlockingPolicy" : @"eager"
2152 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
2153 flutterPlatformViewsController.
flutterView = flutterView;
2170 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2173 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2174 withParams:std::move(embeddedViewParams)];
2175 [flutterPlatformViewsController
2182 [flutterView addSubview:childClippingView];
2184 [flutterView setNeedsLayout];
2185 [flutterView layoutIfNeeded];
2187 XCTAssertNotNil(childClippingView.maskView);
2190- (void)testClipRect {
2191 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2197 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2200 flutterPlatformViewsController,
2202 std::make_shared<fml::SyncSwitch>());
2206 [flutterPlatformViewsController
2208 withId:@"MockFlutterPlatformView"
2212 [flutterPlatformViewsController
2216 @"viewType" : @"MockFlutterPlatformView",
2217 @"gestureBlockingPolicy" : @"eager"
2223 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2224 flutterPlatformViewsController.
flutterView = flutterView;
2235 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2238 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2239 withParams:std::move(embeddedViewParams)];
2240 [flutterPlatformViewsController
2247 [flutterView addSubview:childClippingView];
2249 [flutterView setNeedsLayout];
2250 [flutterView layoutIfNeeded];
2252 CGRect insideClipping = CGRectMake(2, 2, 3, 3);
2253 for (
int i = 0;
i < 10;
i++) {
2254 for (
int j = 0; j < 10; j++) {
2255 CGPoint point = CGPointMake(
i, j);
2256 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2257 if (CGRectContainsPoint(insideClipping, point)) {
2258 XCTAssertEqual(alpha, 255);
2260 XCTAssertEqual(alpha, 0);
2266- (void)testClipRect_multipleClips {
2267 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2273 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2276 flutterPlatformViewsController,
2278 std::make_shared<fml::SyncSwitch>());
2282 [flutterPlatformViewsController
2284 withId:@"MockFlutterPlatformView"
2288 [flutterPlatformViewsController
2292 @"viewType" : @"MockFlutterPlatformView",
2293 @"gestureBlockingPolicy" : @"eager"
2299 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2300 flutterPlatformViewsController.
flutterView = flutterView;
2314 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2317 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2318 withParams:std::move(embeddedViewParams)];
2319 [flutterPlatformViewsController
2326 [flutterView addSubview:childClippingView];
2328 [flutterView setNeedsLayout];
2329 [flutterView layoutIfNeeded];
2348 CGRect insideClipping = CGRectMake(3, 3, 2, 2);
2349 for (
int i = 0;
i < 10;
i++) {
2350 for (
int j = 0; j < 10; j++) {
2351 CGPoint point = CGPointMake(
i, j);
2352 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2353 if (CGRectContainsPoint(insideClipping, point)) {
2354 XCTAssertEqual(alpha, 255);
2356 XCTAssertEqual(alpha, 0);
2362- (void)testClipRRect {
2363 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2369 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2372 flutterPlatformViewsController,
2374 std::make_shared<fml::SyncSwitch>());
2378 [flutterPlatformViewsController
2380 withId:@"MockFlutterPlatformView"
2384 [flutterPlatformViewsController
2388 @"viewType" : @"MockFlutterPlatformView",
2389 @"gestureBlockingPolicy" : @"eager"
2395 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2396 flutterPlatformViewsController.
flutterView = flutterView;
2408 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2411 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2412 withParams:std::move(embeddedViewParams)];
2413 [flutterPlatformViewsController
2420 [flutterView addSubview:childClippingView];
2422 [flutterView setNeedsLayout];
2423 [flutterView layoutIfNeeded];
2444 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2445 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2446 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2447 for (
int i = 0;
i < 10;
i++) {
2448 for (
int j = 0; j < 10; j++) {
2449 CGPoint point = CGPointMake(
i, j);
2450 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2451 if (CGRectContainsPoint(innerClipping1, point) ||
2452 CGRectContainsPoint(innerClipping2, point)) {
2454 XCTAssertEqual(alpha, 255);
2455 }
else if (CGRectContainsPoint(outterClipping, point)) {
2457 XCTAssert(0 < alpha && alpha < 255);
2460 XCTAssertEqual(alpha, 0);
2466- (void)testClipRRect_multipleClips {
2467 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2473 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2476 flutterPlatformViewsController,
2478 std::make_shared<fml::SyncSwitch>());
2482 [flutterPlatformViewsController
2484 withId:@"MockFlutterPlatformView"
2488 [flutterPlatformViewsController
2492 @"viewType" : @"MockFlutterPlatformView",
2493 @"gestureBlockingPolicy" : @"eager"
2499 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2500 flutterPlatformViewsController.
flutterView = flutterView;
2515 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2518 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2519 withParams:std::move(embeddedViewParams)];
2520 [flutterPlatformViewsController
2527 [flutterView addSubview:childClippingView];
2529 [flutterView setNeedsLayout];
2530 [flutterView layoutIfNeeded];
2551 CGRect clipping = CGRectMake(4, 2, 4, 6);
2552 for (
int i = 0;
i < 10;
i++) {
2553 for (
int j = 0; j < 10; j++) {
2554 CGPoint point = CGPointMake(
i, j);
2555 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2556 if (
i == 7 && (j == 2 || j == 7)) {
2558 XCTAssert(0 < alpha && alpha < 255);
2561 (
i == 4 && j >= 2 && j <= 7) ||
2563 (
i == 7 && j >= 2 && j <= 7) ||
2565 (j == 2 &&
i >= 4 &&
i <= 7) ||
2567 (j == 7 &&
i >= 4 &&
i <= 7)) {
2570 XCTAssert(alpha > 127);
2571 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2572 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2575 XCTAssert(alpha < 127);
2576 }
else if (CGRectContainsPoint(clipping, point)) {
2578 XCTAssertEqual(alpha, 255);
2581 XCTAssertEqual(alpha, 0);
2587- (void)testClipPath {
2588 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2594 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2597 flutterPlatformViewsController,
2599 std::make_shared<fml::SyncSwitch>());
2603 [flutterPlatformViewsController
2605 withId:@"MockFlutterPlatformView"
2609 [flutterPlatformViewsController
2613 @"viewType" : @"MockFlutterPlatformView",
2614 @"gestureBlockingPolicy" : @"eager"
2620 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2621 flutterPlatformViewsController.
flutterView = flutterView;
2633 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2636 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2637 withParams:std::move(embeddedViewParams)];
2638 [flutterPlatformViewsController
2645 [flutterView addSubview:childClippingView];
2647 [flutterView setNeedsLayout];
2648 [flutterView layoutIfNeeded];
2669 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2670 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2671 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2672 for (
int i = 0;
i < 10;
i++) {
2673 for (
int j = 0; j < 10; j++) {
2674 CGPoint point = CGPointMake(
i, j);
2675 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2676 if (CGRectContainsPoint(innerClipping1, point) ||
2677 CGRectContainsPoint(innerClipping2, point)) {
2679 XCTAssertEqual(alpha, 255);
2680 }
else if (CGRectContainsPoint(outterClipping, point)) {
2682 XCTAssert(0 < alpha && alpha < 255);
2685 XCTAssertEqual(alpha, 0);
2691- (void)testClipPath_multipleClips {
2692 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2698 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2701 flutterPlatformViewsController,
2703 std::make_shared<fml::SyncSwitch>());
2707 [flutterPlatformViewsController
2709 withId:@"MockFlutterPlatformView"
2713 [flutterPlatformViewsController
2717 @"viewType" : @"MockFlutterPlatformView",
2718 @"gestureBlockingPolicy" : @"eager"
2724 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2725 flutterPlatformViewsController.
flutterView = flutterView;
2740 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2743 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2744 withParams:std::move(embeddedViewParams)];
2745 [flutterPlatformViewsController
2752 [flutterView addSubview:childClippingView];
2754 [flutterView setNeedsLayout];
2755 [flutterView layoutIfNeeded];
2776 CGRect clipping = CGRectMake(4, 2, 4, 6);
2777 for (
int i = 0;
i < 10;
i++) {
2778 for (
int j = 0; j < 10; j++) {
2779 CGPoint point = CGPointMake(
i, j);
2780 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2781 if (
i == 7 && (j == 2 || j == 7)) {
2783 XCTAssert(0 < alpha && alpha < 255);
2786 (
i == 4 && j >= 2 && j <= 7) ||
2788 (
i == 7 && j >= 2 && j <= 7) ||
2790 (j == 2 &&
i >= 4 &&
i <= 7) ||
2792 (j == 7 &&
i >= 4 &&
i <= 7)) {
2795 XCTAssert(alpha > 127);
2796 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2797 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2800 XCTAssert(alpha < 127);
2801 }
else if (CGRectContainsPoint(clipping, point)) {
2803 XCTAssertEqual(alpha, 255);
2806 XCTAssertEqual(alpha, 0);
2812- (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
2813 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2819 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2822 flutterPlatformViewsController,
2824 std::make_shared<fml::SyncSwitch>());
2828 [flutterPlatformViewsController
2830 withId:@"MockFlutterPlatformView"
2834 [flutterPlatformViewsController
2838 @"viewType" : @"MockFlutterPlatformView",
2839 @"gestureBlockingPolicy" : @"eager"
2846 XCTAssertNotNil(touchInterceptorView);
2848 UIGestureRecognizer* forwardGectureRecognizer =
2849 FindForwardingGestureRecognizer(touchInterceptorView);
2852 NSSet* touches1 = [[NSSet alloc] init];
2853 id event1 = OCMClassMock([UIEvent
class]);
2855 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2856 OCMReject([flutterViewController touchesBegan:touches1 withEvent:event1]);
2859 NSSet* touches2 = [[NSSet alloc] init];
2860 id event2 = OCMClassMock([UIEvent
class]);
2862 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2863 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2866- (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
2867 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2873 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2876 flutterPlatformViewsController,
2878 std::make_shared<fml::SyncSwitch>());
2882 [flutterPlatformViewsController
2884 withId:@"MockFlutterPlatformView"
2888 [flutterPlatformViewsController
2892 @"viewType" : @"MockFlutterPlatformView",
2893 @"gestureBlockingPolicy" : @"eager"
2900 XCTAssertNotNil(touchInterceptorView);
2902 UIGestureRecognizer* forwardGectureRecognizer =
2903 FindForwardingGestureRecognizer(touchInterceptorView);
2909 NSSet* touches1 = [[NSSet alloc] init];
2910 id event1 = OCMClassMock([UIEvent
class]);
2911 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2912 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2917 NSSet* touches2 = [[NSSet alloc] init];
2918 id event2 = OCMClassMock([UIEvent
class]);
2919 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2920 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2922 NSSet* touches3 = [[NSSet alloc] init];
2923 id event3 = OCMClassMock([UIEvent
class]);
2924 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2925 OCMVerify([flutterViewController touchesEnded:touches3 withEvent:event3]);
2928 NSSet* touches4 = [[NSSet alloc] init];
2929 id event4 = OCMClassMock([UIEvent
class]);
2930 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2931 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2933 NSSet* touches5 = [[NSSet alloc] init];
2934 id event5 = OCMClassMock([UIEvent
class]);
2935 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2936 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2943 NSSet* touches1 = [[NSSet alloc] init];
2944 id event1 = OCMClassMock([UIEvent
class]);
2945 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2946 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2951 NSSet* touches2 = [[NSSet alloc] init];
2952 id event2 = OCMClassMock([UIEvent
class]);
2953 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2954 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2956 NSSet* touches3 = [[NSSet alloc] init];
2957 id event3 = OCMClassMock([UIEvent
class]);
2958 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2959 OCMVerify([flutterViewController forceTouchesCancelled:touches3]);
2962 NSSet* touches4 = [[NSSet alloc] init];
2963 id event4 = OCMClassMock([UIEvent
class]);
2964 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2965 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2967 NSSet* touches5 = [[NSSet alloc] init];
2968 id event5 = OCMClassMock([UIEvent
class]);
2969 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2970 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2973 [flutterPlatformViewsController
reset];
2977 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2978 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2984 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2987 flutterPlatformViewsController,
2989 std::make_shared<fml::SyncSwitch>());
2993 [flutterPlatformViewsController
2995 withId:@"MockFlutterPlatformView"
2999 [flutterPlatformViewsController
3003 @"viewType" : @"MockFlutterPlatformView",
3004 @"gestureBlockingPolicy" : @"eager"
3011 XCTAssertNotNil(touchInterceptorView);
3013 UIGestureRecognizer* forwardGectureRecognizer =
3014 FindForwardingGestureRecognizer(touchInterceptorView);
3019 NSSet* touches1 = [NSSet setWithObject:@1];
3020 id event1 = OCMClassMock([UIEvent
class]);
3021 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3022 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
3029 NSSet* touches2 = [NSSet setWithObject:@1];
3030 id event2 = OCMClassMock([UIEvent
class]);
3031 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
3032 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
3033 OCMReject([flutterViewController2 touchesBegan:touches2 withEvent:event2]);
3035 NSSet* touches3 = [NSSet setWithObject:@1];
3036 id event3 = OCMClassMock([UIEvent
class]);
3037 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
3038 OCMVerify([flutterViewController touchesMoved:touches3 withEvent:event3]);
3039 OCMReject([flutterViewController2 touchesMoved:touches3 withEvent:event3]);
3041 NSSet* touches4 = [NSSet setWithObject:@1];
3042 id event4 = OCMClassMock([UIEvent
class]);
3043 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
3044 OCMVerify([flutterViewController touchesEnded:touches4 withEvent:event4]);
3045 OCMReject([flutterViewController2 touchesEnded:touches4 withEvent:event4]);
3047 NSSet* touches5 = [NSSet setWithObject:@1];
3048 id event5 = OCMClassMock([UIEvent
class]);
3049 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
3050 OCMVerify([flutterViewController touchesEnded:touches5 withEvent:event5]);
3051 OCMReject([flutterViewController2 touchesEnded:touches5 withEvent:event5]);
3055 NSSet* touches6 = [NSSet setWithObject:@1];
3056 id event6 = OCMClassMock([UIEvent
class]);
3057 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
3058 OCMVerify([flutterViewController2 touchesBegan:touches6 withEvent:event6]);
3059 OCMReject([flutterViewController touchesBegan:touches6 withEvent:event6]);
3062 NSSet* touches7 = [NSSet setWithObject:@1];
3063 id event7 = OCMClassMock([UIEvent
class]);
3064 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
3065 OCMVerify([flutterViewController2 touchesMoved:touches7 withEvent:event7]);
3066 OCMReject([flutterViewController touchesMoved:touches7 withEvent:event7]);
3068 NSSet* touches8 = [NSSet setWithObject:@1];
3069 id event8 = OCMClassMock([UIEvent
class]);
3070 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
3071 OCMVerify([flutterViewController2 touchesEnded:touches8 withEvent:event8]);
3072 OCMReject([flutterViewController touchesEnded:touches8 withEvent:event8]);
3074 [flutterPlatformViewsController
reset];
3077- (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
3078 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3084 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3087 flutterPlatformViewsController,
3089 std::make_shared<fml::SyncSwitch>());
3093 [flutterPlatformViewsController
3095 withId:@"MockFlutterPlatformView"
3099 [flutterPlatformViewsController
3103 @"viewType" : @"MockFlutterPlatformView",
3104 @"gestureBlockingPolicy" : @"eager"
3111 XCTAssertNotNil(touchInterceptorView);
3113 UIGestureRecognizer* forwardGectureRecognizer =
3114 FindForwardingGestureRecognizer(touchInterceptorView);
3118 NSSet* touches1 = [NSSet setWithObject:@1];
3119 id event1 = OCMClassMock([UIEvent
class]);
3120 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3122 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
3123 OCMVerify([flutterViewController forceTouchesCancelled:touches1]);
3125 [flutterPlatformViewsController
reset];
3128- (void)testFlutterPlatformViewTouchesEndedOrTouchesCancelledEventDoesNotFailTheGestureRecognizer {
3133 if (@available(iOS 26.0, *)) {
3137 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3143 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3146 flutterPlatformViewsController,
3148 std::make_shared<fml::SyncSwitch>());
3152 [flutterPlatformViewsController
3154 withId:@"MockFlutterPlatformView"
3158 [flutterPlatformViewsController
3162 @"viewType" : @"MockFlutterPlatformView",
3163 @"gestureBlockingPolicy" : @"eager"
3170 XCTAssertNotNil(touchInterceptorView);
3172 __block UIGestureRecognizer* forwardGestureRecognizer =
3173 FindForwardingGestureRecognizer(touchInterceptorView);
3177 NSSet* touches1 = [NSSet setWithObject:@1];
3178 id event1 = OCMClassMock([UIEvent
class]);
3179 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3180 @"Forwarding gesture recognizer must start with possible state.");
3181 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3182 [forwardGestureRecognizer touchesEnded:touches1 withEvent:event1];
3183 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3184 @"Forwarding gesture recognizer must end with failed state.");
3186 XCTestExpectation* touchEndedExpectation =
3187 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3188 dispatch_async(dispatch_get_main_queue(), ^{
3190 forwardGestureRecognizer = FindForwardingGestureRecognizer(touchInterceptorView);
3191 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3192 @"Forwarding gesture recognizer must be reset to possible state.");
3193 [touchEndedExpectation fulfill];
3195 [
self waitForExpectationsWithTimeout:30 handler:nil];
3197 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3198 @"Forwarding gesture recognizer must start with possible state.");
3199 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3200 [forwardGestureRecognizer touchesCancelled:touches1 withEvent:event1];
3201 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3202 @"Forwarding gesture recognizer must end with failed state.");
3203 XCTestExpectation* touchCancelledExpectation =
3204 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3205 dispatch_async(dispatch_get_main_queue(), ^{
3207 forwardGestureRecognizer = FindForwardingGestureRecognizer(touchInterceptorView);
3208 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3209 @"Forwarding gesture recognizer must be reset to possible state.");
3210 [touchCancelledExpectation fulfill];
3212 [
self waitForExpectationsWithTimeout:30 handler:nil];
3214 [flutterPlatformViewsController
reset];
3218 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWebView {
3219 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3225 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3228 flutterPlatformViewsController,
3230 std::make_shared<fml::SyncSwitch>());
3234 [flutterPlatformViewsController
3240 [flutterPlatformViewsController
3244 @"viewType" : @"MockWebView",
3245 @"gestureBlockingPolicy" : @"eager"
3252 XCTAssertNotNil(touchInterceptorView);
3254 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3255 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3256 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3263 BOOL shouldReAddDelayingRecognizer = NO;
3264 if (@available(iOS 26.0, *)) {
3268 }
else if (@available(iOS 18.2, *)) {
3269 shouldReAddDelayingRecognizer = YES;
3271 if (shouldReAddDelayingRecognizer) {
3273 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3274 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3276 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3277 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3282 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3283 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3289 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3292 flutterPlatformViewsController,
3294 std::make_shared<fml::SyncSwitch>());
3298 [flutterPlatformViewsController
3300 withId:@"MockWrapperWebView"
3304 [flutterPlatformViewsController
3309 @"viewType" : @"MockWrapperWebView",
3310 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3317 XCTAssertNotNil(touchInterceptorView);
3319 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3320 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3321 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3328 BOOL shouldReAddDelayingRecognizer = NO;
3329 if (@available(iOS 26.0, *)) {
3333 }
else if (@available(iOS 18.2, *)) {
3334 shouldReAddDelayingRecognizer = YES;
3336 if (shouldReAddDelayingRecognizer) {
3338 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3339 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3341 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3342 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3347 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3348 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3354 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3357 flutterPlatformViewsController,
3359 std::make_shared<fml::SyncSwitch>());
3363 [flutterPlatformViewsController
3365 withId:@"MockNestedWrapperWebView"
3369 [flutterPlatformViewsController
3373 @"viewType" : @"MockNestedWrapperWebView",
3374 @"gestureBlockingPolicy" : @"eager"
3381 XCTAssertNotNil(touchInterceptorView);
3383 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3384 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3385 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3392 BOOL shouldReAddDelayingRecognizer = NO;
3393 if (@available(iOS 26.0, *)) {
3397 }
else if (@available(iOS 18.2, *)) {
3398 shouldReAddDelayingRecognizer = YES;
3400 if (shouldReAddDelayingRecognizer) {
3402 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3403 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3405 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3406 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3411 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3412 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3418 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3421 flutterPlatformViewsController,
3423 std::make_shared<fml::SyncSwitch>());
3427 [flutterPlatformViewsController
3429 withId:@"MockFlutterPlatformView"
3433 [flutterPlatformViewsController
3437 @"viewType" : @"MockFlutterPlatformView",
3438 @"gestureBlockingPolicy" : @"eager"
3445 XCTAssertNotNil(touchInterceptorView);
3447 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3448 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3449 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3456 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3457 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3461 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForSimpleWebView {
3462 if (@available(iOS 26.4, *)) {
3464 }
else if (@available(iOS 26.0, *)) {
3465 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3471 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3474 flutterPlatformViewsController,
3476 std::make_shared<fml::SyncSwitch>());
3480 [flutterPlatformViewsController
3486 [flutterPlatformViewsController
3491 @"viewType" : @"MockWebView",
3492 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3500 XCTAssertNotNil(touchInterceptorView);
3514 root.gestureRecognizers = nil;
3515 for (UIView* subview in root.subviews) {
3516 [subview removeFromSuperview];
3520 [root addGestureRecognizer:normalRecognizer0];
3522 UIView* child1 = [[UIView alloc] init];
3523 [root addSubview:child1];
3525 [child1 addGestureRecognizer:normalRecognizer1];
3527 UIView* child2 = [[UIView alloc] init];
3528 [root addSubview:child2];
3530 [child2 addGestureRecognizer:normalRecognizer2];
3532 UIView* child2_1 = [[UIView alloc] init];
3533 [child2 addSubview:child2_1];
3535 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3537 UIView* child2_2 = [[UIView alloc] init];
3538 [child2 addSubview:child2_2];
3540 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3545 [root addGestureRecognizer:targetRecognizer0];
3549 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3553 NSArray* normalRecognizers = @[
3554 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3558 NSArray* targetRecognizers = @[ targetRecognizer0, targetRecognizer2_2 ];
3560 NSArray* expectedEmptyHistory = @[];
3561 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3564 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3567 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3573 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForMultipleWebViewInDifferentBranches {
3574 if (@available(iOS 26.4, *)) {
3576 }
else if (@available(iOS 26.0, *)) {
3577 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3583 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3586 flutterPlatformViewsController,
3588 std::make_shared<fml::SyncSwitch>());
3592 [flutterPlatformViewsController
3594 withId:@"MockWrapperWebView"
3598 [flutterPlatformViewsController
3603 @"viewType" : @"MockWrapperWebView",
3604 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3612 XCTAssertNotNil(touchInterceptorView);
3630 for (UIView* subview in root.subviews) {
3631 [subview removeFromSuperview];
3635 [root addGestureRecognizer:normalRecognizer0];
3637 UIView* child1 = [[UIView alloc] init];
3638 [root addSubview:child1];
3640 [child1 addGestureRecognizer:normalRecognizer1];
3642 UIView* child2 = [[WKWebView alloc] init];
3643 child2.gestureRecognizers = nil;
3644 for (UIView* subview in child2.subviews) {
3645 [subview removeFromSuperview];
3647 [root addSubview:child2];
3649 [child2 addGestureRecognizer:normalRecognizer2];
3651 UIView* child2_1 = [[UIView alloc] init];
3652 [child2 addSubview:child2_1];
3654 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3656 UIView* child2_2 = [[UIView alloc] init];
3657 [child2 addSubview:child2_2];
3659 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3661 UIView* child3 = [[UIView alloc] init];
3662 [root addSubview:child3];
3664 [child3 addGestureRecognizer:normalRecognizer3];
3666 UIView* child3_1 = [[WKWebView alloc] init];
3667 child3_1.gestureRecognizers = nil;
3668 for (UIView* subview in child3_1.subviews) {
3669 [subview removeFromSuperview];
3671 [child3 addSubview:child3_1];
3673 [child3_1 addGestureRecognizer:normalRecognizer3_1];
3675 UIView* child3_1_1 = [[UIView alloc] init];
3676 [child3_1 addSubview:child3_1_1];
3678 [child3_1_1 addGestureRecognizer:normalRecognizer3_1_1];
3680 UIView* child3_1_2 = [[UIView alloc] init];
3681 [child3_1 addSubview:child3_1_2];
3683 [child3_1_2 addGestureRecognizer:normalRecognizer3_1_2];
3689 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3693 [child3_1_2 addGestureRecognizer:targetRecognizer3_1_2];
3697 NSArray* normalRecognizers = @[
3698 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3699 normalRecognizer2_2, normalRecognizer3, normalRecognizer3_1, normalRecognizer3_1_1,
3700 normalRecognizer3_1_2
3702 NSArray* targetRecognizers = @[ targetRecognizer2_2, targetRecognizer3_1_2 ];
3704 NSArray* expectedEmptyHistory = @[];
3705 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3708 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3712 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3718 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForNestedMultipleWebView {
3719 if (@available(iOS 26.4, *)) {
3721 }
else if (@available(iOS 26.0, *)) {
3722 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3728 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3731 flutterPlatformViewsController,
3733 std::make_shared<fml::SyncSwitch>());
3737 [flutterPlatformViewsController
3743 [flutterPlatformViewsController
3748 @"viewType" : @"MockWebView",
3749 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3757 XCTAssertNotNil(touchInterceptorView);
3777 root.gestureRecognizers = nil;
3778 for (UIView* subview in root.subviews) {
3779 [subview removeFromSuperview];
3783 [root addGestureRecognizer:normalRecognizer0];
3785 UIView* child1 = [[UIView alloc] init];
3786 [root addSubview:child1];
3788 [child1 addGestureRecognizer:normalRecognizer1];
3790 UIView* child2 = [[UIView alloc] init];
3791 [root addSubview:child2];
3793 [child2 addGestureRecognizer:normalRecognizer2];
3795 UIView* child2_1 = [[UIView alloc] init];
3796 [child2 addSubview:child2_1];
3798 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3800 UIView* child2_2 = [[UIView alloc] init];
3801 [child2 addSubview:child2_2];
3803 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3805 UIView* child3 = [[UIView alloc] init];
3806 [root addSubview:child3];
3808 [child3 addGestureRecognizer:normalRecognizer3];
3810 UIView* child3_1 = [[WKWebView alloc] init];
3811 child3_1.gestureRecognizers = nil;
3812 for (UIView* subview in child3_1.subviews) {
3813 [subview removeFromSuperview];
3815 [child3 addSubview:child3_1];
3817 [child3_1 addGestureRecognizer:normalRecognizer3_1];
3819 UIView* child3_1_1 = [[UIView alloc] init];
3820 [child3_1 addSubview:child3_1_1];
3822 [child3_1_1 addGestureRecognizer:normalRecognizer3_1_1];
3824 UIView* child3_1_2 = [[UIView alloc] init];
3825 [child3_1 addSubview:child3_1_2];
3827 [child3_1_2 addGestureRecognizer:normalRecognizer3_1_2];
3829 UIView* child3_1_2_1 = [[UIView alloc] init];
3830 [child3_1_2 addSubview:child3_1_2_1];
3832 [child3_1_2_1 addGestureRecognizer:normalRecognizer3_1_2_1];
3834 UIView* child3_1_2_2 = [[UIView alloc] init];
3835 [child3_1_2 addSubview:child3_1_2_2];
3837 [child3_1_2_2 addGestureRecognizer:normalRecognizer3_1_2_2];
3843 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3847 [child3_1_2_2 addGestureRecognizer:targetRecognizer3_1_2_2];
3851 NSArray* normalRecognizers = @[
3852 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3853 normalRecognizer2_2, normalRecognizer3, normalRecognizer3_1, normalRecognizer3_1_1,
3854 normalRecognizer3_1_2, normalRecognizer3_1_2_1, normalRecognizer3_1_2_2
3857 NSArray* targetRecognizers = @[ targetRecognizer2_2, targetRecognizer3_1_2_2 ];
3859 NSArray* expectedEmptyHistory = @[];
3860 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3863 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3867 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3873 testFlutterPlatformViewGestureBlockingPolicy_ShouldNotAddDelayingRecognizerUnderDoNotBlockGesturePolicy {
3874 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3880 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3883 flutterPlatformViewsController,
3885 std::make_shared<fml::SyncSwitch>());
3890 withId:@"MockFlutterPlatformView"
3892 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
3895 [flutterPlatformViewsController
3900 @"viewType" : @"MockFlutterPlatformView",
3901 @"gestureBlockingPolicy" : @"doNotBlockGesture"
3908 XCTAssertNotNil(touchInterceptorView);
3910 XCTAssert(touchInterceptorView.gestureRecognizers.count == 1);
3911 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[0];
3915- (void)testFlutterPlatformViewGestureBlockingPolicy_ShouldAddDelayingRecognizerUnderEagerPolicy {
3916 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3922 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3925 flutterPlatformViewsController,
3927 std::make_shared<fml::SyncSwitch>());
3931 [flutterPlatformViewsController
3933 withId:@"MockFlutterPlatformView"
3937 [flutterPlatformViewsController
3941 @"viewType" : @"MockFlutterPlatformView",
3942 @"gestureBlockingPolicy" : @"eager"
3949 XCTAssertNotNil(touchInterceptorView);
3951 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3952 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3953 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3958- (void)testFlutterPlatformViewHitTest_AcceptTouchIfInstructedByFramework {
3959 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3969 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3972 flutterPlatformViewsController,
3974 std::make_shared<fml::SyncSwitch>());
3979 withId:@"MockFlutterPlatformView"
3981 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
3984 [flutterPlatformViewsController
3989 @"viewType" : @"MockFlutterPlatformView",
3990 @"gestureBlockingPolicy" : @"doNotBlockGesture"
3997 XCTAssertNotNil(touchInterceptorView);
3999 touchInterceptorView.frame = CGRectMake(0, 0, 100, 100);
4000 CGPoint touchBeganLocation = CGPointMake(1, 1);
4002 UIEvent* mockEvent = OCMClassMock([UIEvent
class]);
4003 OCMStub([mockEvent
type]).andReturn(UIEventTypeTouches);
4006 OCMStub([mockFlutterViewController
4007 platformViewShouldAcceptTouchAtTouchBeganLocation:touchBeganLocation])
4009 UIView* hitTestResult = [touchInterceptorView hitTest:touchBeganLocation withEvent:mockEvent];
4014- (void)testFlutterPlatformViewHitTest_RejectTouchIfInstructedByFramework {
4015 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4025 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4028 flutterPlatformViewsController,
4030 std::make_shared<fml::SyncSwitch>());
4035 withId:@"MockFlutterPlatformView"
4037 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
4040 [flutterPlatformViewsController
4045 @"viewType" : @"MockFlutterPlatformView",
4046 @"gestureBlockingPolicy" : @"doNotBlockGesture"
4053 XCTAssertNotNil(touchInterceptorView);
4055 touchInterceptorView.frame = CGRectMake(0, 0, 100, 100);
4056 CGPoint touchBeganLocation = CGPointMake(1, 1);
4058 UIEvent* mockEvent = OCMClassMock([UIEvent
class]);
4059 OCMStub([mockEvent
type]).andReturn(UIEventTypeTouches);
4062 OCMStub([mockFlutterViewController
4063 platformViewShouldAcceptTouchAtTouchBeganLocation:touchBeganLocation])
4065 UIView* hitTestResult = [touchInterceptorView hitTest:touchBeganLocation withEvent:mockEvent];
4067 XCTAssert(hitTestResult == touchInterceptorView);
4070- (void)testFlutterPlatformViewGestureBlockingPolicy_PolicyMappingIsCorrect {
4071 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4081 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4084 flutterPlatformViewsController,
4086 std::make_shared<fml::SyncSwitch>());
4091 withId:@"MockFlutterPlatformView"
4095 FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded];
4096 __block
id methodResult;
4098 methodResult = result;
4102 [flutterPlatformViewsController
4106 @"viewType" : @"MockFlutterPlatformView",
4107 @"gestureBlockingPolicy" : @"eager"
4116 [flutterPlatformViewsController
4121 @"viewType" : @"MockFlutterPlatformView",
4122 @"gestureBlockingPolicy" : @"waitUntilTouchesEnded"
4129 [flutterPlatformViewsController
4134 @"viewType" : @"MockFlutterPlatformView",
4135 @"gestureBlockingPolicy" : @"doNotBlockGesture"
4141 XCTAssertNil(methodResult);
4144 [flutterPlatformViewsController
4149 @"viewType" : @"MockFlutterPlatformView",
4150 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
4156 XCTAssertNil(methodResult);
4159 [flutterPlatformViewsController
4163 @"viewType" : @"MockFlutterPlatformView",
4164 @"gestureBlockingPolicy" : @"unknownPolicy"
4167 XCTAssertTrue([methodResult isKindOfClass:[
FlutterError class]]);
4169 XCTAssertEqualObjects(resultError.code,
@"unknown_gesture_blocking_policy");
4170 XCTAssertEqualObjects(
4171 resultError.message,
4172 @"Trying to create a platform view with an unknown gesture blocking policy");
4173 XCTAssertEqualObjects(resultError.details,
@"view id: '6'");
4176- (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
4177 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4183 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4186 flutterPlatformViewsController,
4188 std::make_shared<fml::SyncSwitch>());
4192 [flutterPlatformViewsController
4194 withId:@"MockFlutterPlatformView"
4198 [flutterPlatformViewsController
4202 @"viewType" : @"MockFlutterPlatformView",
4203 @"gestureBlockingPolicy" : @"eager"
4213 auto embeddedViewParams_1 =
4214 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4216 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4217 withParams:std::move(embeddedViewParams_1)];
4218 [flutterPlatformViewsController
4223 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4224 nullptr, framebuffer_info,
4228 XCTAssertFalse([flutterPlatformViewsController
4230 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4232 auto embeddedViewParams_2 =
4233 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4234 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4235 withParams:std::move(embeddedViewParams_2)];
4236 [flutterPlatformViewsController
4240 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
4241 nullptr, framebuffer_info,
4245 XCTAssertTrue([flutterPlatformViewsController
4246 submitFrame:std::move(mock_surface_submit_true)
4247 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4251 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
4252 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4258 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4261 flutterPlatformViewsController,
4263 std::make_shared<fml::SyncSwitch>());
4265 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4266 flutterPlatformViewsController.
flutterView = flutterView;
4270 [flutterPlatformViewsController
4272 withId:@"MockFlutterPlatformView"
4278 [flutterPlatformViewsController
4282 @"viewType" : @"MockFlutterPlatformView",
4283 @"gestureBlockingPolicy" : @"eager"
4289 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4291 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4292 withParams:std::move(embeddedViewParams)];
4298 [flutterPlatformViewsController
reset];
4303- (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
4304 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4310 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4313 flutterPlatformViewsController,
4315 std::make_shared<fml::SyncSwitch>());
4317 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4318 flutterPlatformViewsController.
flutterView = flutterView;
4322 [flutterPlatformViewsController
4324 withId:@"MockFlutterPlatformView"
4329 [flutterPlatformViewsController
4333 @"viewType" : @"MockFlutterPlatformView",
4334 @"gestureBlockingPolicy" : @"eager"
4340 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4343 auto embeddedViewParams1 =
4344 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4345 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4346 withParams:std::move(embeddedViewParams1)];
4347 [flutterPlatformViewsController
4354 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4357 auto embeddedViewParams2 =
4358 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4359 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4360 withParams:std::move(embeddedViewParams2)];
4361 [flutterPlatformViewsController
4369 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
4370 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4376 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4379 flutterPlatformViewsController,
4381 std::make_shared<fml::SyncSwitch>());
4383 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4384 flutterPlatformViewsController.
flutterView = flutterView;
4388 [flutterPlatformViewsController
4390 withId:@"MockFlutterPlatformView"
4394 [flutterPlatformViewsController
4398 @"viewType" : @"MockFlutterPlatformView",
4399 @"gestureBlockingPolicy" : @"eager"
4405 [flutterPlatformViewsController
4409 @"viewType" : @"MockFlutterPlatformView",
4410 @"gestureBlockingPolicy" : @"eager"
4415 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4418 auto embeddedViewParams1 =
4419 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4420 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4421 withParams:std::move(embeddedViewParams1)];
4423 auto embeddedViewParams2 =
4424 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4425 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4426 withParams:std::move(embeddedViewParams2)];
4429 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4430 nullptr, framebuffer_info,
4434 XCTAssertTrue([flutterPlatformViewsController
4436 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4439 UIView* clippingView1 = view1.superview.superview;
4440 UIView* clippingView2 = view2.superview.superview;
4441 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4442 [flutterView.subviews indexOfObject:clippingView2],
4443 @"The first clipping view should be added before the second clipping view.");
4446 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4448 embeddedViewParams2 =
4449 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4450 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4451 withParams:std::move(embeddedViewParams2)];
4453 embeddedViewParams1 =
4454 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4455 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4456 withParams:std::move(embeddedViewParams1)];
4458 mock_surface = std::make_unique<flutter::SurfaceFrame>(
4459 nullptr, framebuffer_info,
4463 XCTAssertTrue([flutterPlatformViewsController
4465 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4467 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
4468 [flutterView.subviews indexOfObject:clippingView2],
4469 @"The first clipping view should be added after the second clipping view.");
4473 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
4474 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4480 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4483 flutterPlatformViewsController,
4485 std::make_shared<fml::SyncSwitch>());
4487 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4488 flutterPlatformViewsController.
flutterView = flutterView;
4492 [flutterPlatformViewsController
4494 withId:@"MockFlutterPlatformView"
4498 [flutterPlatformViewsController
4502 @"viewType" : @"MockFlutterPlatformView",
4503 @"gestureBlockingPolicy" : @"eager"
4509 [flutterPlatformViewsController
4513 @"viewType" : @"MockFlutterPlatformView",
4514 @"gestureBlockingPolicy" : @"eager"
4519 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4522 auto embeddedViewParams1 =
4523 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4524 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4525 withParams:std::move(embeddedViewParams1)];
4527 auto embeddedViewParams2 =
4528 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4529 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4530 withParams:std::move(embeddedViewParams2)];
4533 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4534 nullptr, framebuffer_info,
4538 XCTAssertTrue([flutterPlatformViewsController
4540 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4543 UIView* clippingView1 = view1.superview.superview;
4544 UIView* clippingView2 = view2.superview.superview;
4545 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4546 [flutterView.subviews indexOfObject:clippingView2],
4547 @"The first clipping view should be added before the second clipping view.");
4550 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4552 embeddedViewParams1 =
4553 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4554 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4555 withParams:std::move(embeddedViewParams1)];
4557 embeddedViewParams2 =
4558 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4559 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4560 withParams:std::move(embeddedViewParams2)];
4562 mock_surface = std::make_unique<flutter::SurfaceFrame>(
4563 nullptr, framebuffer_info,
4567 XCTAssertTrue([flutterPlatformViewsController
4569 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4571 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4572 [flutterView.subviews indexOfObject:clippingView2],
4573 @"The first clipping view should be added before the second clipping view.");
4576- (int)alphaOfPoint:(CGPoint)point onView:(UIView*)
view {
4577 unsigned char pixel[4] = {0};
4579 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
4583 CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace,
4584 static_cast<uint32_t
>(kCGBitmapAlphaInfoMask) &
4585 static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast));
4586 CGContextTranslateCTM(
context, -point.x, -point.y);
4587 [view.layer renderInContext:context];
4590 CGColorSpaceRelease(colorSpace);
4595- (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
4597 UIWindow*
window = [[UIWindow alloc] init];
4598 UITextField* textField = [[UITextField alloc] init];
4599 [window addSubview:textField];
4601 [textField becomeFirstResponder];
4602 XCTAssertTrue(textField.isFirstResponder);
4603 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
4604 [textField resignFirstResponder];
4605 XCTAssertFalse(textField.isFirstResponder);
4606 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
4609- (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
4611 UIWindow*
window = [[UIWindow alloc] init];
4612 UIView*
view = [[UIView alloc] init];
4613 UIView* childView = [[UIView alloc] init];
4614 UITextField* textField = [[UITextField alloc] init];
4615 [window addSubview:view];
4616 [view addSubview:childView];
4617 [childView addSubview:textField];
4619 [textField becomeFirstResponder];
4620 XCTAssertTrue(textField.isFirstResponder);
4621 XCTAssertTrue(
view.flt_hasFirstResponderInViewHierarchySubtree);
4622 [textField resignFirstResponder];
4623 XCTAssertFalse(textField.isFirstResponder);
4624 XCTAssertFalse(
view.flt_hasFirstResponderInViewHierarchySubtree);
4627- (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
4633 CGRect newRect = CGRectMake(0, 0, 10, 10);
4637 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
4638 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
4639 XCTAssertEqualObjects(set1, set2);
4640 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
4641 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
4644- (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
4649 XCTAssertNotEqual(view1, view3);
4650 XCTAssertNotEqual(view2, view3);
4653- (void)testMaskViewsReleasedWhenPoolIsReleased {
4654 __weak UIView* weakView;
4659 XCTAssertNotNil(weakView);
4661 XCTAssertNil(weakView);
4664- (void)testClipMaskViewIsReused {
4665 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4671 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4674 flutterPlatformViewsController,
4676 std::make_shared<fml::SyncSwitch>());
4680 [flutterPlatformViewsController
4682 withId:@"MockFlutterPlatformView"
4686 [flutterPlatformViewsController
4690 @"viewType" : @"MockFlutterPlatformView",
4691 @"gestureBlockingPolicy" : @"eager"
4696 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4697 flutterPlatformViewsController.
flutterView = flutterView;
4708 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4711 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4712 withParams:std::move(embeddedViewParams1)];
4713 [flutterPlatformViewsController
4718 UIView* maskView1 = childClippingView1.maskView;
4719 XCTAssertNotNil(maskView1);
4722 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(100, 100)];
4724 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4726 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
4728 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4729 withParams:std::move(embeddedViewParams3)];
4730 [flutterPlatformViewsController
4737 [flutterPlatformViewsController
4741 @"viewType" : @"MockFlutterPlatformView",
4742 @"gestureBlockingPolicy" : @"eager"
4746 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
4748 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4749 withParams:std::move(embeddedViewParams4)];
4750 [flutterPlatformViewsController
4756 UIView* maskView2 = childClippingView2.maskView;
4757 XCTAssertEqual(maskView1, maskView2);
4758 XCTAssertNotNil(childClippingView2.maskView);
4759 XCTAssertNil(childClippingView1.maskView);
4762- (void)testDifferentClipMaskViewIsUsedForEachView {
4763 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4769 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4772 flutterPlatformViewsController,
4774 std::make_shared<fml::SyncSwitch>());
4778 [flutterPlatformViewsController
4780 withId:@"MockFlutterPlatformView"
4785 [flutterPlatformViewsController
4789 @"viewType" : @"MockFlutterPlatformView",
4790 @"gestureBlockingPolicy" : @"eager"
4796 [flutterPlatformViewsController
4800 @"viewType" : @"MockFlutterPlatformView",
4801 @"gestureBlockingPolicy" : @"eager"
4807 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4808 flutterPlatformViewsController.
flutterView = flutterView;
4819 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4824 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4827 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4828 withParams:std::move(embeddedViewParams1)];
4829 [flutterPlatformViewsController
4833 UIView* childClippingView1 = view1.superview.superview;
4835 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4836 withParams:std::move(embeddedViewParams2)];
4837 [flutterPlatformViewsController
4841 UIView* childClippingView2 = view2.superview.superview;
4842 UIView* maskView1 = childClippingView1.maskView;
4843 UIView* maskView2 = childClippingView2.maskView;
4844 XCTAssertNotEqual(maskView1, maskView2);
4847- (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4848 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4854 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4857 flutterPlatformViewsController,
4859 std::make_shared<fml::SyncSwitch>());
4863 [flutterPlatformViewsController
4865 withId:@"MockFlutterPlatformView"
4870 [flutterPlatformViewsController
4874 @"viewType" : @"MockFlutterPlatformView",
4875 @"gestureBlockingPolicy" : @"eager"
4880 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4881 flutterPlatformViewsController.
flutterView = flutterView;
4892 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4897 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4900 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4901 withParams:std::move(embeddedViewParams1)];
4902 [flutterPlatformViewsController
4908 UIView* maskView = childClippingView.maskView;
4909 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer class]],
4910 @"Mask view must use CAShapeLayer as its backing layer.");
4918- (
BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4919 expectedFrame:(CGRect)frame
4920 inputRadius:(CGFloat)inputRadius {
4921 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4922 for (UIView*
view in visualEffectView.subviews) {
4923 if (![NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
4926 XCTAssertEqual(
view.layer.filters.count, 1u);
4927 NSObject* filter =
view.layer.filters.firstObject;
4929 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4931 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4932 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber class]] &&
4933 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4940- (void)testDisposingViewInCompositionOrderDoNotCrash {
4941 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4947 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4950 flutterPlatformViewsController,
4952 std::make_shared<fml::SyncSwitch>());
4954 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4955 flutterPlatformViewsController.
flutterView = flutterView;
4959 [flutterPlatformViewsController
4961 withId:@"MockFlutterPlatformView"
4966 [flutterPlatformViewsController
4970 @"viewType" : @"MockFlutterPlatformView",
4971 @"gestureBlockingPolicy" : @"eager"
4974 [flutterPlatformViewsController
4978 @"viewType" : @"MockFlutterPlatformView",
4979 @"gestureBlockingPolicy" : @"eager"
4986 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4989 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4991 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4992 withParams:std::move(embeddedViewParams0)];
4994 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4996 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4997 withParams:std::move(embeddedViewParams1)];
5001 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
5003 [expectation fulfill];
5006 [flutterPlatformViewsController
5009 [
self waitForExpectationsWithTimeout:30 handler:nil];
5012 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5013 nullptr, framebuffer_info,
5018 XCTAssertTrue([flutterPlatformViewsController
5020 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
5024 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
5025 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
5031 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
5034 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
5036 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
5037 withParams:std::move(embeddedViewParams1)];
5040 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5041 nullptr, framebuffer_info,
5045 XCTAssertTrue([flutterPlatformViewsController
5047 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
5051 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
5052 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
5055- (void)testOnlyPlatformViewsAreRemovedWhenReset {
5056 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5062 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5065 flutterPlatformViewsController,
5067 std::make_shared<fml::SyncSwitch>());
5071 [flutterPlatformViewsController
5073 withId:@"MockFlutterPlatformView"
5077 [flutterPlatformViewsController
5081 @"viewType" : @"MockFlutterPlatformView",
5082 @"gestureBlockingPolicy" : @"eager"
5085 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5086 flutterPlatformViewsController.
flutterView = flutterView;
5098 auto embeddedViewParams =
5099 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5101 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5102 withParams:std::move(embeddedViewParams)];
5105 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5106 nullptr, framebuffer_info,
5110 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5111 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5113 UIView* someView = [[UIView alloc] init];
5114 [flutterView addSubview:someView];
5116 [flutterPlatformViewsController
reset];
5117 XCTAssertEqual(flutterView.subviews.count, 1u);
5118 XCTAssertEqual(flutterView.subviews.firstObject, someView);
5121- (void)testResetClearsPreviousCompositionOrder {
5122 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5128 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5131 flutterPlatformViewsController,
5133 std::make_shared<fml::SyncSwitch>());
5137 [flutterPlatformViewsController
5139 withId:@"MockFlutterPlatformView"
5143 [flutterPlatformViewsController
5147 @"viewType" : @"MockFlutterPlatformView",
5148 @"gestureBlockingPolicy" : @"eager"
5151 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5152 flutterPlatformViewsController.
flutterView = flutterView;
5164 auto embeddedViewParams =
5165 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5167 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5168 withParams:std::move(embeddedViewParams)];
5171 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5172 nullptr, framebuffer_info,
5176 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5177 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5183 [flutterPlatformViewsController
reset];
5189- (void)testNilPlatformViewDoesntCrash {
5190 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5196 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5199 flutterPlatformViewsController,
5201 std::make_shared<fml::SyncSwitch>());
5205 [flutterPlatformViewsController
5207 withId:@"MockFlutterPlatformView"
5211 [flutterPlatformViewsController
5215 @"viewType" : @"MockFlutterPlatformView",
5216 @"gestureBlockingPolicy" : @"eager"
5219 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5220 flutterPlatformViewsController.
flutterView = flutterView;
5233 auto embeddedViewParams =
5234 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5236 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5237 withParams:std::move(embeddedViewParams)];
5240 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5241 nullptr, framebuffer_info,
5245 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5246 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5248 XCTAssertEqual(flutterView.subviews.count, 1u);
5251- (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
5253 NSObject* container = [[NSObject alloc] init];
5254 [touchInterceptorView setFlutterAccessibilityContainer:container];
5255 XCTAssertEqualObjects([touchInterceptorView accessibilityContainer], container);
5258- (void)testLayerPool {
5268 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
5269 XCTAssertEqual(pool.size(), 1u);
5270 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
5271 XCTAssertEqual(pool.size(), 2u);
5274 pool.RecycleLayers();
5275 XCTAssertEqual(pool.size(), 2u);
5278 auto unused_layers = pool.RemoveUnusedLayers();
5279 XCTAssertEqual(unused_layers.size(), 2u);
5280 XCTAssertEqual(pool.size(), 1u);
5283- (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
5284 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5290 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5293 flutterPlatformViewsController,
5295 std::make_shared<fml::SyncSwitch>());
5297 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5298 flutterPlatformViewsController.
flutterView = flutterView;
5302 [flutterPlatformViewsController
5304 withId:@"MockFlutterPlatformView"
5308 [flutterPlatformViewsController
5312 @"viewType" : @"MockFlutterPlatformView",
5313 @"gestureBlockingPolicy" : @"eager"
5318 [flutterPlatformViewsController
5322 @"viewType" : @"MockFlutterPlatformView",
5323 @"gestureBlockingPolicy" : @"eager"
5327 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
5330 auto embeddedViewParams1 =
5331 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5332 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
5333 withParams:std::move(embeddedViewParams1)];
5335 auto embeddedViewParams2 =
5336 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
5337 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
5338 withParams:std::move(embeddedViewParams2)];
5341 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
5342 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5343 nullptr, framebuffer_info,
5356 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5357 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5359 XCTAssertTrue(submit_info.has_value());
5364- (void)testClipSuperellipse {
5365 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5371 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5374 flutterPlatformViewsController,
5376 std::make_shared<fml::SyncSwitch>());
5380 [flutterPlatformViewsController
5382 withId:@"MockFlutterPlatformView"
5386 [flutterPlatformViewsController
5390 @"viewType" : @"MockFlutterPlatformView",
5391 @"gestureBlockingPolicy" : @"eager"
5397 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
5398 flutterPlatformViewsController.
flutterView = flutterView;
5409 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
5412 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5413 withParams:std::move(embeddedViewParams)];
5414 [flutterPlatformViewsController
5421 [flutterView addSubview:childClippingView];
5423 [flutterView setNeedsLayout];
5424 [flutterView layoutIfNeeded];
5426 CGPoint corners[] = {CGPointMake(rect.
GetLeft(), rect.
GetTop()),
5430 for (
auto point : corners) {
5431 int alpha = [
self alphaOfPoint:point onView:flutterView];
5432 XCTAssertNotEqual(alpha, 255);
5436 int alpha = [
self alphaOfPoint:center onView:flutterView];
5437 XCTAssertEqual(alpha, 255);
void(^ FlutterResult)(id _Nullable result)
@ FlutterPlatformViewGestureRecognizersBlockingPolicyEager
@ FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded
@ FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture
static __weak MockPlatformView * gMockPlatformView
NSMutableArray * backdropFilterSubviews()
void applyBlurBackdropFilters:(NSArray< PlatformViewFilter * > *filters)
FlutterClippingMaskView * getMaskViewWithFrame:(CGRect frame)
void insertViewToPoolIfNeeded:(FlutterClippingMaskView *maskView)
FlutterPlatformViewGestureRecognizersBlockingPolicy blockingPolicy
AssetResolverType
Identifies the type of AssetResolver an instance is.
static std::shared_ptr< DlImageFilter > Make(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode, std::optional< DlRect > bounds=std::nullopt)
Developer-facing API for rendering anything within the engine.
static std::shared_ptr< DlImageFilter > Make(DlScalar radius_x, DlScalar radius_y)
static DlPath MakeRoundRectXY(const DlRect &rect, DlScalar x_radius, DlScalar y_radius, bool counter_clock_wise=false)
void PushTransform(const DlMatrix &matrix)
void PushBackdropFilter(const std::shared_ptr< DlImageFilter > &filter, const DlRect &filter_rect)
void PushClipRect(const DlRect &rect)
void PushClipPath(const DlPath &path)
void PushPlatformViewClipRRect(const DlRoundRect &rrect)
void PushClipRRect(const DlRoundRect &rrect)
void PushClipRSE(const DlRoundSuperellipse &rrect)
void PushPlatformViewClipRSuperellipse(const DlRoundSuperellipse &rse)
Storage for Overlay layers across frames.
void CreateLayer(const std::shared_ptr< IOSContext > &ios_context, MTLPixelFormat pixel_format)
Create a new overlay layer.
const SubmitInfo & submit_info() const
A Mapping like NonOwnedMapping, but uses Free as its release proc.
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
flutter::PlatformViewIOS * platformView()
const flutter::TaskRunners & taskRunners
instancetype methodCallWithMethodName:arguments:(NSString *method,[arguments] id _Nullable arguments)
static MockSurface mock_surface
FlutterFMLTaskRunner * GetDefaultTaskRunner()
FlutterPlatformViewsController * CreateTestPlatformViewsController(NSString *label)
FlutterFMLTaskRunners * CreateTestTaskRunners(NSString *label)
impeller::Scalar DlScalar
impeller::ISize32 DlISize
std::function< void()> closure
std::shared_ptr< ContextGLES > context
impeller::ShaderType type
A 4x4 matrix using column-major storage.
static constexpr Matrix MakeTranslation(const Vector3 &t)
static Matrix MakeRotationZ(Radians r)
static constexpr Matrix MakeScale(const Vector3 &s)
static RoundRect MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
static RoundSuperellipse MakeOval(const Rect &rect)
static RoundSuperellipse MakeRectXY(const Rect &rect, Scalar x_radius, Scalar y_radius)
constexpr auto GetBottom() const
static constexpr TRect MakeWH(Type width, Type height)
constexpr auto GetTop() const
constexpr Type GetHeight() const
Returns the height of the rectangle, equivalent to |GetSize().height|.
constexpr auto GetLeft() const
constexpr auto GetRight() const
static constexpr TRect MakeXYWH(Type x, Type y, Type width, Type height)
constexpr Type GetWidth() const
Returns the width of the rectangle, equivalent to |GetSize().width|.