7 #import <OCMock/OCMock.h>
8 #import <UIKit/UIKit.h>
9 #import <WebKit/WebKit.h>
10 #import <XCTest/XCTest.h>
14 #include "flutter/display_list/effects/dl_image_filters.h"
15 #include "flutter/fml/synchronization/count_down_latch.h"
16 #include "flutter/fml/thread.h"
36 - (instancetype)init {
51 @property(nonatomic, strong) UIView* view;
52 @property(nonatomic, assign) BOOL viewCreated;
57 - (instancetype)init {
58 if (
self = [super init]) {
66 [
self checkViewCreatedOnce];
70 - (void)checkViewCreatedOnce {
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 {
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 {
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 {
221 self.viewCreated = YES;
226 : NSObject <FlutterPlatformViewFactory>
231 viewIdentifier:(int64_t)viewId
232 arguments:(
id _Nullable)args {
239 class 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 {}
251 const flutter::Settings& OnPlatformViewGetSettings()
const override {
return settings_; }
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,
257 SemanticsAction action,
258 fml::MallocMapping args)
override {}
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,
273 flutter::AssetResolver::AssetResolverType type)
override {}
278 BOOL BlurRadiusEqualToBlurRadius(CGFloat radius1, CGFloat radius2) {
279 const CGFloat epsilon = 0.01;
280 return std::abs(radius1 - radius2) < epsilon;
292 fml::RefPtr<fml::TaskRunner> GetDefaultTaskRunner() {
293 fml::MessageLoop::EnsureInitializedForCurrentThread();
294 return fml::MessageLoop::GetCurrent().GetTaskRunner();
298 - (void)testFlutterViewOnlyCreateOnceInOneFrame {
299 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
301 flutter::TaskRunners runners(
self.name.UTF8String,
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;
335 flutter::MutatorsStack stack;
337 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
338 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
339 stack.PushTransform(screenScaleMatrix);
341 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
342 stack.PushTransform(translateMatrix);
343 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
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;
359 flutter::TaskRunners runners(
self.name.UTF8String,
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;
454 flutter::TaskRunners runners(
self.name.UTF8String,
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;
491 flutter::MutatorsStack stack;
493 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
494 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
495 stack.PushTransform(screenScaleMatrix);
497 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
498 stack.PushBackdropFilter(filter,
499 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
501 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
502 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
536 flutter::TaskRunners runners(
self.name.UTF8String,
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;
573 flutter::MutatorsStack stack;
575 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
576 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
577 stack.PushTransform(screenScaleMatrix);
579 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
580 stack.PushBackdropFilter(filter,
581 flutter::DlRect::MakeXYWH(0, 0, screenScale * 8, screenScale * 8));
583 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
584 screenScaleMatrix, flutter::DlSize(5, 10), stack);
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;
618 flutter::TaskRunners runners(
self.name.UTF8String,
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;
655 flutter::MutatorsStack stack;
657 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
658 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
659 stack.PushTransform(screenScaleMatrix);
661 for (
int i = 0; i < 50; i++) {
662 auto filter = flutter::DlBlurImageFilter::Make(i, 2, flutter::DlTileMode::kClamp);
663 stack.PushBackdropFilter(filter,
664 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
667 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
668 screenScaleMatrix, flutter::DlSize(20, 20), stack);
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;
701 flutter::TaskRunners runners(
self.name.UTF8String,
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;
738 flutter::MutatorsStack stack;
740 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
741 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
742 stack.PushTransform(screenScaleMatrix);
744 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
745 stack.PushBackdropFilter(filter,
746 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
748 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
749 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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);
781 flutter::MutatorsStack stack2;
783 stack2.PushTransform(screenScaleMatrix);
785 for (
int i = 0; i < 2; i++) {
786 stack2.PushBackdropFilter(filter,
787 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
790 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
791 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
830 flutter::TaskRunners runners(
self.name.UTF8String,
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;
867 flutter::MutatorsStack stack;
869 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
870 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
871 stack.PushTransform(screenScaleMatrix);
873 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
874 for (
int i = 0; i < 5; i++) {
875 stack.PushBackdropFilter(filter,
876 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
879 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
880 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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];
910 flutter::MutatorsStack stack2;
912 stack2.PushTransform(screenScaleMatrix);
914 for (
int i = 0; i < 4; i++) {
915 stack2.PushBackdropFilter(filter,
916 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
919 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
920 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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>(
963 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
986 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1023 flutter::MutatorsStack stack;
1025 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1026 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1027 stack.PushTransform(screenScaleMatrix);
1029 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
1030 for (
int i = 0; i < 5; i++) {
1031 stack.PushBackdropFilter(filter,
1032 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1035 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1036 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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];
1066 flutter::MutatorsStack stack2;
1068 stack2.PushTransform(screenScaleMatrix);
1070 for (
int i = 0; i < 5; i++) {
1072 auto filter2 = flutter::DlBlurImageFilter::Make(2, 5, flutter::DlTileMode::kClamp);
1074 stack2.PushBackdropFilter(
1075 filter2, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1079 stack2.PushBackdropFilter(filter,
1080 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1083 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1084 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1131 auto filter2 = flutter::DlBlurImageFilter::Make(2, 5, flutter::DlTileMode::kClamp);
1132 stack2.PushBackdropFilter(
1133 filter2, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1137 stack2.PushBackdropFilter(filter,
1138 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1141 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1142 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1187 auto filter2 = flutter::DlBlurImageFilter::Make(2, 5, flutter::DlTileMode::kClamp);
1188 stack2.PushBackdropFilter(
1189 filter2, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1193 stack2.PushBackdropFilter(filter,
1194 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1197 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1198 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1244 auto filter2 = flutter::DlBlurImageFilter::Make(i, 2, flutter::DlTileMode::kClamp);
1246 stack2.PushBackdropFilter(filter2,
1247 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1250 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1251 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
1290 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1327 flutter::MutatorsStack stack;
1329 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1330 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1331 stack.PushTransform(screenScaleMatrix);
1333 auto dilateFilter = flutter::DlDilateImageFilter::Make(5, 2);
1334 stack.PushBackdropFilter(dilateFilter, flutter::DlRect());
1336 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1337 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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);
1363 flutter::MutatorsStack stack2;
1365 stack2.PushTransform(screenScaleMatrix);
1367 auto blurFilter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
1369 for (
int i = 0; i < 5; i++) {
1371 stack2.PushBackdropFilter(
1372 dilateFilter, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1376 stack2.PushBackdropFilter(blurFilter,
1377 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1380 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1381 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1414 stack2.PushBackdropFilter(
1415 dilateFilter, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1419 stack2.PushBackdropFilter(blurFilter,
1420 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1423 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1424 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1457 stack2.PushBackdropFilter(
1458 dilateFilter, flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1462 stack2.PushBackdropFilter(blurFilter,
1463 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1466 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1467 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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++) {
1499 stack2.PushBackdropFilter(dilateFilter,
1500 flutter::DlRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1503 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1504 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
1621 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1658 flutter::MutatorsStack stack;
1660 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1661 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1662 stack.PushTransform(screenScaleMatrix);
1664 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
1665 stack.PushTransform(translateMatrix);
1666 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
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;
1685 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1722 flutter::MutatorsStack stack;
1724 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1725 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1726 stack.PushTransform(screenScaleMatrix);
1728 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1729 screenScaleMatrix, flutter::DlSize(10, 10), stack);
1731 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(0, 0)];
1732 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1733 withParams:std::move(embeddedViewParams)];
1735 auto filter = flutter::DlBlurImageFilter::Make(5, 2, flutter::DlTileMode::kClamp);
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>(
1768 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
1794 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1831 flutter::MutatorsStack stack;
1833 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1834 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1835 stack.PushTransform(screenScaleMatrix);
1837 flutter::DlMatrix rotateMatrix = flutter::DlMatrix::MakeRotationZ(flutter::DlDegrees(10));
1838 stack.PushTransform(rotateMatrix);
1839 flutter::DlMatrix finalMatrix = screenScaleMatrix * rotateMatrix;
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;
1872 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1909 flutter::MutatorsStack stack;
1911 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1912 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1913 stack.PushTransform(screenScaleMatrix);
1914 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({5, 5});
1916 stack.PushTransform(translateMatrix);
1918 flutter::DlRect rect = flutter::DlRect::MakeXYWH(0, 0, 25, 25);
1919 stack.PushClipRect(rect);
1922 flutter::DlRect rect_for_rrect = flutter::DlRect::MakeXYWH(-1, -1, 25, 25);
1923 flutter::DlRoundRect rrect = flutter::DlRoundRect::MakeRectXY(rect_for_rrect, 1, 1);
1924 stack.PushClipRRect(rrect);
1926 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1927 screenScaleMatrix * translateMatrix, flutter::DlSize(5, 5), stack);
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;
1948 flutter::TaskRunners runners(
self.name.UTF8String,
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;
1985 flutter::MutatorsStack stack;
1987 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1988 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1989 stack.PushTransform(screenScaleMatrix);
1990 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({5, 5});
1992 stack.PushTransform(translateMatrix);
1996 flutter::DlRect rect_for_rrect = flutter::DlRect::MakeXYWH(0, 0, 10, 10);
1997 flutter::DlRoundRect rrect = flutter::DlRoundRect::MakeRectXY(rect_for_rrect, 1, 1);
1998 stack.PushClipRRect(rrect);
2000 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2001 screenScaleMatrix * translateMatrix, flutter::DlSize(5, 5), stack);
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;
2023 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2060 flutter::MutatorsStack stack;
2062 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2063 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2064 stack.PushTransform(screenScaleMatrix);
2066 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
2067 stack.PushClipRect(rect);
2069 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2070 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2103 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2140 flutter::MutatorsStack stack;
2142 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2143 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2144 stack.PushTransform(screenScaleMatrix);
2146 flutter::DlRect rect1 = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
2147 stack.PushClipRect(rect1);
2149 flutter::DlRect rect2 = flutter::DlRect::MakeXYWH(3, 3, 3, 3);
2150 stack.PushClipRect(rect2);
2152 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2153 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2203 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2240 flutter::MutatorsStack stack;
2242 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2243 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2244 stack.PushTransform(screenScaleMatrix);
2246 flutter::DlRoundRect rrect =
2247 flutter::DlRoundRect::MakeRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2248 stack.PushClipRRect(rrect);
2250 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2251 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2311 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2348 flutter::MutatorsStack stack;
2350 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2351 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2352 stack.PushTransform(screenScaleMatrix);
2354 flutter::DlRoundRect rrect =
2355 flutter::DlRoundRect::MakeRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2356 stack.PushClipRRect(rrect);
2358 flutter::DlRect rect = flutter::DlRect::MakeXYWH(4, 2, 6, 6);
2359 stack.PushClipRect(rect);
2361 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2362 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2436 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2473 flutter::MutatorsStack stack;
2475 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2476 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2477 stack.PushTransform(screenScaleMatrix);
2479 flutter::DlPath path =
2480 flutter::DlPath::MakeRoundRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2481 stack.PushClipPath(path);
2483 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2484 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2544 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2581 flutter::MutatorsStack stack;
2583 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2584 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2585 stack.PushTransform(screenScaleMatrix);
2587 flutter::DlPath path =
2588 flutter::DlPath::MakeRoundRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2589 stack.PushClipPath(path);
2591 flutter::DlRect rect = flutter::DlRect::MakeXYWH(4, 2, 6, 6);
2592 stack.PushClipRect(rect);
2594 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2595 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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;
2669 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2738 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2864 flutter::TaskRunners runners(
self.name.UTF8String,
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;
2979 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3045 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3152 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3222 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3292 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3351 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3409 flutter::TaskRunners runners(
self.name.UTF8String,
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"
3444 flutter::MutatorsStack stack;
3445 flutter::DlMatrix finalMatrix;
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
3456 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3457 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3458 nullptr, framebuffer_info,
3459 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return false; },
3460 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3461 flutter::DlISize(800, 600));
3462 XCTAssertFalse([flutterPlatformViewsController
3463 submitFrame:std::move(mock_surface)
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,
3476 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3477 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3478 flutter::DlISize(800, 600));
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;
3488 flutter::TaskRunners runners(
self.name.UTF8String,
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"
3525 flutter::MutatorsStack stack;
3526 flutter::DlMatrix finalMatrix;
3527 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
3528 finalMatrix, flutter::DlSize(300, 300), stack);
3529 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3530 withParams:std::move(embeddedViewParams)];
3536 [flutterPlatformViewsController
reset];
3541 - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
3542 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3544 flutter::TaskRunners runners(
self.name.UTF8String,
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)];
3582 flutter::MutatorsStack stack;
3583 flutter::DlMatrix finalMatrix;
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;
3613 flutter::TaskRunners runners(
self.name.UTF8String,
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)];
3660 flutter::MutatorsStack stack;
3661 flutter::DlMatrix finalMatrix;
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)];
3672 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3673 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3674 nullptr, framebuffer_info,
3675 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3676 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3677 flutter::DlISize(800, 600),
nullptr,
true);
3678 XCTAssertTrue([flutterPlatformViewsController
3679 submitFrame:std::move(mock_surface)
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,
3704 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3705 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3706 flutter::DlISize(800, 600),
nullptr,
true);
3707 XCTAssertTrue([flutterPlatformViewsController
3708 submitFrame:std::move(mock_surface)
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;
3720 flutter::TaskRunners runners(
self.name.UTF8String,
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)];
3767 flutter::MutatorsStack stack;
3768 flutter::DlMatrix finalMatrix;
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)];
3779 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3780 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3781 nullptr, framebuffer_info,
3782 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3783 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3784 flutter::DlISize(800, 600),
nullptr,
true);
3785 XCTAssertTrue([flutterPlatformViewsController
3786 submitFrame:std::move(mock_surface)
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,
3811 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3812 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3813 flutter::DlISize(800, 600),
nullptr,
true);
3814 XCTAssertTrue([flutterPlatformViewsController
3815 submitFrame:std::move(mock_surface)
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;
3914 flutter::TaskRunners runners(
self.name.UTF8String,
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;
3950 flutter::MutatorsStack stack1;
3952 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
3953 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
3954 stack1.PushTransform(screenScaleMatrix);
3956 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
3957 stack1.PushClipRect(rect);
3959 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3960 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
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)];
3974 flutter::MutatorsStack stack2;
3975 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3976 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
3977 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
3978 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
3979 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3980 withParams:std::move(embeddedViewParams3)];
3981 [flutterPlatformViewsController
3988 [flutterPlatformViewsController
3992 @"viewType" : @"MockFlutterPlatformView"
3996 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
3997 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
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;
4015 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4063 flutter::MutatorsStack stack1;
4065 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4066 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4067 stack1.PushTransform(screenScaleMatrix);
4069 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4070 stack1.PushClipRect(rect);
4072 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4073 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
4075 flutter::MutatorsStack stack2;
4076 stack2.PushClipRect(rect);
4077 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4078 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
4103 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4140 flutter::MutatorsStack stack1;
4142 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4143 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4144 stack1.PushTransform(screenScaleMatrix);
4146 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4147 stack1.PushClipRect(rect);
4149 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4150 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
4152 flutter::MutatorsStack stack2;
4153 stack2.PushClipRect(rect);
4154 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4155 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
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;
4200 flutter::TaskRunners runners(
self.name.UTF8String,
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)];
4247 flutter::MutatorsStack stack;
4248 flutter::DlMatrix finalMatrix;
4249 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4250 finalMatrix, flutter::DlSize(300, 300), stack);
4251 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4252 withParams:std::move(embeddedViewParams0)];
4254 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4255 finalMatrix, flutter::DlSize(300, 300), stack);
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];
4271 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4272 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4273 nullptr, framebuffer_info,
4274 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4275 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4276 flutter::DlISize(800, 600),
nullptr,
4278 XCTAssertTrue([flutterPlatformViewsController
4279 submitFrame:std::move(mock_surface)
4280 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4284 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
4285 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4291 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4292 flutter::MutatorsStack stack;
4293 flutter::DlMatrix finalMatrix;
4294 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4295 finalMatrix, flutter::DlSize(300, 300), stack);
4296 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4297 withParams:std::move(embeddedViewParams1)];
4299 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4300 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4301 nullptr, framebuffer_info,
4302 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4303 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4304 flutter::DlISize(800, 600),
nullptr,
true);
4305 XCTAssertTrue([flutterPlatformViewsController
4306 submitFrame:std::move(mock_surface)
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;
4318 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4352 flutter::MutatorsStack stack;
4354 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4355 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4356 stack.PushTransform(screenScaleMatrix);
4358 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4359 stack.PushTransform(translateMatrix);
4360 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4362 auto embeddedViewParams =
4363 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4365 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4366 withParams:std::move(embeddedViewParams)];
4368 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4369 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4370 nullptr, framebuffer_info,
4371 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4372 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4373 flutter::DlISize(800, 600),
nullptr,
true);
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;
4388 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4422 flutter::MutatorsStack stack;
4424 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4425 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4426 stack.PushTransform(screenScaleMatrix);
4428 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4429 stack.PushTransform(translateMatrix);
4430 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4432 auto embeddedViewParams =
4433 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4435 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4436 withParams:std::move(embeddedViewParams)];
4438 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4439 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4440 nullptr, framebuffer_info,
4441 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4442 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4443 flutter::DlISize(800, 600),
nullptr,
true);
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;
4460 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4495 flutter::MutatorsStack stack;
4497 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4498 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4499 stack.PushTransform(screenScaleMatrix);
4501 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4502 stack.PushTransform(translateMatrix);
4503 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4505 auto embeddedViewParams =
4506 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4508 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4509 withParams:std::move(embeddedViewParams)];
4511 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4512 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4513 nullptr, framebuffer_info,
4514 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4515 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4516 flutter::DlISize(800, 600),
nullptr,
true);
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 {
4534 XCTAssertTrue(
engine.platformView !=
nullptr);
4535 auto ios_context =
engine.platformView->GetIosContext();
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;
4558 flutter::TaskRunners runners(
self.name.UTF8String,
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)];
4603 flutter::MutatorsStack stack;
4604 flutter::DlMatrix finalMatrix;
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)];
4615 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4616 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
4617 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4618 nullptr, framebuffer_info,
4619 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4620 [&](
const flutter::SurfaceFrame& surface_frame) {
4621 submit_info = surface_frame.submit_info();
4624 flutter::DlISize(800, 600),
nullptr,
4626 mock_surface->set_submit_info({
4627 .frame_damage = flutter::DlIRect::MakeWH(800, 600),
4628 .buffer_damage = flutter::DlIRect::MakeWH(400, 600),
4631 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4632 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4634 XCTAssertTrue(submit_info.has_value());
4635 XCTAssertEqual(*submit_info->frame_damage, flutter::DlIRect::MakeWH(800, 600));
4636 XCTAssertEqual(*submit_info->buffer_damage, flutter::DlIRect::MakeWH(400, 600));
4639 - (void)testClipSuperellipse {
4640 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4642 flutter::TaskRunners runners(
self.name.UTF8String,
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;
4679 flutter::MutatorsStack stack;
4681 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4682 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4683 stack.PushTransform(screenScaleMatrix);
4685 flutter::DlRect rect = flutter::DlRect::MakeXYWH(3, 3, 5, 5);
4686 stack.PushClipRSE(flutter::DlRoundSuperellipse::MakeOval(rect));
4688 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4689 screenScaleMatrix, flutter::DlSize(10, 10), stack);
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()),
4706 CGPointMake(rect.GetRight(), rect.GetTop()),
4707 CGPointMake(rect.GetLeft(), rect.GetBottom()),
4708 CGPointMake(rect.GetRight(), rect.GetBottom())};
4709 for (
auto point : corners) {
4710 int alpha = [
self alphaOfPoint:point onView:flutterView];
4711 XCTAssertNotEqual(alpha, 255);
4714 CGPointMake(rect.GetLeft() + rect.GetWidth() / 2, rect.GetTop() + rect.GetHeight() / 2);
4715 int alpha = [
self alphaOfPoint:center onView:flutterView];
4716 XCTAssertEqual(alpha, 255);
void(^ FlutterResult)(id _Nullable result)
NSMutableArray * backdropFilterSubviews()
void applyBlurBackdropFilters:(NSArray< PlatformViewFilter * > *filters)
FlutterClippingMaskView * getMaskViewWithFrame:(CGRect frame)
void insertViewToPoolIfNeeded:(FlutterClippingMaskView *maskView)
Storage for Overlay layers across frames.
void CreateLayer(const std::shared_ptr< IOSContext > &ios_context, MTLPixelFormat pixel_format)
Create a new overlay layer.
instancetype methodCallWithMethodName:arguments:(NSString *method,[arguments] id _Nullable arguments)