7#import <OCMock/OCMock.h>
9#import <WebKit/WebKit.h>
10#import <XCTest/XCTest.h>
51@property(nonatomic, strong) UIView*
view;
52@property(nonatomic, assign)
BOOL viewCreated;
58 if (
self = [super init]) {
66 [
self checkViewCreatedOnce];
70- (void)checkViewCreatedOnce {
71 if (
self.viewCreated) {
74 self.viewCreated = YES;
83 : NSObject <FlutterPlatformViewFactory>
88 viewIdentifier:(int64_t)viewId
89 arguments:(
id _Nullable)args {
96@property(nonatomic, strong) UIView*
view;
97@property(nonatomic, assign)
BOOL viewCreated;
101- (instancetype)init {
102 if (
self = [super init]) {
103 _view = [[WKWebView alloc] init];
111 [
self checkViewCreatedOnce];
115- (void)checkViewCreatedOnce {
116 if (
self.viewCreated) {
119 self.viewCreated = YES;
131- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
132 viewIdentifier:(int64_t)viewId
133 arguments:(
id _Nullable)
args {
142- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
143 viewIdentifier:(int64_t)viewId
144 arguments:(
id _Nullable)
args {
151@property(nonatomic, strong) UIView*
view;
152@property(nonatomic, assign)
BOOL viewCreated;
156- (instancetype)init {
157 if (
self = [super init]) {
158 _view = [[UIView alloc] init];
159 [_view addSubview:[[WKWebView alloc] init]];
167 [
self checkViewCreatedOnce];
171- (void)checkViewCreatedOnce {
172 if (
self.viewCreated) {
175 self.viewCreated = YES;
187- (NSObject<FlutterPlatformView>*)createWithFrame:(CGRect)frame
188 viewIdentifier:(int64_t)viewId
189 arguments:(
id _Nullable)
args {
195@property(nonatomic, strong) UIView*
view;
196@property(nonatomic, assign)
BOOL viewCreated;
200- (instancetype)init {
201 if (
self = [super init]) {
202 _view = [[UIView alloc] init];
203 UIView* childView = [[UIView alloc] init];
204 [_view addSubview:childView];
205 [childView addSubview:[[WKWebView alloc] init]];
213 [
self checkViewCreatedOnce];
217- (void)checkViewCreatedOnce {
218 if (
self.viewCreated) {
221 self.viewCreated = YES;
226 : NSObject <FlutterPlatformViewFactory>
231 viewIdentifier:(int64_t)viewId
232 arguments:(
id _Nullable)args {
239class FlutterPlatformViewsTestMockPlatformViewDelegate :
public PlatformView::Delegate {
241 void OnPlatformViewCreated(std::unique_ptr<Surface> surface)
override {}
242 void OnPlatformViewDestroyed()
override {}
243 void OnPlatformViewScheduleFrame()
override {}
244 void OnPlatformViewAddView(int64_t
view_id,
245 const ViewportMetrics& viewport_metrics,
246 AddViewCallback
callback)
override {}
247 void OnPlatformViewRemoveView(int64_t
view_id, RemoveViewCallback
callback)
override {}
248 void OnPlatformViewSendViewFocusEvent(
const ViewFocusEvent& event)
override {};
249 void OnPlatformViewSetNextFrameCallback(
const fml::closure& closure)
override {}
250 void OnPlatformViewSetViewportMetrics(int64_t
view_id,
const ViewportMetrics& metrics)
override {}
252 void OnPlatformViewDispatchPlatformMessage(std::unique_ptr<PlatformMessage>
message)
override {}
253 void OnPlatformViewDispatchPointerDataPacket(std::unique_ptr<PointerDataPacket> packet)
override {
255 void OnPlatformViewDispatchSemanticsAction(int64_t
view_id,
259 void OnPlatformViewSetSemanticsEnabled(
bool enabled)
override {}
260 void OnPlatformViewSetAccessibilityFeatures(int32_t flags)
override {}
261 void OnPlatformViewRegisterTexture(std::shared_ptr<Texture>
texture)
override {}
262 void OnPlatformViewUnregisterTexture(int64_t
texture_id)
override {}
263 void OnPlatformViewMarkTextureFrameAvailable(int64_t
texture_id)
override {}
265 void LoadDartDeferredLibrary(intptr_t loading_unit_id,
266 std::unique_ptr<const fml::Mapping> snapshot_data,
267 std::unique_ptr<const fml::Mapping> snapshot_instructions)
override {
269 void LoadDartDeferredLibraryError(intptr_t loading_unit_id,
270 const std::string error_message,
271 bool transient)
override {}
272 void UpdateAssetResolverByType(std::unique_ptr<flutter::AssetResolver> updated_asset_resolver,
278BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2) {
279 const CGFloat epsilon = 0.01;
280 return std::abs(radius1 - radius2) < epsilon;
298- (void)testFlutterViewOnlyCreateOnceInOneFrame {
299 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
302 GetDefaultTaskRunner(),
303 GetDefaultTaskRunner(),
304 GetDefaultTaskRunner(),
305 GetDefaultTaskRunner());
308 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
309 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
312 flutterPlatformViewsController,
315 std::make_shared<fml::SyncSwitch>());
319 [flutterPlatformViewsController
321 withId:@"MockFlutterPlatformView"
325 [flutterPlatformViewsController
329 @"viewType" : @"MockFlutterPlatformView"
332 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
333 flutterPlatformViewsController.
flutterView = flutterView;
345 auto embeddedViewParams =
346 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
348 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
349 withParams:std::move(embeddedViewParams)];
353 [flutterPlatformViewsController
reset];
356- (void)testCanCreatePlatformViewWithoutFlutterView {
357 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
360 GetDefaultTaskRunner(),
361 GetDefaultTaskRunner(),
362 GetDefaultTaskRunner(),
363 GetDefaultTaskRunner());
366 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
367 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
370 flutterPlatformViewsController,
373 std::make_shared<fml::SyncSwitch>());
377 [flutterPlatformViewsController
379 withId:@"MockFlutterPlatformView"
383 [flutterPlatformViewsController
387 @"viewType" : @"MockFlutterPlatformView"
394- (void)testChildClippingViewHitTests {
397 UIView* childView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
398 [childClippingView addSubview:childView];
400 XCTAssertFalse([childClippingView pointInside:CGPointMake(50, 50) withEvent:nil]);
401 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 100) withEvent:nil]);
402 XCTAssertFalse([childClippingView pointInside:CGPointMake(100, 99) withEvent:nil]);
403 XCTAssertFalse([childClippingView pointInside:CGPointMake(201, 200) withEvent:nil]);
404 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 201) withEvent:nil]);
405 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 200) withEvent:nil]);
406 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 299) withEvent:nil]);
408 XCTAssertTrue([childClippingView pointInside:CGPointMake(150, 150) withEvent:nil]);
409 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 100) withEvent:nil]);
410 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 100) withEvent:nil]);
411 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 199) withEvent:nil]);
412 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 199) withEvent:nil]);
415- (void)testReleasesBackdropFilterSubviewsOnChildClippingViewDealloc {
416 __weak NSMutableArray<UIVisualEffectView*>* weakBackdropFilterSubviews = nil;
417 __weak UIVisualEffectView* weakVisualEffectView1 = nil;
418 __weak UIVisualEffectView* weakVisualEffectView2 = nil;
422 UIVisualEffectView* visualEffectView1 = [[UIVisualEffectView alloc]
423 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
424 weakVisualEffectView1 = visualEffectView1;
428 visualEffectView:visualEffectView1];
433 UIVisualEffectView* visualEffectView2 = [[UIVisualEffectView alloc]
434 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark]];
435 weakVisualEffectView2 = visualEffectView2;
439 visualEffectView:visualEffectView2];
443 XCTAssertNotNil(weakBackdropFilterSubviews);
446 XCTAssertNil(weakBackdropFilterSubviews);
447 XCTAssertNil(weakVisualEffectView1);
448 XCTAssertNil(weakVisualEffectView2);
451- (void)testApplyBackdropFilter {
452 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
455 GetDefaultTaskRunner(),
456 GetDefaultTaskRunner(),
457 GetDefaultTaskRunner(),
458 GetDefaultTaskRunner());
461 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
462 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
465 flutterPlatformViewsController,
468 std::make_shared<fml::SyncSwitch>());
472 [flutterPlatformViewsController
474 withId:@"MockFlutterPlatformView"
478 [flutterPlatformViewsController
482 @"viewType" : @"MockFlutterPlatformView"
488 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
489 flutterPlatformViewsController.
flutterView = flutterView;
501 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
504 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
505 withParams:std::move(embeddedViewParams)];
506 [flutterPlatformViewsController
512 [flutterView addSubview:childClippingView];
514 [flutterView setNeedsLayout];
515 [flutterView layoutIfNeeded];
518 NSUInteger numberOfExpectedVisualEffectView = 0;
519 for (UIView* subview in childClippingView.subviews) {
520 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
523 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
524 if ([
self validateOneVisualEffectView:subview
525 expectedFrame:CGRectMake(0, 0, 10, 10)
527 numberOfExpectedVisualEffectView++;
530 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
533- (void)testApplyBackdropFilterWithCorrectFrame {
534 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
537 GetDefaultTaskRunner(),
538 GetDefaultTaskRunner(),
539 GetDefaultTaskRunner(),
540 GetDefaultTaskRunner());
543 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
544 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
547 flutterPlatformViewsController,
550 std::make_shared<fml::SyncSwitch>());
554 [flutterPlatformViewsController
556 withId:@"MockFlutterPlatformView"
560 [flutterPlatformViewsController
564 @"viewType" : @"MockFlutterPlatformView"
570 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
571 flutterPlatformViewsController.
flutterView = flutterView;
583 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
586 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
587 withParams:std::move(embeddedViewParams)];
588 [flutterPlatformViewsController
594 [flutterView addSubview:childClippingView];
596 [flutterView setNeedsLayout];
597 [flutterView layoutIfNeeded];
600 NSUInteger numberOfExpectedVisualEffectView = 0;
601 for (UIView* subview in childClippingView.subviews) {
602 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
605 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
606 if ([
self validateOneVisualEffectView:subview
607 expectedFrame:CGRectMake(0, 0, 5, 8)
609 numberOfExpectedVisualEffectView++;
612 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
615- (void)testApplyMultipleBackdropFilters {
616 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
619 GetDefaultTaskRunner(),
620 GetDefaultTaskRunner(),
621 GetDefaultTaskRunner(),
622 GetDefaultTaskRunner());
625 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
626 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
629 flutterPlatformViewsController,
632 std::make_shared<fml::SyncSwitch>());
636 [flutterPlatformViewsController
638 withId:@"MockFlutterPlatformView"
642 [flutterPlatformViewsController
646 @"viewType" : @"MockFlutterPlatformView"
652 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
653 flutterPlatformViewsController.
flutterView = flutterView;
661 for (
int i = 0;
i < 50;
i++) {
667 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
670 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
671 withParams:std::move(embeddedViewParams)];
672 [flutterPlatformViewsController
678 [flutterView addSubview:childClippingView];
680 [flutterView setNeedsLayout];
681 [flutterView layoutIfNeeded];
683 NSUInteger numberOfExpectedVisualEffectView = 0;
684 for (UIView* subview in childClippingView.subviews) {
685 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
688 XCTAssertLessThan(numberOfExpectedVisualEffectView, 50u);
689 if ([
self validateOneVisualEffectView:subview
690 expectedFrame:CGRectMake(0, 0, 10, 10)
691 inputRadius:(CGFloat)numberOfExpectedVisualEffectView]) {
692 numberOfExpectedVisualEffectView++;
695 XCTAssertEqual(numberOfExpectedVisualEffectView, (NSUInteger)numberOfExpectedVisualEffectView);
698- (void)testAddBackdropFilters {
699 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
702 GetDefaultTaskRunner(),
703 GetDefaultTaskRunner(),
704 GetDefaultTaskRunner(),
705 GetDefaultTaskRunner());
708 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
709 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
712 flutterPlatformViewsController,
715 std::make_shared<fml::SyncSwitch>());
719 [flutterPlatformViewsController
721 withId:@"MockFlutterPlatformView"
725 [flutterPlatformViewsController
729 @"viewType" : @"MockFlutterPlatformView"
735 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
736 flutterPlatformViewsController.
flutterView = flutterView;
748 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
751 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
752 withParams:std::move(embeddedViewParams)];
753 [flutterPlatformViewsController
759 [flutterView addSubview:childClippingView];
761 [flutterView setNeedsLayout];
762 [flutterView layoutIfNeeded];
764 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
765 for (UIView* subview in childClippingView.subviews) {
766 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
769 XCTAssertLessThan(originalVisualEffectViews.count, 1u);
770 if ([
self validateOneVisualEffectView:subview
771 expectedFrame:CGRectMake(0, 0, 10, 10)
772 inputRadius:(CGFloat)5]) {
773 [originalVisualEffectViews addObject:subview];
776 XCTAssertEqual(originalVisualEffectViews.count, 1u);
785 for (
int i = 0;
i < 2;
i++) {
790 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
793 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
794 withParams:std::move(embeddedViewParams)];
795 [flutterPlatformViewsController
799 [flutterView setNeedsLayout];
800 [flutterView layoutIfNeeded];
802 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
803 for (UIView* subview in childClippingView.subviews) {
804 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
807 XCTAssertLessThan(newVisualEffectViews.count, 2u);
809 if ([
self validateOneVisualEffectView:subview
810 expectedFrame:CGRectMake(0, 0, 10, 10)
811 inputRadius:(CGFloat)5]) {
812 [newVisualEffectViews addObject:subview];
815 XCTAssertEqual(newVisualEffectViews.count, 2u);
816 for (NSUInteger
i = 0;
i < originalVisualEffectViews.count;
i++) {
817 UIView* originalView = originalVisualEffectViews[i];
818 UIView* newView = newVisualEffectViews[i];
820 XCTAssertEqual(originalView, newView);
821 id mockOrignalView = OCMPartialMock(originalView);
822 OCMReject([mockOrignalView removeFromSuperview]);
823 [mockOrignalView stopMocking];
827- (void)testRemoveBackdropFilters {
828 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
831 GetDefaultTaskRunner(),
832 GetDefaultTaskRunner(),
833 GetDefaultTaskRunner(),
834 GetDefaultTaskRunner());
837 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
838 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
841 flutterPlatformViewsController,
844 std::make_shared<fml::SyncSwitch>());
848 [flutterPlatformViewsController
850 withId:@"MockFlutterPlatformView"
854 [flutterPlatformViewsController
858 @"viewType" : @"MockFlutterPlatformView"
864 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
865 flutterPlatformViewsController.
flutterView = flutterView;
874 for (
int i = 0;
i < 5;
i++) {
879 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
882 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
883 withParams:std::move(embeddedViewParams)];
884 [flutterPlatformViewsController
890 [flutterView addSubview:childClippingView];
892 [flutterView setNeedsLayout];
893 [flutterView layoutIfNeeded];
895 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
896 for (UIView* subview in childClippingView.subviews) {
897 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
900 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
901 if ([
self validateOneVisualEffectView:subview
902 expectedFrame:CGRectMake(0, 0, 10, 10)
903 inputRadius:(CGFloat)5]) {
904 [originalVisualEffectViews addObject:subview];
914 for (
int i = 0;
i < 4;
i++) {
919 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
922 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
923 withParams:std::move(embeddedViewParams)];
924 [flutterPlatformViewsController
928 [flutterView setNeedsLayout];
929 [flutterView layoutIfNeeded];
931 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
932 for (UIView* subview in childClippingView.subviews) {
933 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
936 XCTAssertLessThan(newVisualEffectViews.count, 4u);
937 if ([
self validateOneVisualEffectView:subview
938 expectedFrame:CGRectMake(0, 0, 10, 10)
939 inputRadius:(CGFloat)5]) {
940 [newVisualEffectViews addObject:subview];
943 XCTAssertEqual(newVisualEffectViews.count, 4u);
945 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
946 UIView* newView = newVisualEffectViews[i];
947 id mockNewView = OCMPartialMock(newView);
948 UIView* originalView = originalVisualEffectViews[i];
950 XCTAssertEqual(originalView, newView);
951 OCMReject([mockNewView removeFromSuperview]);
952 [mockNewView stopMocking];
957 for (
int i = 0;
i < 5;
i++) {
962 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
965 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
966 withParams:std::move(embeddedViewParams)];
967 [flutterPlatformViewsController
971 [flutterView setNeedsLayout];
972 [flutterView layoutIfNeeded];
974 NSUInteger numberOfExpectedVisualEffectView = 0u;
975 for (UIView* subview in childClippingView.subviews) {
976 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
977 numberOfExpectedVisualEffectView++;
980 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
983- (void)testEditBackdropFilters {
984 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
987 GetDefaultTaskRunner(),
988 GetDefaultTaskRunner(),
989 GetDefaultTaskRunner(),
990 GetDefaultTaskRunner());
993 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
994 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
997 flutterPlatformViewsController,
1000 std::make_shared<fml::SyncSwitch>());
1004 [flutterPlatformViewsController
1006 withId:@"MockFlutterPlatformView"
1010 [flutterPlatformViewsController
1014 @"viewType" : @"MockFlutterPlatformView"
1020 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1021 flutterPlatformViewsController.
flutterView = flutterView;
1030 for (
int i = 0;
i < 5;
i++) {
1035 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1038 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1039 withParams:std::move(embeddedViewParams)];
1040 [flutterPlatformViewsController
1046 [flutterView addSubview:childClippingView];
1048 [flutterView setNeedsLayout];
1049 [flutterView layoutIfNeeded];
1051 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
1052 for (UIView* subview in childClippingView.subviews) {
1053 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1056 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
1057 if ([
self validateOneVisualEffectView:subview
1058 expectedFrame:CGRectMake(0, 0, 10, 10)
1059 inputRadius:(CGFloat)5]) {
1060 [originalVisualEffectViews addObject:subview];
1070 for (
int i = 0;
i < 5;
i++) {
1083 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1086 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1087 withParams:std::move(embeddedViewParams)];
1088 [flutterPlatformViewsController
1092 [flutterView setNeedsLayout];
1093 [flutterView layoutIfNeeded];
1095 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
1096 for (UIView* subview in childClippingView.subviews) {
1097 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1100 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1101 CGFloat expectInputRadius = 5;
1102 if (newVisualEffectViews.count == 3) {
1103 expectInputRadius = 2;
1105 if ([
self validateOneVisualEffectView:subview
1106 expectedFrame:CGRectMake(0, 0, 10, 10)
1107 inputRadius:expectInputRadius]) {
1108 [newVisualEffectViews addObject:subview];
1111 XCTAssertEqual(newVisualEffectViews.count, 5u);
1112 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1113 UIView* newView = newVisualEffectViews[i];
1114 id mockNewView = OCMPartialMock(newView);
1115 UIView* originalView = originalVisualEffectViews[i];
1117 XCTAssertEqual(originalView, newView);
1118 OCMReject([mockNewView removeFromSuperview]);
1119 [mockNewView stopMocking];
1121 [newVisualEffectViews removeAllObjects];
1125 for (
int i = 0;
i < 5;
i++) {
1129 for (
int i = 0;
i < 5;
i++) {
1141 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1144 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1145 withParams:std::move(embeddedViewParams)];
1146 [flutterPlatformViewsController
1150 [flutterView setNeedsLayout];
1151 [flutterView layoutIfNeeded];
1153 for (UIView* subview in childClippingView.subviews) {
1154 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1157 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1158 CGFloat expectInputRadius = 5;
1159 if (newVisualEffectViews.count == 0) {
1160 expectInputRadius = 2;
1162 if ([
self validateOneVisualEffectView:subview
1163 expectedFrame:CGRectMake(0, 0, 10, 10)
1164 inputRadius:expectInputRadius]) {
1165 [newVisualEffectViews addObject:subview];
1168 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1169 UIView* newView = newVisualEffectViews[i];
1170 id mockNewView = OCMPartialMock(newView);
1171 UIView* originalView = originalVisualEffectViews[i];
1173 XCTAssertEqual(originalView, newView);
1174 OCMReject([mockNewView removeFromSuperview]);
1175 [mockNewView stopMocking];
1177 [newVisualEffectViews removeAllObjects];
1181 for (
int i = 0;
i < 5;
i++) {
1185 for (
int i = 0;
i < 5;
i++) {
1197 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1200 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1201 withParams:std::move(embeddedViewParams)];
1202 [flutterPlatformViewsController
1206 [flutterView setNeedsLayout];
1207 [flutterView layoutIfNeeded];
1209 for (UIView* subview in childClippingView.subviews) {
1210 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1213 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1214 CGFloat expectInputRadius = 5;
1215 if (newVisualEffectViews.count == 4) {
1216 expectInputRadius = 2;
1218 if ([
self validateOneVisualEffectView:subview
1219 expectedFrame:CGRectMake(0, 0, 10, 10)
1220 inputRadius:expectInputRadius]) {
1221 [newVisualEffectViews addObject:subview];
1224 XCTAssertEqual(newVisualEffectViews.count, 5u);
1226 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1227 UIView* newView = newVisualEffectViews[i];
1228 id mockNewView = OCMPartialMock(newView);
1229 UIView* originalView = originalVisualEffectViews[i];
1231 XCTAssertEqual(originalView, newView);
1232 OCMReject([mockNewView removeFromSuperview]);
1233 [mockNewView stopMocking];
1235 [newVisualEffectViews removeAllObjects];
1239 for (
int i = 0;
i < 5;
i++) {
1243 for (
int i = 0;
i < 5;
i++) {
1250 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1253 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1254 withParams:std::move(embeddedViewParams)];
1255 [flutterPlatformViewsController
1259 [flutterView setNeedsLayout];
1260 [flutterView layoutIfNeeded];
1262 for (UIView* subview in childClippingView.subviews) {
1263 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1266 XCTAssertLessThan(newVisualEffectViews.count, 5u);
1267 if ([
self validateOneVisualEffectView:subview
1268 expectedFrame:CGRectMake(0, 0, 10, 10)
1269 inputRadius:(CGFloat)newVisualEffectViews.count]) {
1270 [newVisualEffectViews addObject:subview];
1273 XCTAssertEqual(newVisualEffectViews.count, 5u);
1275 for (NSUInteger
i = 0;
i < newVisualEffectViews.count;
i++) {
1276 UIView* newView = newVisualEffectViews[i];
1277 id mockNewView = OCMPartialMock(newView);
1278 UIView* originalView = originalVisualEffectViews[i];
1280 XCTAssertEqual(originalView, newView);
1281 OCMReject([mockNewView removeFromSuperview]);
1282 [mockNewView stopMocking];
1284 [newVisualEffectViews removeAllObjects];
1287- (void)testApplyBackdropFilterNotDlBlurImageFilter {
1288 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1291 GetDefaultTaskRunner(),
1292 GetDefaultTaskRunner(),
1293 GetDefaultTaskRunner(),
1294 GetDefaultTaskRunner());
1297 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1298 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1301 flutterPlatformViewsController,
1304 std::make_shared<fml::SyncSwitch>());
1308 [flutterPlatformViewsController
1310 withId:@"MockFlutterPlatformView"
1314 [flutterPlatformViewsController
1318 @"viewType" : @"MockFlutterPlatformView"
1324 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1325 flutterPlatformViewsController.
flutterView = flutterView;
1336 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1339 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1340 withParams:std::move(embeddedViewParams)];
1341 [flutterPlatformViewsController
1348 [flutterView addSubview:childClippingView];
1350 [flutterView setNeedsLayout];
1351 [flutterView layoutIfNeeded];
1353 NSUInteger numberOfExpectedVisualEffectView = 0;
1354 for (UIView* subview in childClippingView.subviews) {
1355 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1356 numberOfExpectedVisualEffectView++;
1359 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1369 for (
int i = 0;
i < 5;
i++) {
1380 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1383 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1384 withParams:std::move(embeddedViewParams)];
1385 [flutterPlatformViewsController
1389 [flutterView setNeedsLayout];
1390 [flutterView layoutIfNeeded];
1392 numberOfExpectedVisualEffectView = 0;
1393 for (UIView* subview in childClippingView.subviews) {
1394 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1397 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1398 if ([
self validateOneVisualEffectView:subview
1399 expectedFrame:CGRectMake(0, 0, 10, 10)
1400 inputRadius:(CGFloat)5]) {
1401 numberOfExpectedVisualEffectView++;
1404 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1408 for (
int i = 0;
i < 5;
i++) {
1412 for (
int i = 0;
i < 5;
i++) {
1423 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1426 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1427 withParams:std::move(embeddedViewParams)];
1428 [flutterPlatformViewsController
1432 [flutterView setNeedsLayout];
1433 [flutterView layoutIfNeeded];
1435 numberOfExpectedVisualEffectView = 0;
1436 for (UIView* subview in childClippingView.subviews) {
1437 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1440 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1441 if ([
self validateOneVisualEffectView:subview
1442 expectedFrame:CGRectMake(0, 0, 10, 10)
1443 inputRadius:(CGFloat)5]) {
1444 numberOfExpectedVisualEffectView++;
1447 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1451 for (
int i = 0;
i < 5;
i++) {
1455 for (
int i = 0;
i < 5;
i++) {
1466 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1469 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1470 withParams:std::move(embeddedViewParams)];
1471 [flutterPlatformViewsController
1475 [flutterView setNeedsLayout];
1476 [flutterView layoutIfNeeded];
1478 numberOfExpectedVisualEffectView = 0;
1479 for (UIView* subview in childClippingView.subviews) {
1480 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1483 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1484 if ([
self validateOneVisualEffectView:subview
1485 expectedFrame:CGRectMake(0, 0, 10, 10)
1486 inputRadius:(CGFloat)5]) {
1487 numberOfExpectedVisualEffectView++;
1490 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1494 for (
int i = 0;
i < 5;
i++) {
1498 for (
int i = 0;
i < 5;
i++) {
1503 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1506 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1507 withParams:std::move(embeddedViewParams)];
1508 [flutterPlatformViewsController
1512 [flutterView setNeedsLayout];
1513 [flutterView layoutIfNeeded];
1515 numberOfExpectedVisualEffectView = 0;
1516 for (UIView* subview in childClippingView.subviews) {
1517 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1518 numberOfExpectedVisualEffectView++;
1521 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1524- (void)testApplyBackdropFilterCorrectAPI {
1529 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1530 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1534 visualEffectView:visualEffectView];
1535 XCTAssertNotNil(platformViewFilter);
1538- (void)testApplyBackdropFilterAPIChangedInvalidUIVisualEffectView {
1540 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc] init];
1544 visualEffectView:visualEffectView];
1545 XCTAssertNil(platformViewFilter);
1548- (void)testApplyBackdropFilterAPIChangedNoGaussianBlurFilter {
1550 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1551 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1552 NSArray* subviews = editedUIVisualEffectView.subviews;
1553 for (UIView*
view in subviews) {
1554 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1555 for (CIFilter* filter in
view.layer.filters) {
1556 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1557 [filter setValue:@"notGaussianBlur" forKey:@"name"];
1567 visualEffectView:editedUIVisualEffectView];
1568 XCTAssertNil(platformViewFilter);
1571- (void)testApplyBackdropFilterAPIChangedInvalidInputRadius {
1573 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1574 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1575 NSArray* subviews = editedUIVisualEffectView.subviews;
1576 for (UIView*
view in subviews) {
1577 if ([NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
1578 for (CIFilter* filter in
view.layer.filters) {
1579 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1580 [filter setValue:@"invalidInputRadius" forKey:@"inputRadius"];
1591 visualEffectView:editedUIVisualEffectView];
1592 XCTAssertNil(platformViewFilter);
1595- (void)testBackdropFilterVisualEffectSubviewBackgroundColor {
1596 __weak UIVisualEffectView* weakVisualEffectView;
1599 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1600 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1601 weakVisualEffectView = visualEffectView;
1605 visualEffectView:visualEffectView];
1606 CGColorRef visualEffectSubviewBackgroundColor = nil;
1607 for (UIView*
view in [platformViewFilter backdropFilterView].subviews) {
1608 if ([NSStringFromClass([
view class]) hasSuffix:
@"VisualEffectSubview"]) {
1609 visualEffectSubviewBackgroundColor =
view.layer.backgroundColor;
1613 CGColorEqualToColor(visualEffectSubviewBackgroundColor, UIColor.clearColor.CGColor));
1615 XCTAssertNil(weakVisualEffectView);
1618- (void)testCompositePlatformView {
1619 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1622 GetDefaultTaskRunner(),
1623 GetDefaultTaskRunner(),
1624 GetDefaultTaskRunner(),
1625 GetDefaultTaskRunner());
1628 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1629 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1632 flutterPlatformViewsController,
1635 std::make_shared<fml::SyncSwitch>());
1639 [flutterPlatformViewsController
1641 withId:@"MockFlutterPlatformView"
1645 [flutterPlatformViewsController
1649 @"viewType" : @"MockFlutterPlatformView"
1655 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1656 flutterPlatformViewsController.
flutterView = flutterView;
1668 auto embeddedViewParams =
1669 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
1671 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1672 withParams:std::move(embeddedViewParams)];
1673 [flutterPlatformViewsController
1677 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1678 toView:flutterView];
1679 XCTAssertTrue(CGRectEqualToRect(platformViewRectInFlutterView, CGRectMake(100, 100, 300, 300)));
1682- (void)testBackdropFilterCorrectlyPushedAndReset {
1683 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1686 GetDefaultTaskRunner(),
1687 GetDefaultTaskRunner(),
1688 GetDefaultTaskRunner(),
1689 GetDefaultTaskRunner());
1692 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1693 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1696 flutterPlatformViewsController,
1699 std::make_shared<fml::SyncSwitch>());
1703 [flutterPlatformViewsController
1705 withId:@"MockFlutterPlatformView"
1709 [flutterPlatformViewsController
1713 @"viewType" : @"MockFlutterPlatformView"
1719 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1720 flutterPlatformViewsController.
flutterView = flutterView;
1728 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1731 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1732 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1733 withParams:std::move(embeddedViewParams)];
1736 [flutterPlatformViewsController
1737 pushFilterToVisitedPlatformViews:filter
1738 withRect:flutter::DlRect::MakeXYWH(0, 0, screenScale * 10,
1740 [flutterPlatformViewsController
1746 [flutterView addSubview:childClippingView];
1748 [flutterView setNeedsLayout];
1749 [flutterView layoutIfNeeded];
1752 NSUInteger numberOfExpectedVisualEffectView = 0;
1753 for (UIView* subview in childClippingView.subviews) {
1754 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1757 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1758 if ([
self validateOneVisualEffectView:subview
1759 expectedFrame:CGRectMake(0, 0, 10, 10)
1761 numberOfExpectedVisualEffectView++;
1764 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1767 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
1769 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1770 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1771 withParams:std::move(embeddedViewParams2)];
1772 [flutterPlatformViewsController
1778 [flutterView setNeedsLayout];
1779 [flutterView layoutIfNeeded];
1781 numberOfExpectedVisualEffectView = 0;
1782 for (UIView* subview in childClippingView.subviews) {
1783 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1786 numberOfExpectedVisualEffectView++;
1788 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1791- (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1792 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1795 GetDefaultTaskRunner(),
1796 GetDefaultTaskRunner(),
1797 GetDefaultTaskRunner(),
1798 GetDefaultTaskRunner());
1801 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1802 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1805 flutterPlatformViewsController,
1808 std::make_shared<fml::SyncSwitch>());
1812 [flutterPlatformViewsController
1814 withId:@"MockFlutterPlatformView"
1818 [flutterPlatformViewsController
1822 @"viewType" : @"MockFlutterPlatformView"
1828 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1829 flutterPlatformViewsController.
flutterView = flutterView;
1841 auto embeddedViewParams =
1842 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
1844 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1845 withParams:std::move(embeddedViewParams)];
1846 [flutterPlatformViewsController
1850 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1851 toView:flutterView];
1857 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
1859 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
1862 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
1865 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
1869- (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
1870 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1873 GetDefaultTaskRunner(),
1874 GetDefaultTaskRunner(),
1875 GetDefaultTaskRunner(),
1876 GetDefaultTaskRunner());
1879 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1880 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1883 flutterPlatformViewsController,
1886 std::make_shared<fml::SyncSwitch>());
1890 [flutterPlatformViewsController
1892 withId:@"MockFlutterPlatformView"
1896 [flutterPlatformViewsController
1900 @"viewType" : @"MockFlutterPlatformView"
1906 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1907 flutterPlatformViewsController.
flutterView = flutterView;
1926 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1929 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1930 withParams:std::move(embeddedViewParams)];
1931 [flutterPlatformViewsController
1938 [flutterView addSubview:childClippingView];
1940 [flutterView setNeedsLayout];
1941 [flutterView layoutIfNeeded];
1942 XCTAssertNil(childClippingView.maskView);
1945- (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
1946 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1949 GetDefaultTaskRunner(),
1950 GetDefaultTaskRunner(),
1951 GetDefaultTaskRunner(),
1952 GetDefaultTaskRunner());
1955 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1956 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1959 flutterPlatformViewsController,
1962 std::make_shared<fml::SyncSwitch>());
1966 [flutterPlatformViewsController
1968 withId:@"MockFlutterPlatformView"
1972 [flutterPlatformViewsController
1976 @"viewType" : @"MockFlutterPlatformView"
1982 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1983 flutterPlatformViewsController.
flutterView = flutterView;
2000 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2003 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2004 withParams:std::move(embeddedViewParams)];
2005 [flutterPlatformViewsController
2012 [flutterView addSubview:childClippingView];
2014 [flutterView setNeedsLayout];
2015 [flutterView layoutIfNeeded];
2017 XCTAssertNotNil(childClippingView.maskView);
2020- (void)testClipRect {
2021 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2024 GetDefaultTaskRunner(),
2025 GetDefaultTaskRunner(),
2026 GetDefaultTaskRunner(),
2027 GetDefaultTaskRunner());
2030 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2031 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2034 flutterPlatformViewsController,
2037 std::make_shared<fml::SyncSwitch>());
2041 [flutterPlatformViewsController
2043 withId:@"MockFlutterPlatformView"
2047 [flutterPlatformViewsController
2051 @"viewType" : @"MockFlutterPlatformView"
2057 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2058 flutterPlatformViewsController.
flutterView = flutterView;
2069 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2072 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2073 withParams:std::move(embeddedViewParams)];
2074 [flutterPlatformViewsController
2081 [flutterView addSubview:childClippingView];
2083 [flutterView setNeedsLayout];
2084 [flutterView layoutIfNeeded];
2086 CGRect insideClipping = CGRectMake(2, 2, 3, 3);
2087 for (
int i = 0;
i < 10;
i++) {
2088 for (
int j = 0; j < 10; j++) {
2089 CGPoint point = CGPointMake(
i, j);
2090 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2091 if (CGRectContainsPoint(insideClipping, point)) {
2092 XCTAssertEqual(alpha, 255);
2094 XCTAssertEqual(alpha, 0);
2100- (void)testClipRect_multipleClips {
2101 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2104 GetDefaultTaskRunner(),
2105 GetDefaultTaskRunner(),
2106 GetDefaultTaskRunner(),
2107 GetDefaultTaskRunner());
2110 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2111 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2114 flutterPlatformViewsController,
2117 std::make_shared<fml::SyncSwitch>());
2121 [flutterPlatformViewsController
2123 withId:@"MockFlutterPlatformView"
2127 [flutterPlatformViewsController
2131 @"viewType" : @"MockFlutterPlatformView"
2137 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2138 flutterPlatformViewsController.
flutterView = flutterView;
2152 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2155 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2156 withParams:std::move(embeddedViewParams)];
2157 [flutterPlatformViewsController
2164 [flutterView addSubview:childClippingView];
2166 [flutterView setNeedsLayout];
2167 [flutterView layoutIfNeeded];
2186 CGRect insideClipping = CGRectMake(3, 3, 2, 2);
2187 for (
int i = 0;
i < 10;
i++) {
2188 for (
int j = 0; j < 10; j++) {
2189 CGPoint point = CGPointMake(
i, j);
2190 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2191 if (CGRectContainsPoint(insideClipping, point)) {
2192 XCTAssertEqual(alpha, 255);
2194 XCTAssertEqual(alpha, 0);
2200- (void)testClipRRect {
2201 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2204 GetDefaultTaskRunner(),
2205 GetDefaultTaskRunner(),
2206 GetDefaultTaskRunner(),
2207 GetDefaultTaskRunner());
2210 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2211 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2214 flutterPlatformViewsController,
2217 std::make_shared<fml::SyncSwitch>());
2221 [flutterPlatformViewsController
2223 withId:@"MockFlutterPlatformView"
2227 [flutterPlatformViewsController
2231 @"viewType" : @"MockFlutterPlatformView"
2237 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2238 flutterPlatformViewsController.
flutterView = flutterView;
2250 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2253 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2254 withParams:std::move(embeddedViewParams)];
2255 [flutterPlatformViewsController
2262 [flutterView addSubview:childClippingView];
2264 [flutterView setNeedsLayout];
2265 [flutterView layoutIfNeeded];
2286 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2287 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2288 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2289 for (
int i = 0;
i < 10;
i++) {
2290 for (
int j = 0; j < 10; j++) {
2291 CGPoint point = CGPointMake(
i, j);
2292 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2293 if (CGRectContainsPoint(innerClipping1, point) ||
2294 CGRectContainsPoint(innerClipping2, point)) {
2296 XCTAssertEqual(alpha, 255);
2297 }
else if (CGRectContainsPoint(outterClipping, point)) {
2299 XCTAssert(0 < alpha && alpha < 255);
2302 XCTAssertEqual(alpha, 0);
2308- (void)testClipRRect_multipleClips {
2309 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2312 GetDefaultTaskRunner(),
2313 GetDefaultTaskRunner(),
2314 GetDefaultTaskRunner(),
2315 GetDefaultTaskRunner());
2318 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2319 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2322 flutterPlatformViewsController,
2325 std::make_shared<fml::SyncSwitch>());
2329 [flutterPlatformViewsController
2331 withId:@"MockFlutterPlatformView"
2335 [flutterPlatformViewsController
2339 @"viewType" : @"MockFlutterPlatformView"
2345 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2346 flutterPlatformViewsController.
flutterView = flutterView;
2361 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2364 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2365 withParams:std::move(embeddedViewParams)];
2366 [flutterPlatformViewsController
2373 [flutterView addSubview:childClippingView];
2375 [flutterView setNeedsLayout];
2376 [flutterView layoutIfNeeded];
2397 CGRect clipping = CGRectMake(4, 2, 4, 6);
2398 for (
int i = 0;
i < 10;
i++) {
2399 for (
int j = 0; j < 10; j++) {
2400 CGPoint point = CGPointMake(
i, j);
2401 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2402 if (
i == 7 && (j == 2 || j == 7)) {
2404 XCTAssert(0 < alpha && alpha < 255);
2407 (
i == 4 && j >= 2 && j <= 7) ||
2409 (
i == 7 && j >= 2 && j <= 7) ||
2411 (j == 2 &&
i >= 4 &&
i <= 7) ||
2413 (j == 7 &&
i >= 4 &&
i <= 7)) {
2416 XCTAssert(alpha > 127);
2417 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2418 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2421 XCTAssert(alpha < 127);
2422 }
else if (CGRectContainsPoint(clipping, point)) {
2424 XCTAssertEqual(alpha, 255);
2427 XCTAssertEqual(alpha, 0);
2433- (void)testClipPath {
2434 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2437 GetDefaultTaskRunner(),
2438 GetDefaultTaskRunner(),
2439 GetDefaultTaskRunner(),
2440 GetDefaultTaskRunner());
2443 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2444 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2447 flutterPlatformViewsController,
2450 std::make_shared<fml::SyncSwitch>());
2454 [flutterPlatformViewsController
2456 withId:@"MockFlutterPlatformView"
2460 [flutterPlatformViewsController
2464 @"viewType" : @"MockFlutterPlatformView"
2470 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2471 flutterPlatformViewsController.
flutterView = flutterView;
2483 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2486 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2487 withParams:std::move(embeddedViewParams)];
2488 [flutterPlatformViewsController
2495 [flutterView addSubview:childClippingView];
2497 [flutterView setNeedsLayout];
2498 [flutterView layoutIfNeeded];
2519 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2520 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2521 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2522 for (
int i = 0;
i < 10;
i++) {
2523 for (
int j = 0; j < 10; j++) {
2524 CGPoint point = CGPointMake(
i, j);
2525 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2526 if (CGRectContainsPoint(innerClipping1, point) ||
2527 CGRectContainsPoint(innerClipping2, point)) {
2529 XCTAssertEqual(alpha, 255);
2530 }
else if (CGRectContainsPoint(outterClipping, point)) {
2532 XCTAssert(0 < alpha && alpha < 255);
2535 XCTAssertEqual(alpha, 0);
2541- (void)testClipPath_multipleClips {
2542 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2545 GetDefaultTaskRunner(),
2546 GetDefaultTaskRunner(),
2547 GetDefaultTaskRunner(),
2548 GetDefaultTaskRunner());
2551 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2552 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2555 flutterPlatformViewsController,
2558 std::make_shared<fml::SyncSwitch>());
2562 [flutterPlatformViewsController
2564 withId:@"MockFlutterPlatformView"
2568 [flutterPlatformViewsController
2572 @"viewType" : @"MockFlutterPlatformView"
2578 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2579 flutterPlatformViewsController.
flutterView = flutterView;
2594 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2597 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2598 withParams:std::move(embeddedViewParams)];
2599 [flutterPlatformViewsController
2606 [flutterView addSubview:childClippingView];
2608 [flutterView setNeedsLayout];
2609 [flutterView layoutIfNeeded];
2630 CGRect clipping = CGRectMake(4, 2, 4, 6);
2631 for (
int i = 0;
i < 10;
i++) {
2632 for (
int j = 0; j < 10; j++) {
2633 CGPoint point = CGPointMake(
i, j);
2634 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2635 if (
i == 7 && (j == 2 || j == 7)) {
2637 XCTAssert(0 < alpha && alpha < 255);
2640 (
i == 4 && j >= 2 && j <= 7) ||
2642 (
i == 7 && j >= 2 && j <= 7) ||
2644 (j == 2 &&
i >= 4 &&
i <= 7) ||
2646 (j == 7 &&
i >= 4 &&
i <= 7)) {
2649 XCTAssert(alpha > 127);
2650 }
else if ((
i == 3 && j >= 1 && j <= 8) || (
i == 8 && j >= 1 && j <= 8) ||
2651 (j == 1 &&
i >= 3 &&
i <= 8) || (j == 8 &&
i >= 3 &&
i <= 8)) {
2654 XCTAssert(alpha < 127);
2655 }
else if (CGRectContainsPoint(clipping, point)) {
2657 XCTAssertEqual(alpha, 255);
2660 XCTAssertEqual(alpha, 0);
2666- (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
2667 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2670 GetDefaultTaskRunner(),
2671 GetDefaultTaskRunner(),
2672 GetDefaultTaskRunner(),
2673 GetDefaultTaskRunner());
2676 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2677 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2680 flutterPlatformViewsController,
2683 std::make_shared<fml::SyncSwitch>());
2687 [flutterPlatformViewsController
2689 withId:@"MockFlutterPlatformView"
2693 [flutterPlatformViewsController
2697 @"viewType" : @"MockFlutterPlatformView"
2705 while (touchInteceptorView != nil &&
2707 touchInteceptorView = touchInteceptorView.superview;
2709 XCTAssertNotNil(touchInteceptorView);
2712 UIGestureRecognizer* forwardGectureRecognizer = nil;
2713 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2715 forwardGectureRecognizer = gestureRecognizer;
2721 NSSet* touches1 = [[NSSet alloc] init];
2722 id event1 = OCMClassMock([UIEvent
class]);
2724 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2725 OCMReject([flutterViewController touchesBegan:touches1 withEvent:event1]);
2728 NSSet* touches2 = [[NSSet alloc] init];
2729 id event2 = OCMClassMock([UIEvent
class]);
2731 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2732 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2735- (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
2736 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2739 GetDefaultTaskRunner(),
2740 GetDefaultTaskRunner(),
2741 GetDefaultTaskRunner(),
2742 GetDefaultTaskRunner());
2745 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2746 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2749 flutterPlatformViewsController,
2752 std::make_shared<fml::SyncSwitch>());
2756 [flutterPlatformViewsController
2758 withId:@"MockFlutterPlatformView"
2762 [flutterPlatformViewsController
2766 @"viewType" : @"MockFlutterPlatformView"
2774 while (touchInteceptorView != nil &&
2776 touchInteceptorView = touchInteceptorView.superview;
2778 XCTAssertNotNil(touchInteceptorView);
2781 UIGestureRecognizer* forwardGectureRecognizer = nil;
2782 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2784 forwardGectureRecognizer = gestureRecognizer;
2793 NSSet* touches1 = [[NSSet alloc] init];
2794 id event1 = OCMClassMock([UIEvent
class]);
2795 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2796 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2801 NSSet* touches2 = [[NSSet alloc] init];
2802 id event2 = OCMClassMock([UIEvent
class]);
2803 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2804 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2806 NSSet* touches3 = [[NSSet alloc] init];
2807 id event3 = OCMClassMock([UIEvent
class]);
2808 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2809 OCMVerify([flutterViewController touchesEnded:touches3 withEvent:event3]);
2812 NSSet* touches4 = [[NSSet alloc] init];
2813 id event4 = OCMClassMock([UIEvent
class]);
2814 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2815 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2817 NSSet* touches5 = [[NSSet alloc] init];
2818 id event5 = OCMClassMock([UIEvent
class]);
2819 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2820 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2827 NSSet* touches1 = [[NSSet alloc] init];
2828 id event1 = OCMClassMock([UIEvent
class]);
2829 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2830 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2835 NSSet* touches2 = [[NSSet alloc] init];
2836 id event2 = OCMClassMock([UIEvent
class]);
2837 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2838 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2840 NSSet* touches3 = [[NSSet alloc] init];
2841 id event3 = OCMClassMock([UIEvent
class]);
2842 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2843 OCMVerify([flutterViewController forceTouchesCancelled:touches3]);
2846 NSSet* touches4 = [[NSSet alloc] init];
2847 id event4 = OCMClassMock([UIEvent
class]);
2848 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2849 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2851 NSSet* touches5 = [[NSSet alloc] init];
2852 id event5 = OCMClassMock([UIEvent
class]);
2853 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2854 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2857 [flutterPlatformViewsController
reset];
2861 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2862 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2865 GetDefaultTaskRunner(),
2866 GetDefaultTaskRunner(),
2867 GetDefaultTaskRunner(),
2868 GetDefaultTaskRunner());
2871 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2872 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2875 flutterPlatformViewsController,
2878 std::make_shared<fml::SyncSwitch>());
2882 [flutterPlatformViewsController
2884 withId:@"MockFlutterPlatformView"
2888 [flutterPlatformViewsController
2892 @"viewType" : @"MockFlutterPlatformView"
2900 while (touchInteceptorView != nil &&
2902 touchInteceptorView = touchInteceptorView.superview;
2904 XCTAssertNotNil(touchInteceptorView);
2907 UIGestureRecognizer* forwardGectureRecognizer = nil;
2908 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2910 forwardGectureRecognizer = gestureRecognizer;
2918 NSSet* touches1 = [NSSet setWithObject:@1];
2919 id event1 = OCMClassMock([UIEvent
class]);
2920 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2921 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2928 NSSet* touches2 = [NSSet setWithObject:@1];
2929 id event2 = OCMClassMock([UIEvent
class]);
2930 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2931 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2932 OCMReject([flutterViewController2 touchesBegan:touches2 withEvent:event2]);
2934 NSSet* touches3 = [NSSet setWithObject:@1];
2935 id event3 = OCMClassMock([UIEvent
class]);
2936 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
2937 OCMVerify([flutterViewController touchesMoved:touches3 withEvent:event3]);
2938 OCMReject([flutterViewController2 touchesMoved:touches3 withEvent:event3]);
2940 NSSet* touches4 = [NSSet setWithObject:@1];
2941 id event4 = OCMClassMock([UIEvent
class]);
2942 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
2943 OCMVerify([flutterViewController touchesEnded:touches4 withEvent:event4]);
2944 OCMReject([flutterViewController2 touchesEnded:touches4 withEvent:event4]);
2946 NSSet* touches5 = [NSSet setWithObject:@1];
2947 id event5 = OCMClassMock([UIEvent
class]);
2948 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2949 OCMVerify([flutterViewController touchesEnded:touches5 withEvent:event5]);
2950 OCMReject([flutterViewController2 touchesEnded:touches5 withEvent:event5]);
2954 NSSet* touches6 = [NSSet setWithObject:@1];
2955 id event6 = OCMClassMock([UIEvent
class]);
2956 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
2957 OCMVerify([flutterViewController2 touchesBegan:touches6 withEvent:event6]);
2958 OCMReject([flutterViewController touchesBegan:touches6 withEvent:event6]);
2961 NSSet* touches7 = [NSSet setWithObject:@1];
2962 id event7 = OCMClassMock([UIEvent
class]);
2963 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
2964 OCMVerify([flutterViewController2 touchesMoved:touches7 withEvent:event7]);
2965 OCMReject([flutterViewController touchesMoved:touches7 withEvent:event7]);
2967 NSSet* touches8 = [NSSet setWithObject:@1];
2968 id event8 = OCMClassMock([UIEvent
class]);
2969 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
2970 OCMVerify([flutterViewController2 touchesEnded:touches8 withEvent:event8]);
2971 OCMReject([flutterViewController touchesEnded:touches8 withEvent:event8]);
2973 [flutterPlatformViewsController
reset];
2976- (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
2977 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2980 GetDefaultTaskRunner(),
2981 GetDefaultTaskRunner(),
2982 GetDefaultTaskRunner(),
2983 GetDefaultTaskRunner());
2986 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2987 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2990 flutterPlatformViewsController,
2993 std::make_shared<fml::SyncSwitch>());
2997 [flutterPlatformViewsController
2999 withId:@"MockFlutterPlatformView"
3003 [flutterPlatformViewsController
3007 @"viewType" : @"MockFlutterPlatformView"
3015 while (touchInteceptorView != nil &&
3017 touchInteceptorView = touchInteceptorView.superview;
3019 XCTAssertNotNil(touchInteceptorView);
3022 UIGestureRecognizer* forwardGectureRecognizer = nil;
3023 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3025 forwardGectureRecognizer = gestureRecognizer;
3032 NSSet* touches1 = [NSSet setWithObject:@1];
3033 id event1 = OCMClassMock([UIEvent
class]);
3034 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3036 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
3037 OCMVerify([flutterViewController forceTouchesCancelled:touches1]);
3039 [flutterPlatformViewsController
reset];
3042- (void)testFlutterPlatformViewTouchesEndedOrTouchesCancelledEventDoesNotFailTheGestureRecognizer {
3043 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3046 GetDefaultTaskRunner(),
3047 GetDefaultTaskRunner(),
3048 GetDefaultTaskRunner(),
3049 GetDefaultTaskRunner());
3052 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3053 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3056 flutterPlatformViewsController,
3059 std::make_shared<fml::SyncSwitch>());
3063 [flutterPlatformViewsController
3065 withId:@"MockFlutterPlatformView"
3069 [flutterPlatformViewsController
3073 @"viewType" : @"MockFlutterPlatformView"
3081 while (touchInteceptorView != nil &&
3083 touchInteceptorView = touchInteceptorView.superview;
3085 XCTAssertNotNil(touchInteceptorView);
3088 __block UIGestureRecognizer* forwardGestureRecognizer = nil;
3089 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3091 forwardGestureRecognizer = gestureRecognizer;
3098 NSSet* touches1 = [NSSet setWithObject:@1];
3099 id event1 = OCMClassMock([UIEvent
class]);
3100 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3101 @"Forwarding gesture recognizer must start with possible state.");
3102 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3103 [forwardGestureRecognizer touchesEnded:touches1 withEvent:event1];
3104 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3105 @"Forwarding gesture recognizer must end with failed state.");
3107 XCTestExpectation* touchEndedExpectation =
3108 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3109 dispatch_async(dispatch_get_main_queue(), ^{
3111 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3112 if ([gestureRecognizer isKindOfClass:[ForwardingGestureRecognizer class]]) {
3113 forwardGestureRecognizer = gestureRecognizer;
3117 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3118 @"Forwarding gesture recognizer must be reset to possible state.");
3119 [touchEndedExpectation fulfill];
3121 [
self waitForExpectationsWithTimeout:30 handler:nil];
3123 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3124 @"Forwarding gesture recognizer must start with possible state.");
3125 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3126 [forwardGestureRecognizer touchesCancelled:touches1 withEvent:event1];
3127 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3128 @"Forwarding gesture recognizer must end with failed state.");
3129 XCTestExpectation* touchCancelledExpectation =
3130 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3131 dispatch_async(dispatch_get_main_queue(), ^{
3133 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3134 if ([gestureRecognizer isKindOfClass:[ForwardingGestureRecognizer class]]) {
3135 forwardGestureRecognizer = gestureRecognizer;
3139 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3140 @"Forwarding gesture recognizer must be reset to possible state.");
3141 [touchCancelledExpectation fulfill];
3143 [
self waitForExpectationsWithTimeout:30 handler:nil];
3145 [flutterPlatformViewsController reset];
3149 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWebView {
3150 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3153 GetDefaultTaskRunner(),
3154 GetDefaultTaskRunner(),
3155 GetDefaultTaskRunner(),
3156 GetDefaultTaskRunner());
3159 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3160 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3163 flutterPlatformViewsController,
3166 std::make_shared<fml::SyncSwitch>());
3170 [flutterPlatformViewsController
3176 [flutterPlatformViewsController
3179 arguments:@{@"id" : @2, @"viewType" : @"MockWebView"}]
3186 while (touchInteceptorView != nil &&
3188 touchInteceptorView = touchInteceptorView.superview;
3190 XCTAssertNotNil(touchInteceptorView);
3192 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3193 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3194 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3201 BOOL shouldReAddDelayingRecognizer = NO;
3202 if (@available(iOS 26.0, *)) {
3205 }
else if (@available(iOS 18.2, *)) {
3206 shouldReAddDelayingRecognizer = YES;
3208 if (shouldReAddDelayingRecognizer) {
3210 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3211 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3213 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3214 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3219 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3220 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3223 GetDefaultTaskRunner(),
3224 GetDefaultTaskRunner(),
3225 GetDefaultTaskRunner(),
3226 GetDefaultTaskRunner());
3229 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3230 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3233 flutterPlatformViewsController,
3236 std::make_shared<fml::SyncSwitch>());
3240 [flutterPlatformViewsController
3242 withId:@"MockWrapperWebView"
3246 [flutterPlatformViewsController
3249 arguments:@{@"id" : @2, @"viewType" : @"MockWrapperWebView"}]
3256 while (touchInteceptorView != nil &&
3258 touchInteceptorView = touchInteceptorView.superview;
3260 XCTAssertNotNil(touchInteceptorView);
3262 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3263 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3264 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3271 BOOL shouldReAddDelayingRecognizer = NO;
3272 if (@available(iOS 26.0, *)) {
3275 }
else if (@available(iOS 18.2, *)) {
3276 shouldReAddDelayingRecognizer = YES;
3278 if (shouldReAddDelayingRecognizer) {
3280 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3281 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3283 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3284 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3289 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3290 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3293 GetDefaultTaskRunner(),
3294 GetDefaultTaskRunner(),
3295 GetDefaultTaskRunner(),
3296 GetDefaultTaskRunner());
3299 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3300 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3303 flutterPlatformViewsController,
3306 std::make_shared<fml::SyncSwitch>());
3310 [flutterPlatformViewsController
3312 withId:@"MockNestedWrapperWebView"
3316 [flutterPlatformViewsController
3320 @"viewType" : @"MockNestedWrapperWebView"
3328 while (touchInteceptorView != nil &&
3330 touchInteceptorView = touchInteceptorView.superview;
3332 XCTAssertNotNil(touchInteceptorView);
3334 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3335 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3336 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3343 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3344 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3348 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3349 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3352 GetDefaultTaskRunner(),
3353 GetDefaultTaskRunner(),
3354 GetDefaultTaskRunner(),
3355 GetDefaultTaskRunner());
3358 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3359 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3362 flutterPlatformViewsController,
3365 std::make_shared<fml::SyncSwitch>());
3369 [flutterPlatformViewsController
3371 withId:@"MockFlutterPlatformView"
3375 [flutterPlatformViewsController
3379 @"viewType" : @"MockFlutterPlatformView"
3387 while (touchInteceptorView != nil &&
3389 touchInteceptorView = touchInteceptorView.superview;
3391 XCTAssertNotNil(touchInteceptorView);
3393 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3394 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3395 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3402 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3403 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3406- (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
3407 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3410 GetDefaultTaskRunner(),
3411 GetDefaultTaskRunner(),
3412 GetDefaultTaskRunner(),
3413 GetDefaultTaskRunner());
3416 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3417 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3420 flutterPlatformViewsController,
3423 std::make_shared<fml::SyncSwitch>());
3427 [flutterPlatformViewsController
3429 withId:@"MockFlutterPlatformView"
3433 [flutterPlatformViewsController
3437 @"viewType" : @"MockFlutterPlatformView"
3447 auto embeddedViewParams_1 =
3448 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3450 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3451 withParams:std::move(embeddedViewParams_1)];
3452 [flutterPlatformViewsController
3457 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3458 nullptr, framebuffer_info,
3462 XCTAssertFalse([flutterPlatformViewsController
3464 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3466 auto embeddedViewParams_2 =
3467 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3468 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3469 withParams:std::move(embeddedViewParams_2)];
3470 [flutterPlatformViewsController
3474 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
3475 nullptr, framebuffer_info,
3479 XCTAssertTrue([flutterPlatformViewsController
3480 submitFrame:
std::move(mock_surface_submit_true)
3481 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3485 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
3486 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3489 GetDefaultTaskRunner(),
3490 GetDefaultTaskRunner(),
3491 GetDefaultTaskRunner(),
3492 GetDefaultTaskRunner());
3495 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3496 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3499 flutterPlatformViewsController,
3502 std::make_shared<fml::SyncSwitch>());
3504 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3505 flutterPlatformViewsController.
flutterView = flutterView;
3509 [flutterPlatformViewsController
3511 withId:@"MockFlutterPlatformView"
3517 [flutterPlatformViewsController
3521 @"viewType" : @"MockFlutterPlatformView"
3527 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
3529 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3530 withParams:std::move(embeddedViewParams)];
3536 [flutterPlatformViewsController
reset];
3541- (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
3542 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3545 GetDefaultTaskRunner(),
3546 GetDefaultTaskRunner(),
3547 GetDefaultTaskRunner(),
3548 GetDefaultTaskRunner());
3551 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3552 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3555 flutterPlatformViewsController,
3558 std::make_shared<fml::SyncSwitch>());
3560 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3561 flutterPlatformViewsController.
flutterView = flutterView;
3565 [flutterPlatformViewsController
3567 withId:@"MockFlutterPlatformView"
3572 [flutterPlatformViewsController
3576 @"viewType" : @"MockFlutterPlatformView"
3581 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3584 auto embeddedViewParams1 =
3585 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3586 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3587 withParams:std::move(embeddedViewParams1)];
3588 [flutterPlatformViewsController
3595 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3598 auto embeddedViewParams2 =
3599 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3600 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3601 withParams:std::move(embeddedViewParams2)];
3602 [flutterPlatformViewsController
3610 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
3611 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3614 GetDefaultTaskRunner(),
3615 GetDefaultTaskRunner(),
3616 GetDefaultTaskRunner(),
3617 GetDefaultTaskRunner());
3620 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3621 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3624 flutterPlatformViewsController,
3627 std::make_shared<fml::SyncSwitch>());
3629 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3630 flutterPlatformViewsController.
flutterView = flutterView;
3634 [flutterPlatformViewsController
3636 withId:@"MockFlutterPlatformView"
3640 [flutterPlatformViewsController
3644 @"viewType" : @"MockFlutterPlatformView"
3650 [flutterPlatformViewsController
3654 @"viewType" : @"MockFlutterPlatformView"
3659 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3662 auto embeddedViewParams1 =
3663 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3664 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3665 withParams:std::move(embeddedViewParams1)];
3667 auto embeddedViewParams2 =
3668 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
3669 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3670 withParams:std::move(embeddedViewParams2)];
3673 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3674 nullptr, framebuffer_info,
3678 XCTAssertTrue([flutterPlatformViewsController
3680 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3683 UIView* clippingView1 = view1.superview.superview;
3684 UIView* clippingView2 = view2.superview.superview;
3685 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3686 [flutterView.subviews indexOfObject:clippingView2],
3687 @"The first clipping view should be added before the second clipping view.");
3690 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3692 embeddedViewParams2 =
3693 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
3694 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3695 withParams:std::move(embeddedViewParams2)];
3697 embeddedViewParams1 =
3698 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3699 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3700 withParams:std::move(embeddedViewParams1)];
3702 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3703 nullptr, framebuffer_info,
3707 XCTAssertTrue([flutterPlatformViewsController
3709 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3711 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
3712 [flutterView.subviews indexOfObject:clippingView2],
3713 @"The first clipping view should be added after the second clipping view.");
3717 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
3718 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3721 GetDefaultTaskRunner(),
3722 GetDefaultTaskRunner(),
3723 GetDefaultTaskRunner(),
3724 GetDefaultTaskRunner());
3727 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3728 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3731 flutterPlatformViewsController,
3734 std::make_shared<fml::SyncSwitch>());
3736 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3737 flutterPlatformViewsController.
flutterView = flutterView;
3741 [flutterPlatformViewsController
3743 withId:@"MockFlutterPlatformView"
3747 [flutterPlatformViewsController
3751 @"viewType" : @"MockFlutterPlatformView"
3757 [flutterPlatformViewsController
3761 @"viewType" : @"MockFlutterPlatformView"
3766 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3769 auto embeddedViewParams1 =
3770 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3771 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3772 withParams:std::move(embeddedViewParams1)];
3774 auto embeddedViewParams2 =
3775 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
3776 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3777 withParams:std::move(embeddedViewParams2)];
3780 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3781 nullptr, framebuffer_info,
3785 XCTAssertTrue([flutterPlatformViewsController
3787 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3790 UIView* clippingView1 = view1.superview.superview;
3791 UIView* clippingView2 = view2.superview.superview;
3792 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3793 [flutterView.subviews indexOfObject:clippingView2],
3794 @"The first clipping view should be added before the second clipping view.");
3797 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3799 embeddedViewParams1 =
3800 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
3801 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3802 withParams:std::move(embeddedViewParams1)];
3804 embeddedViewParams2 =
3805 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
3806 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3807 withParams:std::move(embeddedViewParams2)];
3809 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3810 nullptr, framebuffer_info,
3814 XCTAssertTrue([flutterPlatformViewsController
3816 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
3818 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3819 [flutterView.subviews indexOfObject:clippingView2],
3820 @"The first clipping view should be added before the second clipping view.");
3823- (int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
3824 unsigned char pixel[4] = {0};
3826 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
3829 CGContextRef context =
3830 CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace,
3831 static_cast<uint32_t
>(kCGBitmapAlphaInfoMask) &
3832 static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast));
3833 CGContextTranslateCTM(context, -point.x, -point.y);
3834 [view.layer renderInContext:context];
3836 CGContextRelease(context);
3837 CGColorSpaceRelease(colorSpace);
3842- (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
3844 UIWindow*
window = [[UIWindow alloc] init];
3845 UITextField* textField = [[UITextField alloc] init];
3846 [window addSubview:textField];
3848 [textField becomeFirstResponder];
3849 XCTAssertTrue(textField.isFirstResponder);
3850 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
3851 [textField resignFirstResponder];
3852 XCTAssertFalse(textField.isFirstResponder);
3853 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
3856- (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
3858 UIWindow*
window = [[UIWindow alloc] init];
3859 UIView*
view = [[UIView alloc] init];
3860 UIView* childView = [[UIView alloc] init];
3861 UITextField* textField = [[UITextField alloc] init];
3862 [window addSubview:view];
3863 [view addSubview:childView];
3864 [childView addSubview:textField];
3866 [textField becomeFirstResponder];
3867 XCTAssertTrue(textField.isFirstResponder);
3868 XCTAssertTrue(
view.flt_hasFirstResponderInViewHierarchySubtree);
3869 [textField resignFirstResponder];
3870 XCTAssertFalse(textField.isFirstResponder);
3871 XCTAssertFalse(
view.flt_hasFirstResponderInViewHierarchySubtree);
3874- (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
3880 CGRect newRect = CGRectMake(0, 0, 10, 10);
3884 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
3885 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
3886 XCTAssertEqualObjects(set1, set2);
3887 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
3888 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
3891- (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
3896 XCTAssertNotEqual(view1, view3);
3897 XCTAssertNotEqual(view2, view3);
3900- (void)testMaskViewsReleasedWhenPoolIsReleased {
3901 __weak UIView* weakView;
3906 XCTAssertNotNil(weakView);
3908 XCTAssertNil(weakView);
3911- (void)testClipMaskViewIsReused {
3912 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3915 GetDefaultTaskRunner(),
3916 GetDefaultTaskRunner(),
3917 GetDefaultTaskRunner(),
3918 GetDefaultTaskRunner());
3921 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3922 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3925 flutterPlatformViewsController,
3928 std::make_shared<fml::SyncSwitch>());
3932 [flutterPlatformViewsController
3934 withId:@"MockFlutterPlatformView"
3938 [flutterPlatformViewsController
3942 @"viewType" : @"MockFlutterPlatformView"
3947 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
3948 flutterPlatformViewsController.
flutterView = flutterView;
3959 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3962 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3963 withParams:std::move(embeddedViewParams1)];
3964 [flutterPlatformViewsController
3969 UIView* maskView1 = childClippingView1.maskView;
3970 XCTAssertNotNil(maskView1);
3973 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(100, 100)];
3975 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3977 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
3979 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3980 withParams:std::move(embeddedViewParams3)];
3981 [flutterPlatformViewsController
3988 [flutterPlatformViewsController
3992 @"viewType" : @"MockFlutterPlatformView"
3996 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
3998 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3999 withParams:std::move(embeddedViewParams4)];
4000 [flutterPlatformViewsController
4006 UIView* maskView2 = childClippingView2.maskView;
4007 XCTAssertEqual(maskView1, maskView2);
4008 XCTAssertNotNil(childClippingView2.maskView);
4009 XCTAssertNil(childClippingView1.maskView);
4012- (void)testDifferentClipMaskViewIsUsedForEachView {
4013 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4016 GetDefaultTaskRunner(),
4017 GetDefaultTaskRunner(),
4018 GetDefaultTaskRunner(),
4019 GetDefaultTaskRunner());
4022 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4023 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4026 flutterPlatformViewsController,
4029 std::make_shared<fml::SyncSwitch>());
4033 [flutterPlatformViewsController
4035 withId:@"MockFlutterPlatformView"
4040 [flutterPlatformViewsController
4044 @"viewType" : @"MockFlutterPlatformView"
4050 [flutterPlatformViewsController
4054 @"viewType" : @"MockFlutterPlatformView"
4060 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4061 flutterPlatformViewsController.
flutterView = flutterView;
4072 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4077 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4080 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4081 withParams:std::move(embeddedViewParams1)];
4082 [flutterPlatformViewsController
4086 UIView* childClippingView1 = view1.superview.superview;
4088 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4089 withParams:std::move(embeddedViewParams2)];
4090 [flutterPlatformViewsController
4094 UIView* childClippingView2 = view2.superview.superview;
4095 UIView* maskView1 = childClippingView1.maskView;
4096 UIView* maskView2 = childClippingView2.maskView;
4097 XCTAssertNotEqual(maskView1, maskView2);
4100- (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4101 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4104 GetDefaultTaskRunner(),
4105 GetDefaultTaskRunner(),
4106 GetDefaultTaskRunner(),
4107 GetDefaultTaskRunner());
4110 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4111 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4114 flutterPlatformViewsController,
4117 std::make_shared<fml::SyncSwitch>());
4121 [flutterPlatformViewsController
4123 withId:@"MockFlutterPlatformView"
4128 [flutterPlatformViewsController
4132 @"viewType" : @"MockFlutterPlatformView"
4137 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4138 flutterPlatformViewsController.
flutterView = flutterView;
4149 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4154 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4157 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4158 withParams:std::move(embeddedViewParams1)];
4159 [flutterPlatformViewsController
4165 UIView* maskView = childClippingView.maskView;
4166 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer class]],
4167 @"Mask view must use CAShapeLayer as its backing layer.");
4175- (
BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4176 expectedFrame:(CGRect)frame
4177 inputRadius:(CGFloat)inputRadius {
4178 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4179 for (UIView*
view in visualEffectView.subviews) {
4180 if (![NSStringFromClass([
view class]) hasSuffix:
@"BackdropView"]) {
4183 XCTAssertEqual(
view.layer.filters.count, 1u);
4184 NSObject* filter =
view.layer.filters.firstObject;
4186 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4188 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4189 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber class]] &&
4190 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4197- (void)testDisposingViewInCompositionOrderDoNotCrash {
4198 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4201 GetDefaultTaskRunner(),
4202 GetDefaultTaskRunner(),
4203 GetDefaultTaskRunner(),
4204 GetDefaultTaskRunner());
4207 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4208 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4211 flutterPlatformViewsController,
4214 std::make_shared<fml::SyncSwitch>());
4216 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4217 flutterPlatformViewsController.
flutterView = flutterView;
4221 [flutterPlatformViewsController
4223 withId:@"MockFlutterPlatformView"
4228 [flutterPlatformViewsController
4232 @"viewType" : @"MockFlutterPlatformView"
4235 [flutterPlatformViewsController
4239 @"viewType" : @"MockFlutterPlatformView"
4246 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4249 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4251 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4252 withParams:std::move(embeddedViewParams0)];
4254 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4256 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4257 withParams:std::move(embeddedViewParams1)];
4261 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
4263 [expectation fulfill];
4266 [flutterPlatformViewsController
4269 [
self waitForExpectationsWithTimeout:30 handler:nil];
4272 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4273 nullptr, framebuffer_info,
4278 XCTAssertTrue([flutterPlatformViewsController
4280 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
4284 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
4285 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4291 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4294 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4296 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4297 withParams:std::move(embeddedViewParams1)];
4300 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4301 nullptr, framebuffer_info,
4305 XCTAssertTrue([flutterPlatformViewsController
4307 withIosContext:
std::make_shared<
flutter::IOSContextNoop>()]);
4311 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
4312 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4315- (void)testOnlyPlatformViewsAreRemovedWhenReset {
4316 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4319 GetDefaultTaskRunner(),
4320 GetDefaultTaskRunner(),
4321 GetDefaultTaskRunner(),
4322 GetDefaultTaskRunner());
4325 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4326 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4329 flutterPlatformViewsController,
4332 std::make_shared<fml::SyncSwitch>());
4336 [flutterPlatformViewsController
4338 withId:@"MockFlutterPlatformView"
4342 [flutterPlatformViewsController
4346 @"viewType" : @"MockFlutterPlatformView"
4349 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4350 flutterPlatformViewsController.
flutterView = flutterView;
4362 auto embeddedViewParams =
4363 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4365 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4366 withParams:std::move(embeddedViewParams)];
4369 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4370 nullptr, framebuffer_info,
4374 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4375 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4377 UIView* someView = [[UIView alloc] init];
4378 [flutterView addSubview:someView];
4380 [flutterPlatformViewsController
reset];
4381 XCTAssertEqual(flutterView.subviews.count, 1u);
4382 XCTAssertEqual(flutterView.subviews.firstObject, someView);
4385- (void)testResetClearsPreviousCompositionOrder {
4386 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4389 GetDefaultTaskRunner(),
4390 GetDefaultTaskRunner(),
4391 GetDefaultTaskRunner(),
4392 GetDefaultTaskRunner());
4395 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4396 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4399 flutterPlatformViewsController,
4402 std::make_shared<fml::SyncSwitch>());
4406 [flutterPlatformViewsController
4408 withId:@"MockFlutterPlatformView"
4412 [flutterPlatformViewsController
4416 @"viewType" : @"MockFlutterPlatformView"
4419 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4420 flutterPlatformViewsController.
flutterView = flutterView;
4432 auto embeddedViewParams =
4433 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4435 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4436 withParams:std::move(embeddedViewParams)];
4439 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4440 nullptr, framebuffer_info,
4444 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4445 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4451 [flutterPlatformViewsController
reset];
4457- (void)testNilPlatformViewDoesntCrash {
4458 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4461 GetDefaultTaskRunner(),
4462 GetDefaultTaskRunner(),
4463 GetDefaultTaskRunner(),
4464 GetDefaultTaskRunner());
4467 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4468 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4471 flutterPlatformViewsController,
4474 std::make_shared<fml::SyncSwitch>());
4478 [flutterPlatformViewsController
4480 withId:@"MockFlutterPlatformView"
4484 [flutterPlatformViewsController
4488 @"viewType" : @"MockFlutterPlatformView"
4491 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4492 flutterPlatformViewsController.
flutterView = flutterView;
4505 auto embeddedViewParams =
4506 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4508 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4509 withParams:std::move(embeddedViewParams)];
4512 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4513 nullptr, framebuffer_info,
4517 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4518 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4520 XCTAssertEqual(flutterView.subviews.count, 1u);
4523- (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
4525 NSObject* container = [[NSObject alloc] init];
4526 [touchInteceptorView setFlutterAccessibilityContainer:container];
4527 XCTAssertEqualObjects([touchInteceptorView accessibilityContainer], container);
4530- (void)testLayerPool {
4540 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4541 XCTAssertEqual(pool.size(), 1u);
4542 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4543 XCTAssertEqual(pool.size(), 2u);
4546 pool.RecycleLayers();
4547 XCTAssertEqual(pool.size(), 2u);
4550 auto unused_layers = pool.RemoveUnusedLayers();
4551 XCTAssertEqual(unused_layers.size(), 2u);
4552 XCTAssertEqual(pool.size(), 1u);
4555- (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
4556 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4559 GetDefaultTaskRunner(),
4560 GetDefaultTaskRunner(),
4561 GetDefaultTaskRunner(),
4562 GetDefaultTaskRunner());
4565 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4566 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4569 flutterPlatformViewsController,
4572 std::make_shared<fml::SyncSwitch>());
4574 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4575 flutterPlatformViewsController.
flutterView = flutterView;
4579 [flutterPlatformViewsController
4581 withId:@"MockFlutterPlatformView"
4585 [flutterPlatformViewsController
4589 @"viewType" : @"MockFlutterPlatformView"
4594 [flutterPlatformViewsController
4598 @"viewType" : @"MockFlutterPlatformView"
4602 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4605 auto embeddedViewParams1 =
4606 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(300, 300), stack);
4607 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4608 withParams:std::move(embeddedViewParams1)];
4610 auto embeddedViewParams2 =
4611 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
flutter::DlSize(500, 500), stack);
4612 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4613 withParams:std::move(embeddedViewParams2)];
4616 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
4617 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4618 nullptr, framebuffer_info,
4631 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4632 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4634 XCTAssertTrue(submit_info.has_value());
4639- (void)testClipSuperellipse {
4640 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4643 GetDefaultTaskRunner(),
4644 GetDefaultTaskRunner(),
4645 GetDefaultTaskRunner(),
4646 GetDefaultTaskRunner());
4649 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4650 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4653 flutterPlatformViewsController,
4656 std::make_shared<fml::SyncSwitch>());
4660 [flutterPlatformViewsController
4662 withId:@"MockFlutterPlatformView"
4666 [flutterPlatformViewsController
4670 @"viewType" : @"MockFlutterPlatformView"
4676 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4677 flutterPlatformViewsController.
flutterView = flutterView;
4688 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4691 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4692 withParams:std::move(embeddedViewParams)];
4693 [flutterPlatformViewsController
4700 [flutterView addSubview:childClippingView];
4702 [flutterView setNeedsLayout];
4703 [flutterView layoutIfNeeded];
4705 CGPoint corners[] = {CGPointMake(rect.
GetLeft(), rect.
GetTop()),
4709 for (
auto point : corners) {
4710 int alpha = [
self alphaOfPoint:point onView:flutterView];
4711 XCTAssertNotEqual(alpha, 255);
4715 int alpha = [
self alphaOfPoint:center onView:flutterView];
4716 XCTAssertEqual(alpha, 255);
void(^ FlutterResult)(id _Nullable result)
static __weak MockPlatformView * gMockPlatformView
NSMutableArray * backdropFilterSubviews()
void applyBlurBackdropFilters:(NSArray< PlatformViewFilter * > *filters)
FlutterClippingMaskView * getMaskViewWithFrame:(CGRect frame)
void insertViewToPoolIfNeeded:(FlutterClippingMaskView *maskView)
AssetResolverType
Identifies the type of AssetResolver an instance is.
static std::shared_ptr< DlImageFilter > Make(DlScalar sigma_x, DlScalar sigma_y, DlTileMode tile_mode)
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 PushClipRRect(const DlRoundRect &rrect)
void PushClipRSE(const DlRoundSuperellipse &rrect)
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.
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS GBytes * message
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
flutter::PlatformViewIOS * platformView()
instancetype methodCallWithMethodName:arguments:(NSString *method,[arguments] id _Nullable arguments)
static MockSurface mock_surface
impeller::Scalar DlScalar
impeller::ISize32 DlISize
std::function< void()> closure
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)
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|.