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,
317BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2) {
318 const CGFloat epsilon = 0.01;
319 return std::abs(radius1 - radius2) < epsilon;
345static UIGestureRecognizer* FindForwardingGestureRecognizer(UIView*
view) {
346 for (UIGestureRecognizer* gestureRecognizer in
view.gestureRecognizers) {
348 return gestureRecognizer;
354- (void)testFlutterViewOnlyCreateOnceInOneFrame {
355 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
360 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
363 flutterPlatformViewsController,
366 std::make_shared<fml::SyncSwitch>());
370 [flutterPlatformViewsController
372 withId:@"MockFlutterPlatformView"
376 [flutterPlatformViewsController
380 @"viewType" : @"MockFlutterPlatformView",
381 @"gestureBlockingPolicy" : @"eager"
384 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
385 flutterPlatformViewsController.
flutterView = flutterView;
397 auto embeddedViewParams =
398 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
400 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
401 withParams:std::move(embeddedViewParams)];
405 [flutterPlatformViewsController
reset];
408- (void)testCanCreatePlatformViewWithoutFlutterView {
409 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
414 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
417 flutterPlatformViewsController,
420 std::make_shared<fml::SyncSwitch>());
424 [flutterPlatformViewsController
426 withId:@"MockFlutterPlatformView"
430 [flutterPlatformViewsController
434 @"viewType" : @"MockFlutterPlatformView",
435 @"gestureBlockingPolicy" : @"eager"
442- (void)testChildClippingViewHitTests {
445 UIView* childView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
446 [childClippingView addSubview:childView];
448 XCTAssertFalse([childClippingView pointInside:CGPointMake(50, 50) withEvent:nil]);
449 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 100) withEvent:nil]);
450 XCTAssertFalse([childClippingView pointInside:CGPointMake(100, 99) withEvent:nil]);
451 XCTAssertFalse([childClippingView pointInside:CGPointMake(201, 200) withEvent:nil]);
452 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 201) withEvent:nil]);
453 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 200) withEvent:nil]);
454 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 299) withEvent:nil]);
456 XCTAssertTrue([childClippingView pointInside:CGPointMake(150, 150) withEvent:nil]);
457 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 100) withEvent:nil]);
458 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 100) withEvent:nil]);
459 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 199) withEvent:nil]);
460 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 199) withEvent:nil]);
463- (void)testReleasesBackdropFilterSubviewsOnChildClippingViewDealloc {
464 __weak NSMutableArray<UIVisualEffectView*>* weakBackdropFilterSubviews = nil;
465 __weak UIVisualEffectView* weakVisualEffectView1 = nil;
466 __weak UIVisualEffectView* weakVisualEffectView2 = nil;
470 UIVisualEffectView* visualEffectView1 = [[UIVisualEffectView alloc]
471 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
472 weakVisualEffectView1 = visualEffectView1;
477 isRoundedSuperellipse:NO
478 visualEffectView:visualEffectView1];
483 UIVisualEffectView* visualEffectView2 = [[UIVisualEffectView alloc]
484 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
485 weakVisualEffectView2 = visualEffectView2;
490 isRoundedSuperellipse:NO
491 visualEffectView:visualEffectView2];
495 XCTAssertNotNil(weakBackdropFilterSubviews);
498 XCTAssertNil(weakBackdropFilterSubviews);
499 XCTAssertNil(weakVisualEffectView1);
500 XCTAssertNil(weakVisualEffectView2);
503- (void)testApplyBackdropFilter {
504 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
509 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
512 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,
593 std::make_shared<fml::SyncSwitch>());
597 [flutterPlatformViewsController
599 withId:@"MockFlutterPlatformView"
603 [flutterPlatformViewsController
607 @"viewType" : @"MockFlutterPlatformView",
608 @"gestureBlockingPolicy" : @"eager"
614 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
615 flutterPlatformViewsController.
flutterView = flutterView;
627 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
630 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
631 withParams:std::move(embeddedViewParams)];
632 [flutterPlatformViewsController
638 [flutterView addSubview:childClippingView];
640 [flutterView setNeedsLayout];
641 [flutterView layoutIfNeeded];
644 NSUInteger numberOfExpectedVisualEffectView = 0;
645 for (UIView* subview in childClippingView.subviews) {
646 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
649 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
650 if ([
self validateOneVisualEffectView:subview
651 expectedFrame:CGRectMake(0, 0, 5, 8)
653 numberOfExpectedVisualEffectView++;
656 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
659- (void)testApplyMultipleBackdropFilters {
660 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
665 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
668 flutterPlatformViewsController,
671 std::make_shared<fml::SyncSwitch>());
675 [flutterPlatformViewsController
677 withId:@"MockFlutterPlatformView"
681 [flutterPlatformViewsController
685 @"viewType" : @"MockFlutterPlatformView",
686 @"gestureBlockingPolicy" : @"eager"
692 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
693 flutterPlatformViewsController.
flutterView = flutterView;
701 for (
int i = 0;
i < 50;
i++) {
707 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
710 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
711 withParams:std::move(embeddedViewParams)];
712 [flutterPlatformViewsController
718 [flutterView addSubview:childClippingView];
720 [flutterView setNeedsLayout];
721 [flutterView layoutIfNeeded];
723 NSUInteger numberOfExpectedVisualEffectView = 0;
724 for (UIView* subview in childClippingView.subviews) {
725 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
728 XCTAssertLessThan(numberOfExpectedVisualEffectView, 50u);
729 if ([
self validateOneVisualEffectView:subview
730 expectedFrame:CGRectMake(0, 0, 10, 10)
731 inputRadius:(CGFloat)numberOfExpectedVisualEffectView]) {
732 numberOfExpectedVisualEffectView++;
735 XCTAssertEqual(numberOfExpectedVisualEffectView, (NSUInteger)numberOfExpectedVisualEffectView);
738- (void)testAddBackdropFilters {
739 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
745 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
748 flutterPlatformViewsController,
751 std::make_shared<fml::SyncSwitch>());
755 [flutterPlatformViewsController
757 withId:@"MockFlutterPlatformView"
761 [flutterPlatformViewsController
765 @"viewType" : @"MockFlutterPlatformView",
766 @"gestureBlockingPolicy" : @"eager"
772 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
773 flutterPlatformViewsController.
flutterView = flutterView;
785 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
788 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
789 withParams:std::move(embeddedViewParams)];
790 [flutterPlatformViewsController
796 [flutterView addSubview:childClippingView];
798 [flutterView setNeedsLayout];
799 [flutterView layoutIfNeeded];
801 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
802 for (UIView* subview in childClippingView.subviews) {
803 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
806 XCTAssertLessThan(originalVisualEffectViews.count, 1u);
807 if ([
self validateOneVisualEffectView:subview
808 expectedFrame:CGRectMake(0, 0, 10, 10)
809 inputRadius:(CGFloat)5]) {
810 [originalVisualEffectViews addObject:subview];
813 XCTAssertEqual(originalVisualEffectViews.count, 1u);
822 for (
int i = 0;
i < 2;
i++) {
827 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
830 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
831 withParams:std::move(embeddedViewParams)];
832 [flutterPlatformViewsController
836 [flutterView setNeedsLayout];
837 [flutterView layoutIfNeeded];
839 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
840 for (UIView* subview in childClippingView.subviews) {
841 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
844 XCTAssertLessThan(newVisualEffectViews.count, 2u);
846 if ([
self validateOneVisualEffectView:subview
847 expectedFrame:CGRectMake(0, 0, 10, 10)
848 inputRadius:(CGFloat)5]) {
849 [newVisualEffectViews addObject:subview];
852 XCTAssertEqual(newVisualEffectViews.count, 2u);
853 for (NSUInteger
i = 0;
i < originalVisualEffectViews.count;
i++) {
854 UIView* originalView = originalVisualEffectViews[i];
855 UIView* newView = newVisualEffectViews[i];
857 XCTAssertEqual(originalView, newView);
858 id mockOrignalView = OCMPartialMock(originalView);
859 OCMReject([mockOrignalView removeFromSuperview]);
860 [mockOrignalView stopMocking];
864- (void)testRemoveBackdropFilters {
865 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
871 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
874 flutterPlatformViewsController,
877 std::make_shared<fml::SyncSwitch>());
881 [flutterPlatformViewsController
883 withId:@"MockFlutterPlatformView"
887 [flutterPlatformViewsController
891 @"viewType" : @"MockFlutterPlatformView",
892 @"gestureBlockingPolicy" : @"eager"
898 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
899 flutterPlatformViewsController.
flutterView = flutterView;
908 for (
int i = 0;
i < 5;
i++) {
913 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
916 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
917 withParams:std::move(embeddedViewParams)];
918 [flutterPlatformViewsController
924 [flutterView addSubview:childClippingView];
926 [flutterView setNeedsLayout];
927 [flutterView layoutIfNeeded];
929 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
930 for (UIView* subview in childClippingView.subviews) {
931 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
934 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
935 if ([
self validateOneVisualEffectView:subview
936 expectedFrame:CGRectMake(0, 0, 10, 10)
937 inputRadius:(CGFloat)5]) {
938 [originalVisualEffectViews addObject:subview];
948 for (
int i = 0;
i < 4;
i++) {
953 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
956 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
957 withParams:std::move(embeddedViewParams)];
958 [flutterPlatformViewsController
962 [flutterView setNeedsLayout];
963 [flutterView layoutIfNeeded];
965 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
966 for (UIView* subview in childClippingView.subviews) {
967 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
970 XCTAssertLessThan(newVisualEffectViews.count, 4u);
971 if ([
self validateOneVisualEffectView:subview
972 expectedFrame:CGRectMake(0, 0, 10, 10)
973 inputRadius:(CGFloat)5]) {
974 [newVisualEffectViews addObject:subview];
977 XCTAssertEqual(newVisualEffectViews.count, 4u);
979 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
980 UIView* newView = newVisualEffectViews[i];
981 id mockNewView = OCMPartialMock(newView);
982 UIView* originalView = originalVisualEffectViews[i];
984 XCTAssertEqual(originalView, newView);
985 OCMReject([mockNewView removeFromSuperview]);
986 [mockNewView stopMocking];
991 for (
int i = 0;
i < 5;
i++) {
996 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
999 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1000 withParams:std::move(embeddedViewParams)];
1001 [flutterPlatformViewsController
1005 [flutterView setNeedsLayout];
1006 [flutterView layoutIfNeeded];
1008 NSUInteger numberOfExpectedVisualEffectView = 0u;
1009 for (UIView* subview in childClippingView.subviews) {
1010 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1011 numberOfExpectedVisualEffectView++;
1014 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1017- (void)testEditBackdropFilters {
1018 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1024 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1027 flutterPlatformViewsController,
1030 std::make_shared<fml::SyncSwitch>());
1034 [flutterPlatformViewsController
1036 withId:@"MockFlutterPlatformView"
1040 [flutterPlatformViewsController
1044 @"viewType" : @"MockFlutterPlatformView",
1045 @"gestureBlockingPolicy" : @"eager"
1051 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1052 flutterPlatformViewsController.
flutterView = flutterView;
1061 for (
int i = 0;
i < 5;
i++) {
1066 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1069 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1070 withParams:std::move(embeddedViewParams)];
1071 [flutterPlatformViewsController
1077 [flutterView addSubview:childClippingView];
1079 [flutterView setNeedsLayout];
1080 [flutterView layoutIfNeeded];
1082 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
1083 for (UIView* subview in childClippingView.subviews) {
1084 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1087 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
1088 if ([
self validateOneVisualEffectView:subview
1089 expectedFrame:CGRectMake(0, 0, 10, 10)
1090 inputRadius:(CGFloat)5]) {
1091 [originalVisualEffectViews addObject:subview];
1101 for (
int i = 0;
i < 5;
i++) {
1114 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1117 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1118 withParams:std::move(embeddedViewParams)];
1119 [flutterPlatformViewsController
1123 [flutterView setNeedsLayout];
1124 [flutterView layoutIfNeeded];
1126 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
1127 for (UIView* subview in childClippingView.subviews) {
1128 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1131 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1132 CGFloat expectInputRadius = 5;
1133 if (newVisualEffectViews.count == 3) {
1134 expectInputRadius = 2;
1136 if ([
self validateOneVisualEffectView:subview
1137 expectedFrame:CGRectMake(0, 0, 10, 10)
1138 inputRadius:expectInputRadius]) {
1139 [newVisualEffectViews addObject:subview];
1142 XCTAssertEqual(newVisualEffectViews.count, 5u);
1143 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1144 UIView* newView = newVisualEffectViews[i];
1145 id mockNewView = OCMPartialMock(newView);
1146 UIView* originalView = originalVisualEffectViews[i];
1148 XCTAssertEqual(originalView, newView);
1149 OCMReject([mockNewView removeFromSuperview]);
1150 [mockNewView stopMocking];
1152 [newVisualEffectViews removeAllObjects];
1156 for (
int i = 0;
i < 5;
i++) {
1160 for (
int i = 0;
i < 5;
i++) {
1172 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1175 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1176 withParams:std::move(embeddedViewParams)];
1177 [flutterPlatformViewsController
1181 [flutterView setNeedsLayout];
1182 [flutterView layoutIfNeeded];
1184 for (UIView* subview in childClippingView.subviews) {
1185 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1188 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1189 CGFloat expectInputRadius = 5;
1190 if (newVisualEffectViews.count == 0) {
1191 expectInputRadius = 2;
1193 if ([
self validateOneVisualEffectView:subview
1194 expectedFrame:CGRectMake(0, 0, 10, 10)
1195 inputRadius:expectInputRadius]) {
1196 [newVisualEffectViews addObject:subview];
1199 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1200 UIView* newView = newVisualEffectViews[i];
1201 id mockNewView = OCMPartialMock(newView);
1202 UIView* originalView = originalVisualEffectViews[i];
1204 XCTAssertEqual(originalView, newView);
1205 OCMReject([mockNewView removeFromSuperview]);
1206 [mockNewView stopMocking];
1208 [newVisualEffectViews removeAllObjects];
1212 for (
int i = 0;
i < 5;
i++) {
1216 for (
int i = 0;
i < 5;
i++) {
1228 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1231 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1232 withParams:std::move(embeddedViewParams)];
1233 [flutterPlatformViewsController
1237 [flutterView setNeedsLayout];
1238 [flutterView layoutIfNeeded];
1240 for (UIView* subview in childClippingView.subviews) {
1241 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1244 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1245 CGFloat expectInputRadius = 5;
1246 if (newVisualEffectViews.count == 4) {
1247 expectInputRadius = 2;
1249 if ([
self validateOneVisualEffectView:subview
1250 expectedFrame:CGRectMake(0, 0, 10, 10)
1251 inputRadius:expectInputRadius]) {
1252 [newVisualEffectViews addObject:subview];
1255 XCTAssertEqual(newVisualEffectViews.count, 5u);
1257 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1258 UIView* newView = newVisualEffectViews[i];
1259 id mockNewView = OCMPartialMock(newView);
1260 UIView* originalView = originalVisualEffectViews[i];
1262 XCTAssertEqual(originalView, newView);
1263 OCMReject([mockNewView removeFromSuperview]);
1264 [mockNewView stopMocking];
1266 [newVisualEffectViews removeAllObjects];
1270 for (
int i = 0;
i < 5;
i++) {
1274 for (
int i = 0;
i < 5;
i++) {
1281 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1284 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1285 withParams:std::move(embeddedViewParams)];
1286 [flutterPlatformViewsController
1290 [flutterView setNeedsLayout];
1291 [flutterView layoutIfNeeded];
1293 for (UIView* subview in childClippingView.subviews) {
1294 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1297 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1298 if ([
self validateOneVisualEffectView:subview
1299 expectedFrame:CGRectMake(0, 0, 10, 10)
1300 inputRadius:(CGFloat)newVisualEffectViews.count]) {
1301 [newVisualEffectViews addObject:subview];
1304 XCTAssertEqual(newVisualEffectViews.count, 5u);
1306 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1307 UIView* newView = newVisualEffectViews[i];
1308 id mockNewView = OCMPartialMock(newView);
1309 UIView* originalView = originalVisualEffectViews[i];
1311 XCTAssertEqual(originalView, newView);
1312 OCMReject([mockNewView removeFromSuperview]);
1313 [mockNewView stopMocking];
1315 [newVisualEffectViews removeAllObjects];
1318- (void)testApplyBackdropFilterNotDlBlurImageFilter {
1319 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1325 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1328 flutterPlatformViewsController,
1331 std::make_shared<fml::SyncSwitch>());
1335 [flutterPlatformViewsController
1337 withId:@"MockFlutterPlatformView"
1341 [flutterPlatformViewsController
1345 @"viewType" : @"MockFlutterPlatformView",
1346 @"gestureBlockingPolicy" : @"eager"
1352 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1353 flutterPlatformViewsController.
flutterView = flutterView;
1364 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1367 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1368 withParams:std::move(embeddedViewParams)];
1369 [flutterPlatformViewsController
1376 [flutterView addSubview:childClippingView];
1378 [flutterView setNeedsLayout];
1379 [flutterView layoutIfNeeded];
1381 NSUInteger numberOfExpectedVisualEffectView = 0;
1382 for (UIView* subview in childClippingView.subviews) {
1383 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1384 numberOfExpectedVisualEffectView++;
1387 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1397 for (
int i = 0;
i < 5;
i++) {
1408 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1411 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1412 withParams:std::move(embeddedViewParams)];
1413 [flutterPlatformViewsController
1417 [flutterView setNeedsLayout];
1418 [flutterView layoutIfNeeded];
1420 numberOfExpectedVisualEffectView = 0;
1421 for (UIView* subview in childClippingView.subviews) {
1422 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1425 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1426 if ([
self validateOneVisualEffectView:subview
1427 expectedFrame:CGRectMake(0, 0, 10, 10)
1428 inputRadius:(CGFloat)5]) {
1429 numberOfExpectedVisualEffectView++;
1432 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1436 for (
int i = 0;
i < 5;
i++) {
1440 for (
int i = 0;
i < 5;
i++) {
1451 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1454 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1455 withParams:std::move(embeddedViewParams)];
1456 [flutterPlatformViewsController
1460 [flutterView setNeedsLayout];
1461 [flutterView layoutIfNeeded];
1463 numberOfExpectedVisualEffectView = 0;
1464 for (UIView* subview in childClippingView.subviews) {
1465 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1468 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1469 if ([
self validateOneVisualEffectView:subview
1470 expectedFrame:CGRectMake(0, 0, 10, 10)
1471 inputRadius:(CGFloat)5]) {
1472 numberOfExpectedVisualEffectView++;
1475 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1479 for (
int i = 0;
i < 5;
i++) {
1483 for (
int i = 0;
i < 5;
i++) {
1494 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1497 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1498 withParams:std::move(embeddedViewParams)];
1499 [flutterPlatformViewsController
1503 [flutterView setNeedsLayout];
1504 [flutterView layoutIfNeeded];
1506 numberOfExpectedVisualEffectView = 0;
1507 for (UIView* subview in childClippingView.subviews) {
1508 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1511 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1512 if ([
self validateOneVisualEffectView:subview
1513 expectedFrame:CGRectMake(0, 0, 10, 10)
1514 inputRadius:(CGFloat)5]) {
1515 numberOfExpectedVisualEffectView++;
1518 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1522 for (
int i = 0;
i < 5;
i++) {
1526 for (
int i = 0;
i < 5;
i++) {
1531 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1534 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1535 withParams:std::move(embeddedViewParams)];
1536 [flutterPlatformViewsController
1540 [flutterView setNeedsLayout];
1541 [flutterView layoutIfNeeded];
1543 numberOfExpectedVisualEffectView = 0;
1544 for (UIView* subview in childClippingView.subviews) {
1545 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1546 numberOfExpectedVisualEffectView++;
1549 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1552- (void)testApplyBackdropFilterCorrectAPI {
1557 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1558 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1563 isRoundedSuperellipse:NO
1564 visualEffectView:visualEffectView];
1565 XCTAssertNotNil(platformViewFilter);
1568- (void)testApplyBackdropFilterAPIChangedInvalidUIVisualEffectView {
1570 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc] init];
1575 isRoundedSuperellipse:NO
1576 visualEffectView:visualEffectView];
1577 XCTAssertNil(platformViewFilter);
1580- (void)testApplyBackdropFilterAPIChangedNoGaussianBlurFilter {
1582 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1583 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1584 NSArray* subviews = editedUIVisualEffectView.subviews;
1585 for (UIView*
view in subviews) {
1586 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1587 for (CIFilter* filter in
view.layer.filters) {
1588 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1589 [filter setValue:@"notGaussianBlur" forKey:@"name"];
1600 isRoundedSuperellipse:NO
1601 visualEffectView:editedUIVisualEffectView];
1602 XCTAssertNil(platformViewFilter);
1605- (void)testApplyBackdropFilterAPIChangedInvalidInputRadius {
1607 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1608 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1609 NSArray* subviews = editedUIVisualEffectView.subviews;
1610 for (UIView*
view in subviews) {
1611 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1612 for (CIFilter* filter in
view.layer.filters) {
1613 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1614 [filter setValue:@"invalidInputRadius" forKey:@"inputRadius"];
1626 isRoundedSuperellipse:NO
1627 visualEffectView:editedUIVisualEffectView];
1628 XCTAssertNil(platformViewFilter);
1631- (void)testApplyBackdropFilterRespectsClipRRect {
1632 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1638 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1641 flutterPlatformViewsController,
1644 std::make_shared<fml::SyncSwitch>());
1648 [flutterPlatformViewsController
1650 withId:@"MockFlutterPlatformView"
1654 [flutterPlatformViewsController
1659 @"viewType" : @"MockFlutterPlatformView",
1660 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
1666 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1667 flutterPlatformViewsController.
flutterView = flutterView;
1685 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1688 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1689 withParams:std::move(embeddedViewParams)];
1690 [flutterPlatformViewsController
1696 [flutterView addSubview:childClippingView];
1698 [flutterView setNeedsLayout];
1699 [flutterView layoutIfNeeded];
1701 NSArray<UIVisualEffectView*>* filters = childClippingView.backdropFilterSubviews;
1702 XCTAssertEqual(filters.count, 1u);
1704 UIVisualEffectView* visualEffectView = filters[0];
1705 auto radii = clipRRect.GetRadii();
1707 XCTAssertEqual(visualEffectView.layer.cornerRadius, radii.top_left.width);
1708 XCTAssertEqual(visualEffectView.layer.cornerCurve, kCACornerCurveCircular);
1711- (void)testApplyBackdropFilterRespectsClipRSuperellipse {
1712 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1718 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1721 flutterPlatformViewsController,
1724 std::make_shared<fml::SyncSwitch>());
1728 [flutterPlatformViewsController
1730 withId:@"MockFlutterPlatformView"
1734 [flutterPlatformViewsController
1739 @"viewType" : @"MockFlutterPlatformView",
1740 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
1746 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1747 flutterPlatformViewsController.
flutterView = flutterView;
1765 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1768 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1769 withParams:std::move(embeddedViewParams)];
1770 [flutterPlatformViewsController
1776 [flutterView addSubview:childClippingView];
1778 [flutterView setNeedsLayout];
1779 [flutterView layoutIfNeeded];
1781 NSArray<UIVisualEffectView*>* filters = childClippingView.backdropFilterSubviews;
1782 XCTAssertEqual(filters.count, 1u);
1784 UIVisualEffectView* visualEffectView = filters[0];
1785 auto radii = clipRSE.GetRadii();
1787 XCTAssertEqual(visualEffectView.layer.cornerRadius, radii.top_left.width);
1788 XCTAssertEqual(visualEffectView.layer.cornerCurve, kCACornerCurveContinuous);
1791- (void)testBackdropFilterVisualEffectSubviewBackgroundColor {
1792 __weak UIVisualEffectView* weakVisualEffectView;
1795 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1796 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1797 weakVisualEffectView = visualEffectView;
1802 isRoundedSuperellipse:NO
1803 visualEffectView:visualEffectView];
1804 CGColorRef visualEffectSubviewBackgroundColor = nil;
1805 for (UIView*
view in [platformViewFilter backdropFilterView].subviews) {
1806 if ([NSStringFromClass([
view class]) hasSuffix:
@"VisualEffectSubview"]) {
1807 visualEffectSubviewBackgroundColor =
view.layer.backgroundColor;
1811 CGColorEqualToColor(visualEffectSubviewBackgroundColor, UIColor.clearColor.CGColor));
1813 XCTAssertNil(weakVisualEffectView);
1816- (void)testCompositePlatformView {
1817 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1823 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1826 flutterPlatformViewsController,
1829 std::make_shared<fml::SyncSwitch>());
1833 [flutterPlatformViewsController
1835 withId:@"MockFlutterPlatformView"
1839 [flutterPlatformViewsController
1843 @"viewType" : @"MockFlutterPlatformView",
1844 @"gestureBlockingPolicy" : @"eager"
1850 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1851 flutterPlatformViewsController.
flutterView = flutterView;
1863 auto embeddedViewParams =
1864 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
1866 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1867 withParams:std::move(embeddedViewParams)];
1868 [flutterPlatformViewsController
1872 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1873 toView:flutterView];
1874 XCTAssertTrue(CGRectEqualToRect(platformViewRectInFlutterView, CGRectMake(100, 100, 300, 300)));
1877- (void)testBackdropFilterCorrectlyPushedAndReset {
1878 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1884 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1887 flutterPlatformViewsController,
1890 std::make_shared<fml::SyncSwitch>());
1894 [flutterPlatformViewsController
1896 withId:@"MockFlutterPlatformView"
1900 [flutterPlatformViewsController
1904 @"viewType" : @"MockFlutterPlatformView",
1905 @"gestureBlockingPolicy" : @"eager"
1911 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1912 flutterPlatformViewsController.
flutterView = flutterView;
1920 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1923 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1924 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1925 withParams:std::move(embeddedViewParams)];
1928 [flutterPlatformViewsController
1929 pushFilterToVisitedPlatformViews:filter
1930 withRect:flutter::DlRect::MakeXYWH(0, 0, screenScale * 10,
1932 [flutterPlatformViewsController
1938 [flutterView addSubview:childClippingView];
1940 [flutterView setNeedsLayout];
1941 [flutterView layoutIfNeeded];
1944 NSUInteger numberOfExpectedVisualEffectView = 0;
1945 for (UIView* subview in childClippingView.subviews) {
1946 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1949 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1950 if ([
self validateOneVisualEffectView:subview
1951 expectedFrame:CGRectMake(0, 0, 10, 10)
1953 numberOfExpectedVisualEffectView++;
1956 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1959 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
1961 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1962 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1963 withParams:std::move(embeddedViewParams2)];
1964 [flutterPlatformViewsController
1970 [flutterView setNeedsLayout];
1971 [flutterView layoutIfNeeded];
1973 numberOfExpectedVisualEffectView = 0;
1974 for (UIView* subview in childClippingView.subviews) {
1975 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1978 numberOfExpectedVisualEffectView++;
1980 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1983- (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1984 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1990 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1993 flutterPlatformViewsController,
1996 std::make_shared<fml::SyncSwitch>());
2000 [flutterPlatformViewsController
2002 withId:@"MockFlutterPlatformView"
2006 [flutterPlatformViewsController
2010 @"viewType" : @"MockFlutterPlatformView",
2011 @"gestureBlockingPolicy" : @"eager"
2017 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2018 flutterPlatformViewsController.
flutterView = flutterView;
2030 auto embeddedViewParams =
2031 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
2033 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2034 withParams:std::move(embeddedViewParams)];
2035 [flutterPlatformViewsController
2039 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
2040 toView:flutterView];
2046 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
2048 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
2051 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
2054 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
2058- (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
2059 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2065 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2068 flutterPlatformViewsController,
2071 std::make_shared<fml::SyncSwitch>());
2075 [flutterPlatformViewsController
2077 withId:@"MockFlutterPlatformView"
2081 [flutterPlatformViewsController
2085 @"viewType" : @"MockFlutterPlatformView",
2086 @"gestureBlockingPolicy" : @"eager"
2092 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
2093 flutterPlatformViewsController.
flutterView = flutterView;
2112 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2115 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2116 withParams:std::move(embeddedViewParams)];
2117 [flutterPlatformViewsController
2124 [flutterView addSubview:childClippingView];
2126 [flutterView setNeedsLayout];
2127 [flutterView layoutIfNeeded];
2128 XCTAssertNil(childClippingView.maskView);
2131- (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
2132 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2138 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2141 flutterPlatformViewsController,
2144 std::make_shared<fml::SyncSwitch>());
2148 [flutterPlatformViewsController
2150 withId:@"MockFlutterPlatformView"
2154 [flutterPlatformViewsController
2158 @"viewType" : @"MockFlutterPlatformView",
2159 @"gestureBlockingPolicy" : @"eager"
2165 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
2166 flutterPlatformViewsController.
flutterView = flutterView;
2183 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2186 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2187 withParams:std::move(embeddedViewParams)];
2188 [flutterPlatformViewsController
2195 [flutterView addSubview:childClippingView];
2197 [flutterView setNeedsLayout];
2198 [flutterView layoutIfNeeded];
2200 XCTAssertNotNil(childClippingView.maskView);
2203- (void)testClipRect {
2204 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2210 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2213 flutterPlatformViewsController,
2216 std::make_shared<fml::SyncSwitch>());
2220 [flutterPlatformViewsController
2222 withId:@"MockFlutterPlatformView"
2226 [flutterPlatformViewsController
2230 @"viewType" : @"MockFlutterPlatformView",
2231 @"gestureBlockingPolicy" : @"eager"
2237 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2238 flutterPlatformViewsController.
flutterView = flutterView;
2249 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2252 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2253 withParams:std::move(embeddedViewParams)];
2254 [flutterPlatformViewsController
2261 [flutterView addSubview:childClippingView];
2263 [flutterView setNeedsLayout];
2264 [flutterView layoutIfNeeded];
2266 CGRect insideClipping = CGRectMake(2, 2, 3, 3);
2267 for (
int i = 0;
i < 10;
i++) {
2268 for (
int j = 0; j < 10; j++) {
2269 CGPoint point = CGPointMake(
i, j);
2270 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2271 if (CGRectContainsPoint(insideClipping, point)) {
2272 XCTAssertEqual(alpha, 255);
2274 XCTAssertEqual(alpha, 0);
2280- (void)testClipRect_multipleClips {
2281 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2287 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2290 flutterPlatformViewsController,
2293 std::make_shared<fml::SyncSwitch>());
2297 [flutterPlatformViewsController
2299 withId:@"MockFlutterPlatformView"
2303 [flutterPlatformViewsController
2307 @"viewType" : @"MockFlutterPlatformView",
2308 @"gestureBlockingPolicy" : @"eager"
2314 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2315 flutterPlatformViewsController.
flutterView = flutterView;
2329 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2332 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2333 withParams:std::move(embeddedViewParams)];
2334 [flutterPlatformViewsController
2341 [flutterView addSubview:childClippingView];
2343 [flutterView setNeedsLayout];
2344 [flutterView layoutIfNeeded];
2363 CGRect insideClipping = CGRectMake(3, 3, 2, 2);
2364 for (
int i = 0;
i < 10;
i++) {
2365 for (
int j = 0; j < 10; j++) {
2366 CGPoint point = CGPointMake(
i, j);
2367 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2368 if (CGRectContainsPoint(insideClipping, point)) {
2369 XCTAssertEqual(alpha, 255);
2371 XCTAssertEqual(alpha, 0);
2377- (void)testClipRRect {
2378 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2384 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2387 flutterPlatformViewsController,
2390 std::make_shared<fml::SyncSwitch>());
2394 [flutterPlatformViewsController
2396 withId:@"MockFlutterPlatformView"
2400 [flutterPlatformViewsController
2404 @"viewType" : @"MockFlutterPlatformView",
2405 @"gestureBlockingPolicy" : @"eager"
2411 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2412 flutterPlatformViewsController.
flutterView = flutterView;
2424 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2427 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2428 withParams:std::move(embeddedViewParams)];
2429 [flutterPlatformViewsController
2436 [flutterView addSubview:childClippingView];
2438 [flutterView setNeedsLayout];
2439 [flutterView layoutIfNeeded];
2460 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2461 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2462 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2463 for (
int i = 0;
i < 10;
i++) {
2464 for (
int j = 0; j < 10; j++) {
2465 CGPoint point = CGPointMake(
i, j);
2466 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2467 if (CGRectContainsPoint(innerClipping1, point) ||
2468 CGRectContainsPoint(innerClipping2, point)) {
2470 XCTAssertEqual(alpha, 255);
2471 }
else if (CGRectContainsPoint(outterClipping, point)) {
2473 XCTAssert(0 < alpha && alpha < 255);
2476 XCTAssertEqual(alpha, 0);
2482- (void)testClipRRect_multipleClips {
2483 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2489 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2492 flutterPlatformViewsController,
2495 std::make_shared<fml::SyncSwitch>());
2499 [flutterPlatformViewsController
2501 withId:@"MockFlutterPlatformView"
2505 [flutterPlatformViewsController
2509 @"viewType" : @"MockFlutterPlatformView",
2510 @"gestureBlockingPolicy" : @"eager"
2516 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2517 flutterPlatformViewsController.
flutterView = flutterView;
2532 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2535 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2536 withParams:std::move(embeddedViewParams)];
2537 [flutterPlatformViewsController
2544 [flutterView addSubview:childClippingView];
2546 [flutterView setNeedsLayout];
2547 [flutterView layoutIfNeeded];
2568 CGRect clipping = CGRectMake(4, 2, 4, 6);
2569 for (
int i = 0;
i < 10;
i++) {
2570 for (
int j = 0; j < 10; j++) {
2571 CGPoint point = CGPointMake(
i, j);
2572 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2573 if (
i == 7 && (j == 2 || j == 7)) {
2575 XCTAssert(0 < alpha && alpha < 255);
2578 (
i == 4 && j >= 2 && j <= 7) ||
2580 (
i == 7 && j >= 2 && j <= 7) ||
2582 (j == 2 &&
i >= 4 &&
i <= 7) ||
2584 (j == 7 &&
i >= 4 &&
i <= 7)) {
2587 XCTAssert(alpha > 127);
2588 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2589 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2592 XCTAssert(alpha < 127);
2593 }
else if (CGRectContainsPoint(clipping, point)) {
2595 XCTAssertEqual(alpha, 255);
2598 XCTAssertEqual(alpha, 0);
2604- (void)testClipPath {
2605 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2611 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2614 flutterPlatformViewsController,
2617 std::make_shared<fml::SyncSwitch>());
2621 [flutterPlatformViewsController
2623 withId:@"MockFlutterPlatformView"
2627 [flutterPlatformViewsController
2631 @"viewType" : @"MockFlutterPlatformView",
2632 @"gestureBlockingPolicy" : @"eager"
2638 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2639 flutterPlatformViewsController.
flutterView = flutterView;
2651 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2654 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2655 withParams:std::move(embeddedViewParams)];
2656 [flutterPlatformViewsController
2663 [flutterView addSubview:childClippingView];
2665 [flutterView setNeedsLayout];
2666 [flutterView layoutIfNeeded];
2687 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2688 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2689 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2690 for (
int i = 0;
i < 10;
i++) {
2691 for (
int j = 0; j < 10; j++) {
2692 CGPoint point = CGPointMake(
i, j);
2693 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2694 if (CGRectContainsPoint(innerClipping1, point) ||
2695 CGRectContainsPoint(innerClipping2, point)) {
2697 XCTAssertEqual(alpha, 255);
2698 }
else if (CGRectContainsPoint(outterClipping, point)) {
2700 XCTAssert(0 < alpha && alpha < 255);
2703 XCTAssertEqual(alpha, 0);
2709- (void)testClipPath_multipleClips {
2710 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2716 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2719 flutterPlatformViewsController,
2722 std::make_shared<fml::SyncSwitch>());
2726 [flutterPlatformViewsController
2728 withId:@"MockFlutterPlatformView"
2732 [flutterPlatformViewsController
2736 @"viewType" : @"MockFlutterPlatformView",
2737 @"gestureBlockingPolicy" : @"eager"
2743 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2744 flutterPlatformViewsController.
flutterView = flutterView;
2759 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2762 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2763 withParams:std::move(embeddedViewParams)];
2764 [flutterPlatformViewsController
2771 [flutterView addSubview:childClippingView];
2773 [flutterView setNeedsLayout];
2774 [flutterView layoutIfNeeded];
2795 CGRect clipping = CGRectMake(4, 2, 4, 6);
2796 for (
int i = 0;
i < 10;
i++) {
2797 for (
int j = 0; j < 10; j++) {
2798 CGPoint point = CGPointMake(
i, j);
2799 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2800 if (
i == 7 && (j == 2 || j == 7)) {
2802 XCTAssert(0 < alpha && alpha < 255);
2805 (
i == 4 && j >= 2 && j <= 7) ||
2807 (
i == 7 && j >= 2 && j <= 7) ||
2809 (j == 2 &&
i >= 4 &&
i <= 7) ||
2811 (j == 7 &&
i >= 4 &&
i <= 7)) {
2814 XCTAssert(alpha > 127);
2815 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2816 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2819 XCTAssert(alpha < 127);
2820 }
else if (CGRectContainsPoint(clipping, point)) {
2822 XCTAssertEqual(alpha, 255);
2825 XCTAssertEqual(alpha, 0);
2831- (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
2832 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2838 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2841 flutterPlatformViewsController,
2844 std::make_shared<fml::SyncSwitch>());
2848 [flutterPlatformViewsController
2850 withId:@"MockFlutterPlatformView"
2854 [flutterPlatformViewsController
2858 @"viewType" : @"MockFlutterPlatformView",
2859 @"gestureBlockingPolicy" : @"eager"
2866 XCTAssertNotNil(touchInterceptorView);
2868 UIGestureRecognizer* forwardGectureRecognizer =
2869 FindForwardingGestureRecognizer(touchInterceptorView);
2872 NSSet* touches1 = [[NSSet alloc] init];
2873 id event1 = OCMClassMock([UIEvent
class]);
2875 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2876 OCMReject([flutterViewController touchesBegan:touches1 withEvent:event1]);
2879 NSSet* touches2 = [[NSSet alloc] init];
2880 id event2 = OCMClassMock([UIEvent
class]);
2882 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2883 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2886- (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
2887 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2893 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2896 flutterPlatformViewsController,
2899 std::make_shared<fml::SyncSwitch>());
2903 [flutterPlatformViewsController
2905 withId:@"MockFlutterPlatformView"
2909 [flutterPlatformViewsController
2913 @"viewType" : @"MockFlutterPlatformView",
2914 @"gestureBlockingPolicy" : @"eager"
2921 XCTAssertNotNil(touchInterceptorView);
2923 UIGestureRecognizer* forwardGectureRecognizer =
2924 FindForwardingGestureRecognizer(touchInterceptorView);
2930 NSSet* touches1 = [[NSSet alloc] init];
2931 id event1 = OCMClassMock([UIEvent
class]);
2932 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2933 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2938 NSSet* touches2 = [[NSSet alloc] init];
2939 id event2 = OCMClassMock([UIEvent
class]);
2940 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2941 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2943 NSSet* touches3 = [[NSSet alloc] init];
2944 id event3 = OCMClassMock([UIEvent
class]);
2945 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2946 OCMVerify([flutterViewController touchesEnded:touches3 withEvent:event3]);
2949 NSSet* touches4 = [[NSSet alloc] init];
2950 id event4 = OCMClassMock([UIEvent
class]);
2951 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2952 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2954 NSSet* touches5 = [[NSSet alloc] init];
2955 id event5 = OCMClassMock([UIEvent
class]);
2956 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2957 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2964 NSSet* touches1 = [[NSSet alloc] init];
2965 id event1 = OCMClassMock([UIEvent
class]);
2966 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2967 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2972 NSSet* touches2 = [[NSSet alloc] init];
2973 id event2 = OCMClassMock([UIEvent
class]);
2974 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2975 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2977 NSSet* touches3 = [[NSSet alloc] init];
2978 id event3 = OCMClassMock([UIEvent
class]);
2979 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2980 OCMVerify([flutterViewController forceTouchesCancelled:touches3]);
2983 NSSet* touches4 = [[NSSet alloc] init];
2984 id event4 = OCMClassMock([UIEvent
class]);
2985 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2986 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2988 NSSet* touches5 = [[NSSet alloc] init];
2989 id event5 = OCMClassMock([UIEvent
class]);
2990 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2991 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2994 [flutterPlatformViewsController
reset];
2998 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2999 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3005 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3008 flutterPlatformViewsController,
3011 std::make_shared<fml::SyncSwitch>());
3015 [flutterPlatformViewsController
3017 withId:@"MockFlutterPlatformView"
3021 [flutterPlatformViewsController
3025 @"viewType" : @"MockFlutterPlatformView",
3026 @"gestureBlockingPolicy" : @"eager"
3033 XCTAssertNotNil(touchInterceptorView);
3035 UIGestureRecognizer* forwardGectureRecognizer =
3036 FindForwardingGestureRecognizer(touchInterceptorView);
3041 NSSet* touches1 = [NSSet setWithObject:@1];
3042 id event1 = OCMClassMock([UIEvent
class]);
3043 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3044 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
3051 NSSet* touches2 = [NSSet setWithObject:@1];
3052 id event2 = OCMClassMock([UIEvent
class]);
3053 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
3054 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
3055 OCMReject([flutterViewController2 touchesBegan:touches2 withEvent:event2]);
3057 NSSet* touches3 = [NSSet setWithObject:@1];
3058 id event3 = OCMClassMock([UIEvent
class]);
3059 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
3060 OCMVerify([flutterViewController touchesMoved:touches3 withEvent:event3]);
3061 OCMReject([flutterViewController2 touchesMoved:touches3 withEvent:event3]);
3063 NSSet* touches4 = [NSSet setWithObject:@1];
3064 id event4 = OCMClassMock([UIEvent
class]);
3065 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
3066 OCMVerify([flutterViewController touchesEnded:touches4 withEvent:event4]);
3067 OCMReject([flutterViewController2 touchesEnded:touches4 withEvent:event4]);
3069 NSSet* touches5 = [NSSet setWithObject:@1];
3070 id event5 = OCMClassMock([UIEvent
class]);
3071 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
3072 OCMVerify([flutterViewController touchesEnded:touches5 withEvent:event5]);
3073 OCMReject([flutterViewController2 touchesEnded:touches5 withEvent:event5]);
3077 NSSet* touches6 = [NSSet setWithObject:@1];
3078 id event6 = OCMClassMock([UIEvent
class]);
3079 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
3080 OCMVerify([flutterViewController2 touchesBegan:touches6 withEvent:event6]);
3081 OCMReject([flutterViewController touchesBegan:touches6 withEvent:event6]);
3084 NSSet* touches7 = [NSSet setWithObject:@1];
3085 id event7 = OCMClassMock([UIEvent
class]);
3086 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
3087 OCMVerify([flutterViewController2 touchesMoved:touches7 withEvent:event7]);
3088 OCMReject([flutterViewController touchesMoved:touches7 withEvent:event7]);
3090 NSSet* touches8 = [NSSet setWithObject:@1];
3091 id event8 = OCMClassMock([UIEvent
class]);
3092 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
3093 OCMVerify([flutterViewController2 touchesEnded:touches8 withEvent:event8]);
3094 OCMReject([flutterViewController touchesEnded:touches8 withEvent:event8]);
3096 [flutterPlatformViewsController
reset];
3099- (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
3100 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3106 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3109 flutterPlatformViewsController,
3112 std::make_shared<fml::SyncSwitch>());
3116 [flutterPlatformViewsController
3118 withId:@"MockFlutterPlatformView"
3122 [flutterPlatformViewsController
3126 @"viewType" : @"MockFlutterPlatformView",
3127 @"gestureBlockingPolicy" : @"eager"
3134 XCTAssertNotNil(touchInterceptorView);
3136 UIGestureRecognizer* forwardGectureRecognizer =
3137 FindForwardingGestureRecognizer(touchInterceptorView);
3141 NSSet* touches1 = [NSSet setWithObject:@1];
3142 id event1 = OCMClassMock([UIEvent
class]);
3143 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3145 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
3146 OCMVerify([flutterViewController forceTouchesCancelled:touches1]);
3148 [flutterPlatformViewsController
reset];
3151- (void)testFlutterPlatformViewTouchesEndedOrTouchesCancelledEventDoesNotFailTheGestureRecognizer {
3156 if (@available(iOS 26.0, *)) {
3160 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3166 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3169 flutterPlatformViewsController,
3172 std::make_shared<fml::SyncSwitch>());
3176 [flutterPlatformViewsController
3178 withId:@"MockFlutterPlatformView"
3182 [flutterPlatformViewsController
3186 @"viewType" : @"MockFlutterPlatformView",
3187 @"gestureBlockingPolicy" : @"eager"
3194 XCTAssertNotNil(touchInterceptorView);
3196 __block UIGestureRecognizer* forwardGestureRecognizer =
3197 FindForwardingGestureRecognizer(touchInterceptorView);
3201 NSSet* touches1 = [NSSet setWithObject:@1];
3202 id event1 = OCMClassMock([UIEvent
class]);
3203 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3204 @"Forwarding gesture recognizer must start with possible state.");
3205 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3206 [forwardGestureRecognizer touchesEnded:touches1 withEvent:event1];
3207 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3208 @"Forwarding gesture recognizer must end with failed state.");
3210 XCTestExpectation* touchEndedExpectation =
3211 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3212 dispatch_async(dispatch_get_main_queue(), ^{
3214 forwardGestureRecognizer = FindForwardingGestureRecognizer(touchInterceptorView);
3215 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3216 @"Forwarding gesture recognizer must be reset to possible state.");
3217 [touchEndedExpectation fulfill];
3219 [
self waitForExpectationsWithTimeout:30 handler:nil];
3221 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3222 @"Forwarding gesture recognizer must start with possible state.");
3223 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3224 [forwardGestureRecognizer touchesCancelled:touches1 withEvent:event1];
3225 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3226 @"Forwarding gesture recognizer must end with failed state.");
3227 XCTestExpectation* touchCancelledExpectation =
3228 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3229 dispatch_async(dispatch_get_main_queue(), ^{
3231 forwardGestureRecognizer = FindForwardingGestureRecognizer(touchInterceptorView);
3232 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3233 @"Forwarding gesture recognizer must be reset to possible state.");
3234 [touchCancelledExpectation fulfill];
3236 [
self waitForExpectationsWithTimeout:30 handler:nil];
3238 [flutterPlatformViewsController
reset];
3242 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWebView {
3243 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3249 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3252 flutterPlatformViewsController,
3255 std::make_shared<fml::SyncSwitch>());
3259 [flutterPlatformViewsController
3265 [flutterPlatformViewsController
3269 @"viewType" : @"MockWebView",
3270 @"gestureBlockingPolicy" : @"eager"
3277 XCTAssertNotNil(touchInterceptorView);
3279 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3280 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3281 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3288 BOOL shouldReAddDelayingRecognizer = NO;
3289 if (@available(iOS 26.0, *)) {
3292 }
else if (@available(iOS 18.2, *)) {
3293 shouldReAddDelayingRecognizer = YES;
3295 if (shouldReAddDelayingRecognizer) {
3297 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3298 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3300 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3301 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3306 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3307 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3313 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3316 flutterPlatformViewsController,
3319 std::make_shared<fml::SyncSwitch>());
3323 [flutterPlatformViewsController
3325 withId:@"MockWrapperWebView"
3329 [flutterPlatformViewsController
3334 @"viewType" : @"MockWrapperWebView",
3335 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3342 XCTAssertNotNil(touchInterceptorView);
3344 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3345 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3346 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3353 BOOL shouldReAddDelayingRecognizer = NO;
3354 if (@available(iOS 26.0, *)) {
3358 }
else if (@available(iOS 18.2, *)) {
3359 shouldReAddDelayingRecognizer = YES;
3361 if (shouldReAddDelayingRecognizer) {
3363 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3364 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3366 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3367 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3372 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3373 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3379 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3382 flutterPlatformViewsController,
3385 std::make_shared<fml::SyncSwitch>());
3389 [flutterPlatformViewsController
3391 withId:@"MockNestedWrapperWebView"
3395 [flutterPlatformViewsController
3399 @"viewType" : @"MockNestedWrapperWebView",
3400 @"gestureBlockingPolicy" : @"eager"
3407 XCTAssertNotNil(touchInterceptorView);
3409 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3410 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3411 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3418 BOOL shouldReAddDelayingRecognizer = NO;
3419 if (@available(iOS 26.0, *)) {
3423 }
else if (@available(iOS 18.2, *)) {
3424 shouldReAddDelayingRecognizer = YES;
3426 if (shouldReAddDelayingRecognizer) {
3428 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], forwardingRecognizer);
3429 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], delayingRecognizer);
3431 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3432 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3437 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3438 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3444 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3447 flutterPlatformViewsController,
3450 std::make_shared<fml::SyncSwitch>());
3454 [flutterPlatformViewsController
3456 withId:@"MockFlutterPlatformView"
3460 [flutterPlatformViewsController
3464 @"viewType" : @"MockFlutterPlatformView",
3465 @"gestureBlockingPolicy" : @"eager"
3472 XCTAssertNotNil(touchInterceptorView);
3474 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3475 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3476 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3483 XCTAssertEqual(touchInterceptorView.gestureRecognizers[0], delayingRecognizer);
3484 XCTAssertEqual(touchInterceptorView.gestureRecognizers[1], forwardingRecognizer);
3488 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForSimpleWebView {
3489 if (@available(iOS 26.0, *)) {
3490 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3496 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3499 flutterPlatformViewsController,
3502 std::make_shared<fml::SyncSwitch>());
3506 [flutterPlatformViewsController
3512 [flutterPlatformViewsController
3517 @"viewType" : @"MockWebView",
3518 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3526 XCTAssertNotNil(touchInterceptorView);
3540 root.gestureRecognizers = nil;
3541 for (UIView* subview in root.subviews) {
3542 [subview removeFromSuperview];
3546 [root addGestureRecognizer:normalRecognizer0];
3548 UIView* child1 = [[UIView alloc] init];
3549 [root addSubview:child1];
3551 [child1 addGestureRecognizer:normalRecognizer1];
3553 UIView* child2 = [[UIView alloc] init];
3554 [root addSubview:child2];
3556 [child2 addGestureRecognizer:normalRecognizer2];
3558 UIView* child2_1 = [[UIView alloc] init];
3559 [child2 addSubview:child2_1];
3561 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3563 UIView* child2_2 = [[UIView alloc] init];
3564 [child2 addSubview:child2_2];
3566 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3571 [root addGestureRecognizer:targetRecognizer0];
3575 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3579 NSArray* normalRecognizers = @[
3580 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3584 NSArray* targetRecognizers = @[ targetRecognizer0, targetRecognizer2_2 ];
3586 NSArray* expectedEmptyHistory = @[];
3587 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3590 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3593 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3599 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForMultipleWebViewInDifferentBranches {
3600 if (@available(iOS 26.0, *)) {
3601 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3607 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3610 flutterPlatformViewsController,
3613 std::make_shared<fml::SyncSwitch>());
3617 [flutterPlatformViewsController
3619 withId:@"MockWrapperWebView"
3623 [flutterPlatformViewsController
3628 @"viewType" : @"MockWrapperWebView",
3629 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3637 XCTAssertNotNil(touchInterceptorView);
3655 for (UIView* subview in root.subviews) {
3656 [subview removeFromSuperview];
3660 [root addGestureRecognizer:normalRecognizer0];
3662 UIView* child1 = [[UIView alloc] init];
3663 [root addSubview:child1];
3665 [child1 addGestureRecognizer:normalRecognizer1];
3667 UIView* child2 = [[WKWebView alloc] init];
3668 child2.gestureRecognizers = nil;
3669 for (UIView* subview in child2.subviews) {
3670 [subview removeFromSuperview];
3672 [root addSubview:child2];
3674 [child2 addGestureRecognizer:normalRecognizer2];
3676 UIView* child2_1 = [[UIView alloc] init];
3677 [child2 addSubview:child2_1];
3679 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3681 UIView* child2_2 = [[UIView alloc] init];
3682 [child2 addSubview:child2_2];
3684 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3686 UIView* child3 = [[UIView alloc] init];
3687 [root addSubview:child3];
3689 [child3 addGestureRecognizer:normalRecognizer3];
3691 UIView* child3_1 = [[WKWebView alloc] init];
3692 child3_1.gestureRecognizers = nil;
3693 for (UIView* subview in child3_1.subviews) {
3694 [subview removeFromSuperview];
3696 [child3 addSubview:child3_1];
3698 [child3_1 addGestureRecognizer:normalRecognizer3_1];
3700 UIView* child3_1_1 = [[UIView alloc] init];
3701 [child3_1 addSubview:child3_1_1];
3703 [child3_1_1 addGestureRecognizer:normalRecognizer3_1_1];
3705 UIView* child3_1_2 = [[UIView alloc] init];
3706 [child3_1 addSubview:child3_1_2];
3708 [child3_1_2 addGestureRecognizer:normalRecognizer3_1_2];
3714 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3718 [child3_1_2 addGestureRecognizer:targetRecognizer3_1_2];
3722 NSArray* normalRecognizers = @[
3723 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3724 normalRecognizer2_2, normalRecognizer3, normalRecognizer3_1, normalRecognizer3_1_1,
3725 normalRecognizer3_1_2
3727 NSArray* targetRecognizers = @[ targetRecognizer2_2, targetRecognizer3_1_2 ];
3729 NSArray* expectedEmptyHistory = @[];
3730 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3733 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3737 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3743 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldDisableAndReEnableTouchEventsGestureRecognizerForNestedMultipleWebView {
3744 if (@available(iOS 26.0, *)) {
3745 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3751 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3754 flutterPlatformViewsController,
3757 std::make_shared<fml::SyncSwitch>());
3761 [flutterPlatformViewsController
3767 [flutterPlatformViewsController
3772 @"viewType" : @"MockWebView",
3773 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
3781 XCTAssertNotNil(touchInterceptorView);
3801 root.gestureRecognizers = nil;
3802 for (UIView* subview in root.subviews) {
3803 [subview removeFromSuperview];
3807 [root addGestureRecognizer:normalRecognizer0];
3809 UIView* child1 = [[UIView alloc] init];
3810 [root addSubview:child1];
3812 [child1 addGestureRecognizer:normalRecognizer1];
3814 UIView* child2 = [[UIView alloc] init];
3815 [root addSubview:child2];
3817 [child2 addGestureRecognizer:normalRecognizer2];
3819 UIView* child2_1 = [[UIView alloc] init];
3820 [child2 addSubview:child2_1];
3822 [child2_1 addGestureRecognizer:normalRecognizer2_1];
3824 UIView* child2_2 = [[UIView alloc] init];
3825 [child2 addSubview:child2_2];
3827 [child2_2 addGestureRecognizer:normalRecognizer2_2];
3829 UIView* child3 = [[UIView alloc] init];
3830 [root addSubview:child3];
3832 [child3 addGestureRecognizer:normalRecognizer3];
3834 UIView* child3_1 = [[WKWebView alloc] init];
3835 child3_1.gestureRecognizers = nil;
3836 for (UIView* subview in child3_1.subviews) {
3837 [subview removeFromSuperview];
3839 [child3 addSubview:child3_1];
3841 [child3_1 addGestureRecognizer:normalRecognizer3_1];
3843 UIView* child3_1_1 = [[UIView alloc] init];
3844 [child3_1 addSubview:child3_1_1];
3846 [child3_1_1 addGestureRecognizer:normalRecognizer3_1_1];
3848 UIView* child3_1_2 = [[UIView alloc] init];
3849 [child3_1 addSubview:child3_1_2];
3851 [child3_1_2 addGestureRecognizer:normalRecognizer3_1_2];
3853 UIView* child3_1_2_1 = [[UIView alloc] init];
3854 [child3_1_2 addSubview:child3_1_2_1];
3856 [child3_1_2_1 addGestureRecognizer:normalRecognizer3_1_2_1];
3858 UIView* child3_1_2_2 = [[UIView alloc] init];
3859 [child3_1_2 addSubview:child3_1_2_2];
3861 [child3_1_2_2 addGestureRecognizer:normalRecognizer3_1_2_2];
3867 [child2_2 addGestureRecognizer:targetRecognizer2_2];
3871 [child3_1_2_2 addGestureRecognizer:targetRecognizer3_1_2_2];
3875 NSArray* normalRecognizers = @[
3876 normalRecognizer0, normalRecognizer1, normalRecognizer2, normalRecognizer2_1,
3877 normalRecognizer2_2, normalRecognizer3, normalRecognizer3_1, normalRecognizer3_1_1,
3878 normalRecognizer3_1_2, normalRecognizer3_1_2_1, normalRecognizer3_1_2_2
3881 NSArray* targetRecognizers = @[ targetRecognizer2_2, targetRecognizer3_1_2_2 ];
3883 NSArray* expectedEmptyHistory = @[];
3884 NSArray* expectedToggledHistory = @[ @NO, @YES ];
3887 XCTAssertEqualObjects(recognizer.toggleHistory, expectedEmptyHistory);
3891 XCTAssertEqualObjects(recognizer.toggleHistory, expectedToggledHistory);
3897 testFlutterPlatformViewGestureBlockingPolicy_ShouldNotAddDelayingRecognizerUnderDoNotBlockGesturePolicy {
3898 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3904 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3907 flutterPlatformViewsController,
3910 std::make_shared<fml::SyncSwitch>());
3915 withId:@"MockFlutterPlatformView"
3917 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
3920 [flutterPlatformViewsController
3925 @"viewType" : @"MockFlutterPlatformView",
3926 @"gestureBlockingPolicy" : @"doNotBlockGesture"
3933 XCTAssertNotNil(touchInterceptorView);
3935 XCTAssert(touchInterceptorView.gestureRecognizers.count == 1);
3936 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[0];
3940- (void)testFlutterPlatformViewGestureBlockingPolicy_ShouldAddDelayingRecognizerUnderEagerPolicy {
3941 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3947 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3950 flutterPlatformViewsController,
3953 std::make_shared<fml::SyncSwitch>());
3957 [flutterPlatformViewsController
3959 withId:@"MockFlutterPlatformView"
3963 [flutterPlatformViewsController
3967 @"viewType" : @"MockFlutterPlatformView",
3968 @"gestureBlockingPolicy" : @"eager"
3975 XCTAssertNotNil(touchInterceptorView);
3977 XCTAssert(touchInterceptorView.gestureRecognizers.count == 2);
3978 UIGestureRecognizer* delayingRecognizer = touchInterceptorView.gestureRecognizers[0];
3979 UIGestureRecognizer* forwardingRecognizer = touchInterceptorView.gestureRecognizers[1];
3984- (void)testFlutterPlatformViewHitTest_AcceptTouchIfInstructedByFramework {
3985 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3995 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3998 flutterPlatformViewsController,
4001 std::make_shared<fml::SyncSwitch>());
4006 withId:@"MockFlutterPlatformView"
4008 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
4011 [flutterPlatformViewsController
4016 @"viewType" : @"MockFlutterPlatformView",
4017 @"gestureBlockingPolicy" : @"doNotBlockGesture"
4024 XCTAssertNotNil(touchInterceptorView);
4026 touchInterceptorView.frame = CGRectMake(0, 0, 100, 100);
4027 CGPoint touchBeganLocation = CGPointMake(1, 1);
4029 UIEvent* mockEvent = OCMClassMock([UIEvent
class]);
4030 OCMStub([mockEvent
type]).andReturn(UIEventTypeTouches);
4033 OCMStub([mockFlutterViewController
4034 platformViewShouldAcceptTouchAtTouchBeganLocation:touchBeganLocation])
4036 UIView* hitTestResult = [touchInterceptorView hitTest:touchBeganLocation withEvent:mockEvent];
4041- (void)testFlutterPlatformViewHitTest_RejectTouchIfInstructedByFramework {
4042 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4052 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4055 flutterPlatformViewsController,
4058 std::make_shared<fml::SyncSwitch>());
4063 withId:@"MockFlutterPlatformView"
4065 FlutterPlatformViewGestureRecognizersBlockingPolicyDoNotBlockGesture];
4068 [flutterPlatformViewsController
4073 @"viewType" : @"MockFlutterPlatformView",
4074 @"gestureBlockingPolicy" : @"doNotBlockGesture"
4081 XCTAssertNotNil(touchInterceptorView);
4083 touchInterceptorView.frame = CGRectMake(0, 0, 100, 100);
4084 CGPoint touchBeganLocation = CGPointMake(1, 1);
4086 UIEvent* mockEvent = OCMClassMock([UIEvent
class]);
4087 OCMStub([mockEvent
type]).andReturn(UIEventTypeTouches);
4090 OCMStub([mockFlutterViewController
4091 platformViewShouldAcceptTouchAtTouchBeganLocation:touchBeganLocation])
4093 UIView* hitTestResult = [touchInterceptorView hitTest:touchBeganLocation withEvent:mockEvent];
4095 XCTAssert(hitTestResult == touchInterceptorView);
4098- (void)testFlutterPlatformViewGestureBlockingPolicy_PolicyMappingIsCorrect {
4099 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4109 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4112 flutterPlatformViewsController,
4115 std::make_shared<fml::SyncSwitch>());
4120 withId:@"MockFlutterPlatformView"
4124 FlutterPlatformViewGestureRecognizersBlockingPolicyWaitUntilTouchesEnded];
4125 __block
id methodResult;
4127 methodResult = result;
4131 [flutterPlatformViewsController
4135 @"viewType" : @"MockFlutterPlatformView",
4136 @"gestureBlockingPolicy" : @"eager"
4145 [flutterPlatformViewsController
4150 @"viewType" : @"MockFlutterPlatformView",
4151 @"gestureBlockingPolicy" : @"waitUntilTouchesEnded"
4158 [flutterPlatformViewsController
4163 @"viewType" : @"MockFlutterPlatformView",
4164 @"gestureBlockingPolicy" : @"doNotBlockGesture"
4170 XCTAssertNil(methodResult);
4173 [flutterPlatformViewsController
4178 @"viewType" : @"MockFlutterPlatformView",
4179 @"gestureBlockingPolicy" : @"fallbackToPluginDefault"
4185 XCTAssertNil(methodResult);
4188 [flutterPlatformViewsController
4192 @"viewType" : @"MockFlutterPlatformView",
4193 @"gestureBlockingPolicy" : @"unknownPolicy"
4196 XCTAssertTrue([methodResult isKindOfClass:[
FlutterError class]]);
4198 XCTAssertEqualObjects(resultError.code,
@"unknown_gesture_blocking_policy");
4199 XCTAssertEqualObjects(
4200 resultError.message,
4201 @"Trying to create a platform view with an unknown gesture blocking policy");
4202 XCTAssertEqualObjects(resultError.details,
@"view id: '6'");
4205- (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
4206 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4212 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4215 flutterPlatformViewsController,
4218 std::make_shared<fml::SyncSwitch>());
4222 [flutterPlatformViewsController
4224 withId:@"MockFlutterPlatformView"
4228 [flutterPlatformViewsController
4232 @"viewType" : @"MockFlutterPlatformView",
4233 @"gestureBlockingPolicy" : @"eager"
4243 auto embeddedViewParams_1 =
4244 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4246 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4247 withParams:std::move(embeddedViewParams_1)];
4248 [flutterPlatformViewsController
4253 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4254 nullptr, framebuffer_info,
4258 XCTAssertFalse([flutterPlatformViewsController
4260 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4262 auto embeddedViewParams_2 =
4263 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4264 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4265 withParams:std::move(embeddedViewParams_2)];
4266 [flutterPlatformViewsController
4270 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
4271 nullptr, framebuffer_info,
4275 XCTAssertTrue([flutterPlatformViewsController
4276 submitFrame:std::move(mock_surface_submit_true)
4277 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4281 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
4282 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4288 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4291 flutterPlatformViewsController,
4294 std::make_shared<fml::SyncSwitch>());
4296 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4297 flutterPlatformViewsController.
flutterView = flutterView;
4301 [flutterPlatformViewsController
4303 withId:@"MockFlutterPlatformView"
4309 [flutterPlatformViewsController
4313 @"viewType" : @"MockFlutterPlatformView",
4314 @"gestureBlockingPolicy" : @"eager"
4320 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4322 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4323 withParams:std::move(embeddedViewParams)];
4329 [flutterPlatformViewsController
reset];
4334- (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
4335 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4341 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4344 flutterPlatformViewsController,
4347 std::make_shared<fml::SyncSwitch>());
4349 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4350 flutterPlatformViewsController.
flutterView = flutterView;
4354 [flutterPlatformViewsController
4356 withId:@"MockFlutterPlatformView"
4361 [flutterPlatformViewsController
4365 @"viewType" : @"MockFlutterPlatformView",
4366 @"gestureBlockingPolicy" : @"eager"
4372 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4375 auto embeddedViewParams1 =
4376 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4377 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4378 withParams:std::move(embeddedViewParams1)];
4379 [flutterPlatformViewsController
4386 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4389 auto embeddedViewParams2 =
4390 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4391 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4392 withParams:std::move(embeddedViewParams2)];
4393 [flutterPlatformViewsController
4401 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
4402 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4408 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4411 flutterPlatformViewsController,
4414 std::make_shared<fml::SyncSwitch>());
4416 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4417 flutterPlatformViewsController.
flutterView = flutterView;
4421 [flutterPlatformViewsController
4423 withId:@"MockFlutterPlatformView"
4427 [flutterPlatformViewsController
4431 @"viewType" : @"MockFlutterPlatformView",
4432 @"gestureBlockingPolicy" : @"eager"
4438 [flutterPlatformViewsController
4442 @"viewType" : @"MockFlutterPlatformView",
4443 @"gestureBlockingPolicy" : @"eager"
4448 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4451 auto embeddedViewParams1 =
4452 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4453 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4454 withParams:std::move(embeddedViewParams1)];
4456 auto embeddedViewParams2 =
4457 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4458 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4459 withParams:std::move(embeddedViewParams2)];
4462 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4463 nullptr, framebuffer_info,
4467 XCTAssertTrue([flutterPlatformViewsController
4469 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4472 UIView* clippingView1 = view1.superview.superview;
4473 UIView* clippingView2 = view2.superview.superview;
4474 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4475 [flutterView.subviews indexOfObject:clippingView2],
4476 @"The first clipping view should be added before the second clipping view.");
4479 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4481 embeddedViewParams2 =
4482 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4483 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4484 withParams:std::move(embeddedViewParams2)];
4486 embeddedViewParams1 =
4487 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4488 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4489 withParams:std::move(embeddedViewParams1)];
4491 mock_surface = std::make_unique<flutter::SurfaceFrame>(
4492 nullptr, framebuffer_info,
4496 XCTAssertTrue([flutterPlatformViewsController
4498 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4500 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
4501 [flutterView.subviews indexOfObject:clippingView2],
4502 @"The first clipping view should be added after the second clipping view.");
4506 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
4507 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4513 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4516 flutterPlatformViewsController,
4519 std::make_shared<fml::SyncSwitch>());
4521 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4522 flutterPlatformViewsController.
flutterView = flutterView;
4526 [flutterPlatformViewsController
4528 withId:@"MockFlutterPlatformView"
4532 [flutterPlatformViewsController
4536 @"viewType" : @"MockFlutterPlatformView",
4537 @"gestureBlockingPolicy" : @"eager"
4543 [flutterPlatformViewsController
4547 @"viewType" : @"MockFlutterPlatformView",
4548 @"gestureBlockingPolicy" : @"eager"
4553 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4556 auto embeddedViewParams1 =
4557 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4558 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4559 withParams:std::move(embeddedViewParams1)];
4561 auto embeddedViewParams2 =
4562 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4563 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4564 withParams:std::move(embeddedViewParams2)];
4567 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4568 nullptr, framebuffer_info,
4572 XCTAssertTrue([flutterPlatformViewsController
4574 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4577 UIView* clippingView1 = view1.superview.superview;
4578 UIView* clippingView2 = view2.superview.superview;
4579 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4580 [flutterView.subviews indexOfObject:clippingView2],
4581 @"The first clipping view should be added before the second clipping view.");
4584 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4586 embeddedViewParams1 =
4587 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4588 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4589 withParams:std::move(embeddedViewParams1)];
4591 embeddedViewParams2 =
4592 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4593 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4594 withParams:std::move(embeddedViewParams2)];
4596 mock_surface = std::make_unique<flutter::SurfaceFrame>(
4597 nullptr, framebuffer_info,
4601 XCTAssertTrue([flutterPlatformViewsController
4603 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4605 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
4606 [flutterView.subviews indexOfObject:clippingView2],
4607 @"The first clipping view should be added before the second clipping view.");
4610- (int)alphaOfPoint:(CGPoint)point onView:(UIView*)
view {
4611 unsigned char pixel[4] = {0};
4613 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
4616 CGContextRef context =
4617 CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace,
4618 static_cast<uint32_t
>(kCGBitmapAlphaInfoMask) &
4619 static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast));
4620 CGContextTranslateCTM(context, -point.x, -point.y);
4621 [view.layer renderInContext:context];
4623 CGContextRelease(context);
4624 CGColorSpaceRelease(colorSpace);
4629- (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
4631 UIWindow*
window = [[UIWindow alloc] init];
4632 UITextField* textField = [[UITextField alloc] init];
4633 [window addSubview:textField];
4635 [textField becomeFirstResponder];
4636 XCTAssertTrue(textField.isFirstResponder);
4637 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
4638 [textField resignFirstResponder];
4639 XCTAssertFalse(textField.isFirstResponder);
4640 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
4643- (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
4645 UIWindow*
window = [[UIWindow alloc] init];
4646 UIView*
view = [[UIView alloc] init];
4647 UIView* childView = [[UIView alloc] init];
4648 UITextField* textField = [[UITextField alloc] init];
4649 [window addSubview:view];
4650 [view addSubview:childView];
4651 [childView addSubview:textField];
4653 [textField becomeFirstResponder];
4654 XCTAssertTrue(textField.isFirstResponder);
4655 XCTAssertTrue(
view.flt_hasFirstResponderInViewHierarchySubtree);
4656 [textField resignFirstResponder];
4657 XCTAssertFalse(textField.isFirstResponder);
4658 XCTAssertFalse(
view.flt_hasFirstResponderInViewHierarchySubtree);
4661- (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
4667 CGRect newRect = CGRectMake(0, 0, 10, 10);
4671 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
4672 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
4673 XCTAssertEqualObjects(set1, set2);
4674 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
4675 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
4678- (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
4683 XCTAssertNotEqual(view1, view3);
4684 XCTAssertNotEqual(view2, view3);
4687- (void)testMaskViewsReleasedWhenPoolIsReleased {
4688 __weak UIView* weakView;
4693 XCTAssertNotNil(weakView);
4695 XCTAssertNil(weakView);
4698- (void)testClipMaskViewIsReused {
4699 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4705 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4708 flutterPlatformViewsController,
4711 std::make_shared<fml::SyncSwitch>());
4715 [flutterPlatformViewsController
4717 withId:@"MockFlutterPlatformView"
4721 [flutterPlatformViewsController
4725 @"viewType" : @"MockFlutterPlatformView",
4726 @"gestureBlockingPolicy" : @"eager"
4731 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4732 flutterPlatformViewsController.
flutterView = flutterView;
4743 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4746 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4747 withParams:std::move(embeddedViewParams1)];
4748 [flutterPlatformViewsController
4753 UIView* maskView1 = childClippingView1.maskView;
4754 XCTAssertNotNil(maskView1);
4757 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(100, 100)];
4759 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4761 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
4763 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4764 withParams:std::move(embeddedViewParams3)];
4765 [flutterPlatformViewsController
4772 [flutterPlatformViewsController
4776 @"viewType" : @"MockFlutterPlatformView",
4777 @"gestureBlockingPolicy" : @"eager"
4781 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
4783 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4784 withParams:std::move(embeddedViewParams4)];
4785 [flutterPlatformViewsController
4791 UIView* maskView2 = childClippingView2.maskView;
4792 XCTAssertEqual(maskView1, maskView2);
4793 XCTAssertNotNil(childClippingView2.maskView);
4794 XCTAssertNil(childClippingView1.maskView);
4797- (void)testDifferentClipMaskViewIsUsedForEachView {
4798 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4804 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4807 flutterPlatformViewsController,
4810 std::make_shared<fml::SyncSwitch>());
4814 [flutterPlatformViewsController
4816 withId:@"MockFlutterPlatformView"
4821 [flutterPlatformViewsController
4825 @"viewType" : @"MockFlutterPlatformView",
4826 @"gestureBlockingPolicy" : @"eager"
4832 [flutterPlatformViewsController
4836 @"viewType" : @"MockFlutterPlatformView",
4837 @"gestureBlockingPolicy" : @"eager"
4843 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4844 flutterPlatformViewsController.
flutterView = flutterView;
4855 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4860 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4863 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4864 withParams:std::move(embeddedViewParams1)];
4865 [flutterPlatformViewsController
4869 UIView* childClippingView1 = view1.superview.superview;
4871 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4872 withParams:std::move(embeddedViewParams2)];
4873 [flutterPlatformViewsController
4877 UIView* childClippingView2 = view2.superview.superview;
4878 UIView* maskView1 = childClippingView1.maskView;
4879 UIView* maskView2 = childClippingView2.maskView;
4880 XCTAssertNotEqual(maskView1, maskView2);
4883- (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4884 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4890 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4893 flutterPlatformViewsController,
4896 std::make_shared<fml::SyncSwitch>());
4900 [flutterPlatformViewsController
4902 withId:@"MockFlutterPlatformView"
4907 [flutterPlatformViewsController
4911 @"viewType" : @"MockFlutterPlatformView",
4912 @"gestureBlockingPolicy" : @"eager"
4917 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4918 flutterPlatformViewsController.
flutterView = flutterView;
4929 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4934 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4937 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4938 withParams:std::move(embeddedViewParams1)];
4939 [flutterPlatformViewsController
4945 UIView* maskView = childClippingView.maskView;
4946 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer class]],
4947 @"Mask view must use CAShapeLayer as its backing layer.");
4955- (
BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4956 expectedFrame:(CGRect)frame
4957 inputRadius:(CGFloat)inputRadius {
4958 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4959 for (UIView*
view in visualEffectView.subviews) {
4960 if (![NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
4963 XCTAssertEqual(
view.layer.filters.count, 1u);
4964 NSObject* filter =
view.layer.filters.firstObject;
4966 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4968 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4969 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber class]] &&
4970 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4977- (void)testDisposingViewInCompositionOrderDoNotCrash {
4978 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4984 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4987 flutterPlatformViewsController,
4990 std::make_shared<fml::SyncSwitch>());
4992 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4993 flutterPlatformViewsController.
flutterView = flutterView;
4997 [flutterPlatformViewsController
4999 withId:@"MockFlutterPlatformView"
5004 [flutterPlatformViewsController
5008 @"viewType" : @"MockFlutterPlatformView",
5009 @"gestureBlockingPolicy" : @"eager"
5012 [flutterPlatformViewsController
5016 @"viewType" : @"MockFlutterPlatformView",
5017 @"gestureBlockingPolicy" : @"eager"
5024 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
5027 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
5029 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
5030 withParams:std::move(embeddedViewParams0)];
5032 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
5034 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
5035 withParams:std::move(embeddedViewParams1)];
5039 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
5041 [expectation fulfill];
5044 [flutterPlatformViewsController
5047 [
self waitForExpectationsWithTimeout:30 handler:nil];
5050 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5051 nullptr, framebuffer_info,
5056 XCTAssertTrue([flutterPlatformViewsController
5058 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
5062 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
5063 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
5069 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
5072 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
5074 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
5075 withParams:std::move(embeddedViewParams1)];
5078 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5079 nullptr, framebuffer_info,
5083 XCTAssertTrue([flutterPlatformViewsController
5085 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
5089 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
5090 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
5093- (void)testOnlyPlatformViewsAreRemovedWhenReset {
5094 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5100 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5103 flutterPlatformViewsController,
5106 std::make_shared<fml::SyncSwitch>());
5110 [flutterPlatformViewsController
5112 withId:@"MockFlutterPlatformView"
5116 [flutterPlatformViewsController
5120 @"viewType" : @"MockFlutterPlatformView",
5121 @"gestureBlockingPolicy" : @"eager"
5124 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5125 flutterPlatformViewsController.
flutterView = flutterView;
5137 auto embeddedViewParams =
5138 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5140 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5141 withParams:std::move(embeddedViewParams)];
5144 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5145 nullptr, framebuffer_info,
5149 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5150 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5152 UIView* someView = [[UIView alloc] init];
5153 [flutterView addSubview:someView];
5155 [flutterPlatformViewsController
reset];
5156 XCTAssertEqual(flutterView.subviews.count, 1u);
5157 XCTAssertEqual(flutterView.subviews.firstObject, someView);
5160- (void)testResetClearsPreviousCompositionOrder {
5161 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5167 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5170 flutterPlatformViewsController,
5173 std::make_shared<fml::SyncSwitch>());
5177 [flutterPlatformViewsController
5179 withId:@"MockFlutterPlatformView"
5183 [flutterPlatformViewsController
5187 @"viewType" : @"MockFlutterPlatformView",
5188 @"gestureBlockingPolicy" : @"eager"
5191 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5192 flutterPlatformViewsController.
flutterView = flutterView;
5204 auto embeddedViewParams =
5205 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5207 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5208 withParams:std::move(embeddedViewParams)];
5211 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5212 nullptr, framebuffer_info,
5216 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5217 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5223 [flutterPlatformViewsController
reset];
5229- (void)testNilPlatformViewDoesntCrash {
5230 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5236 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5239 flutterPlatformViewsController,
5242 std::make_shared<fml::SyncSwitch>());
5246 [flutterPlatformViewsController
5248 withId:@"MockFlutterPlatformView"
5252 [flutterPlatformViewsController
5256 @"viewType" : @"MockFlutterPlatformView",
5257 @"gestureBlockingPolicy" : @"eager"
5260 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5261 flutterPlatformViewsController.
flutterView = flutterView;
5274 auto embeddedViewParams =
5275 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5277 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5278 withParams:std::move(embeddedViewParams)];
5281 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5282 nullptr, framebuffer_info,
5286 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5287 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5289 XCTAssertEqual(flutterView.subviews.count, 1u);
5292- (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
5294 NSObject* container = [[NSObject alloc] init];
5295 [touchInterceptorView setFlutterAccessibilityContainer:container];
5296 XCTAssertEqualObjects([touchInterceptorView accessibilityContainer], container);
5299- (void)testLayerPool {
5309 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
5310 XCTAssertEqual(pool.size(), 1u);
5311 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
5312 XCTAssertEqual(pool.size(), 2u);
5315 pool.RecycleLayers();
5316 XCTAssertEqual(pool.size(), 2u);
5319 auto unused_layers = pool.RemoveUnusedLayers();
5320 XCTAssertEqual(unused_layers.size(), 2u);
5321 XCTAssertEqual(pool.size(), 1u);
5324- (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
5325 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5331 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5334 flutterPlatformViewsController,
5337 std::make_shared<fml::SyncSwitch>());
5339 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
5340 flutterPlatformViewsController.
flutterView = flutterView;
5344 [flutterPlatformViewsController
5346 withId:@"MockFlutterPlatformView"
5350 [flutterPlatformViewsController
5354 @"viewType" : @"MockFlutterPlatformView",
5355 @"gestureBlockingPolicy" : @"eager"
5360 [flutterPlatformViewsController
5364 @"viewType" : @"MockFlutterPlatformView",
5365 @"gestureBlockingPolicy" : @"eager"
5369 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
5372 auto embeddedViewParams1 =
5373 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
5374 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
5375 withParams:std::move(embeddedViewParams1)];
5377 auto embeddedViewParams2 =
5378 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
5379 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
5380 withParams:std::move(embeddedViewParams2)];
5383 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
5384 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
5385 nullptr, framebuffer_info,
5398 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
5399 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
5401 XCTAssertTrue(submit_info.has_value());
5406- (void)testClipSuperellipse {
5407 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
5413 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
5416 flutterPlatformViewsController,
5419 std::make_shared<fml::SyncSwitch>());
5423 [flutterPlatformViewsController
5425 withId:@"MockFlutterPlatformView"
5429 [flutterPlatformViewsController
5433 @"viewType" : @"MockFlutterPlatformView",
5434 @"gestureBlockingPolicy" : @"eager"
5440 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
5441 flutterPlatformViewsController.
flutterView = flutterView;
5452 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
5455 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
5456 withParams:std::move(embeddedViewParams)];
5457 [flutterPlatformViewsController
5464 [flutterView addSubview:childClippingView];
5466 [flutterView setNeedsLayout];
5467 [flutterView layoutIfNeeded];
5469 CGPoint corners[] = {CGPointMake(rect.
GetLeft(), rect.
GetTop()),
5473 for (
auto point : corners) {
5474 int alpha = [
self alphaOfPoint:point onView:flutterView];
5475 XCTAssertNotEqual(alpha, 255);
5479 int alpha = [
self alphaOfPoint:center onView:flutterView];
5480 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
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|.