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 if (@available(iOS 18.2, *)) {
3203 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3204 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3206 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3207 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3212 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3213 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3215 flutter::TaskRunners runners(
self.name.UTF8String,
3216 GetDefaultTaskRunner(),
3217 GetDefaultTaskRunner(),
3218 GetDefaultTaskRunner(),
3219 GetDefaultTaskRunner());
3222 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3223 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3226 flutterPlatformViewsController,
3229 std::make_shared<fml::SyncSwitch>());
3233 [flutterPlatformViewsController
3235 withId:@"MockWrapperWebView"
3239 [flutterPlatformViewsController
3242 arguments:@{@"id" : @2, @"viewType" : @"MockWrapperWebView"}]
3249 while (touchInteceptorView != nil &&
3251 touchInteceptorView = touchInteceptorView.superview;
3253 XCTAssertNotNil(touchInteceptorView);
3255 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3256 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3257 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3264 if (@available(iOS 18.2, *)) {
3266 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3267 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3269 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3270 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3275 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3276 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3278 flutter::TaskRunners runners(
self.name.UTF8String,
3279 GetDefaultTaskRunner(),
3280 GetDefaultTaskRunner(),
3281 GetDefaultTaskRunner(),
3282 GetDefaultTaskRunner());
3285 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3286 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3289 flutterPlatformViewsController,
3292 std::make_shared<fml::SyncSwitch>());
3296 [flutterPlatformViewsController
3298 withId:@"MockNestedWrapperWebView"
3302 [flutterPlatformViewsController
3306 @"viewType" : @"MockNestedWrapperWebView"
3314 while (touchInteceptorView != nil &&
3316 touchInteceptorView = touchInteceptorView.superview;
3318 XCTAssertNotNil(touchInteceptorView);
3320 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3321 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3322 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3329 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3330 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3334 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3335 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3337 flutter::TaskRunners runners(
self.name.UTF8String,
3338 GetDefaultTaskRunner(),
3339 GetDefaultTaskRunner(),
3340 GetDefaultTaskRunner(),
3341 GetDefaultTaskRunner());
3344 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3345 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3348 flutterPlatformViewsController,
3351 std::make_shared<fml::SyncSwitch>());
3355 [flutterPlatformViewsController
3357 withId:@"MockFlutterPlatformView"
3361 [flutterPlatformViewsController
3365 @"viewType" : @"MockFlutterPlatformView"
3373 while (touchInteceptorView != nil &&
3375 touchInteceptorView = touchInteceptorView.superview;
3377 XCTAssertNotNil(touchInteceptorView);
3379 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3380 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3381 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3388 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3389 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3392 - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
3393 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3395 flutter::TaskRunners runners(
self.name.UTF8String,
3396 GetDefaultTaskRunner(),
3397 GetDefaultTaskRunner(),
3398 GetDefaultTaskRunner(),
3399 GetDefaultTaskRunner());
3402 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3403 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3406 flutterPlatformViewsController,
3409 std::make_shared<fml::SyncSwitch>());
3413 [flutterPlatformViewsController
3415 withId:@"MockFlutterPlatformView"
3419 [flutterPlatformViewsController
3423 @"viewType" : @"MockFlutterPlatformView"
3430 flutter::MutatorsStack stack;
3431 flutter::DlMatrix finalMatrix;
3433 auto embeddedViewParams_1 =
3434 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3436 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3437 withParams:std::move(embeddedViewParams_1)];
3438 [flutterPlatformViewsController
3442 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3443 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3444 nullptr, framebuffer_info,
3445 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return false; },
3446 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3447 flutter::DlISize(800, 600));
3448 XCTAssertFalse([flutterPlatformViewsController
3449 submitFrame:std::move(mock_surface)
3450 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3452 auto embeddedViewParams_2 =
3453 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3454 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3455 withParams:std::move(embeddedViewParams_2)];
3456 [flutterPlatformViewsController
3460 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
3461 nullptr, framebuffer_info,
3462 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3463 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3464 flutter::DlISize(800, 600));
3465 XCTAssertTrue([flutterPlatformViewsController
3466 submitFrame:std::move(mock_surface_submit_true)
3467 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3471 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
3472 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3474 flutter::TaskRunners runners(
self.name.UTF8String,
3475 GetDefaultTaskRunner(),
3476 GetDefaultTaskRunner(),
3477 GetDefaultTaskRunner(),
3478 GetDefaultTaskRunner());
3481 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3482 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3485 flutterPlatformViewsController,
3488 std::make_shared<fml::SyncSwitch>());
3490 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3491 flutterPlatformViewsController.
flutterView = flutterView;
3495 [flutterPlatformViewsController
3497 withId:@"MockFlutterPlatformView"
3503 [flutterPlatformViewsController
3507 @"viewType" : @"MockFlutterPlatformView"
3511 flutter::MutatorsStack stack;
3512 flutter::DlMatrix finalMatrix;
3513 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
3514 finalMatrix, flutter::DlSize(300, 300), stack);
3515 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3516 withParams:std::move(embeddedViewParams)];
3522 [flutterPlatformViewsController
reset];
3527 - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
3528 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3530 flutter::TaskRunners runners(
self.name.UTF8String,
3531 GetDefaultTaskRunner(),
3532 GetDefaultTaskRunner(),
3533 GetDefaultTaskRunner(),
3534 GetDefaultTaskRunner());
3537 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3538 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3541 flutterPlatformViewsController,
3544 std::make_shared<fml::SyncSwitch>());
3546 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3547 flutterPlatformViewsController.
flutterView = flutterView;
3551 [flutterPlatformViewsController
3553 withId:@"MockFlutterPlatformView"
3558 [flutterPlatformViewsController
3562 @"viewType" : @"MockFlutterPlatformView"
3567 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3568 flutter::MutatorsStack stack;
3569 flutter::DlMatrix finalMatrix;
3570 auto embeddedViewParams1 =
3571 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3572 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3573 withParams:std::move(embeddedViewParams1)];
3574 [flutterPlatformViewsController
3581 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3584 auto embeddedViewParams2 =
3585 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3586 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3587 withParams:std::move(embeddedViewParams2)];
3588 [flutterPlatformViewsController
3596 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
3597 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3599 flutter::TaskRunners runners(
self.name.UTF8String,
3600 GetDefaultTaskRunner(),
3601 GetDefaultTaskRunner(),
3602 GetDefaultTaskRunner(),
3603 GetDefaultTaskRunner());
3606 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3607 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3610 flutterPlatformViewsController,
3613 std::make_shared<fml::SyncSwitch>());
3615 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3616 flutterPlatformViewsController.
flutterView = flutterView;
3620 [flutterPlatformViewsController
3622 withId:@"MockFlutterPlatformView"
3626 [flutterPlatformViewsController
3630 @"viewType" : @"MockFlutterPlatformView"
3636 [flutterPlatformViewsController
3640 @"viewType" : @"MockFlutterPlatformView"
3645 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3646 flutter::MutatorsStack stack;
3647 flutter::DlMatrix finalMatrix;
3648 auto embeddedViewParams1 =
3649 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3650 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3651 withParams:std::move(embeddedViewParams1)];
3653 auto embeddedViewParams2 =
3654 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(500, 500), stack);
3655 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3656 withParams:std::move(embeddedViewParams2)];
3658 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3659 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3660 nullptr, framebuffer_info,
3661 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3662 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3663 flutter::DlISize(800, 600),
nullptr,
true);
3664 XCTAssertTrue([flutterPlatformViewsController
3665 submitFrame:std::move(mock_surface)
3666 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3669 UIView* clippingView1 = view1.superview.superview;
3670 UIView* clippingView2 = view2.superview.superview;
3671 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3672 [flutterView.subviews indexOfObject:clippingView2],
3673 @"The first clipping view should be added before the second clipping view.");
3676 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3678 embeddedViewParams2 =
3679 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(500, 500), stack);
3680 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3681 withParams:std::move(embeddedViewParams2)];
3683 embeddedViewParams1 =
3684 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3685 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3686 withParams:std::move(embeddedViewParams1)];
3688 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3689 nullptr, framebuffer_info,
3690 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3691 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3692 flutter::DlISize(800, 600),
nullptr,
true);
3693 XCTAssertTrue([flutterPlatformViewsController
3694 submitFrame:std::move(mock_surface)
3695 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3697 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
3698 [flutterView.subviews indexOfObject:clippingView2],
3699 @"The first clipping view should be added after the second clipping view.");
3703 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
3704 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3706 flutter::TaskRunners runners(
self.name.UTF8String,
3707 GetDefaultTaskRunner(),
3708 GetDefaultTaskRunner(),
3709 GetDefaultTaskRunner(),
3710 GetDefaultTaskRunner());
3713 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3714 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3717 flutterPlatformViewsController,
3720 std::make_shared<fml::SyncSwitch>());
3722 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3723 flutterPlatformViewsController.
flutterView = flutterView;
3727 [flutterPlatformViewsController
3729 withId:@"MockFlutterPlatformView"
3733 [flutterPlatformViewsController
3737 @"viewType" : @"MockFlutterPlatformView"
3743 [flutterPlatformViewsController
3747 @"viewType" : @"MockFlutterPlatformView"
3752 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3753 flutter::MutatorsStack stack;
3754 flutter::DlMatrix finalMatrix;
3755 auto embeddedViewParams1 =
3756 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3757 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3758 withParams:std::move(embeddedViewParams1)];
3760 auto embeddedViewParams2 =
3761 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(500, 500), stack);
3762 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3763 withParams:std::move(embeddedViewParams2)];
3765 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3766 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3767 nullptr, framebuffer_info,
3768 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3769 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3770 flutter::DlISize(800, 600),
nullptr,
true);
3771 XCTAssertTrue([flutterPlatformViewsController
3772 submitFrame:std::move(mock_surface)
3773 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3776 UIView* clippingView1 = view1.superview.superview;
3777 UIView* clippingView2 = view2.superview.superview;
3778 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3779 [flutterView.subviews indexOfObject:clippingView2],
3780 @"The first clipping view should be added before the second clipping view.");
3783 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
3785 embeddedViewParams1 =
3786 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
3787 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3788 withParams:std::move(embeddedViewParams1)];
3790 embeddedViewParams2 =
3791 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(500, 500), stack);
3792 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3793 withParams:std::move(embeddedViewParams2)];
3795 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3796 nullptr, framebuffer_info,
3797 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3798 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3799 flutter::DlISize(800, 600),
nullptr,
true);
3800 XCTAssertTrue([flutterPlatformViewsController
3801 submitFrame:std::move(mock_surface)
3802 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3804 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3805 [flutterView.subviews indexOfObject:clippingView2],
3806 @"The first clipping view should be added before the second clipping view.");
3809 - (int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
3810 unsigned char pixel[4] = {0};
3812 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
3815 CGContextRef context =
3816 CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace,
3817 static_cast<uint32_t
>(kCGBitmapAlphaInfoMask) &
3818 static_cast<uint32_t
>(kCGImageAlphaPremultipliedLast));
3819 CGContextTranslateCTM(context, -point.x, -point.y);
3820 [view.layer renderInContext:context];
3822 CGContextRelease(context);
3823 CGColorSpaceRelease(colorSpace);
3828 - (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
3830 UIWindow* window = [[UIWindow alloc] init];
3831 UITextField* textField = [[UITextField alloc] init];
3832 [window addSubview:textField];
3834 [textField becomeFirstResponder];
3835 XCTAssertTrue(textField.isFirstResponder);
3836 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
3837 [textField resignFirstResponder];
3838 XCTAssertFalse(textField.isFirstResponder);
3839 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
3842 - (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
3844 UIWindow* window = [[UIWindow alloc] init];
3845 UIView* view = [[UIView alloc] init];
3846 UIView* childView = [[UIView alloc] init];
3847 UITextField* textField = [[UITextField alloc] init];
3848 [window addSubview:view];
3849 [view addSubview:childView];
3850 [childView addSubview:textField];
3852 [textField becomeFirstResponder];
3853 XCTAssertTrue(textField.isFirstResponder);
3854 XCTAssertTrue(view.flt_hasFirstResponderInViewHierarchySubtree);
3855 [textField resignFirstResponder];
3856 XCTAssertFalse(textField.isFirstResponder);
3857 XCTAssertFalse(view.flt_hasFirstResponderInViewHierarchySubtree);
3860 - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
3866 CGRect newRect = CGRectMake(0, 0, 10, 10);
3870 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
3871 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
3872 XCTAssertEqualObjects(set1, set2);
3873 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
3874 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
3877 - (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
3882 XCTAssertNotEqual(view1, view3);
3883 XCTAssertNotEqual(view2, view3);
3886 - (void)testMaskViewsReleasedWhenPoolIsReleased {
3887 __weak UIView* weakView;
3892 XCTAssertNotNil(weakView);
3894 XCTAssertNil(weakView);
3897 - (void)testClipMaskViewIsReused {
3898 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3900 flutter::TaskRunners runners(
self.name.UTF8String,
3901 GetDefaultTaskRunner(),
3902 GetDefaultTaskRunner(),
3903 GetDefaultTaskRunner(),
3904 GetDefaultTaskRunner());
3907 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3908 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3911 flutterPlatformViewsController,
3914 std::make_shared<fml::SyncSwitch>());
3918 [flutterPlatformViewsController
3920 withId:@"MockFlutterPlatformView"
3924 [flutterPlatformViewsController
3928 @"viewType" : @"MockFlutterPlatformView"
3933 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
3934 flutterPlatformViewsController.
flutterView = flutterView;
3936 flutter::MutatorsStack stack1;
3938 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
3939 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
3940 stack1.PushTransform(screenScaleMatrix);
3942 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
3943 stack1.PushClipRect(rect);
3945 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3946 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
3948 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3949 withParams:std::move(embeddedViewParams1)];
3950 [flutterPlatformViewsController
3955 UIView* maskView1 = childClippingView1.maskView;
3956 XCTAssertNotNil(maskView1);
3959 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(100, 100)];
3960 flutter::MutatorsStack stack2;
3961 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3962 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
3963 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
3964 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
3965 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3966 withParams:std::move(embeddedViewParams3)];
3967 [flutterPlatformViewsController
3974 [flutterPlatformViewsController
3978 @"viewType" : @"MockFlutterPlatformView"
3982 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
3983 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
3984 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3985 withParams:std::move(embeddedViewParams4)];
3986 [flutterPlatformViewsController
3992 UIView* maskView2 = childClippingView2.maskView;
3993 XCTAssertEqual(maskView1, maskView2);
3994 XCTAssertNotNil(childClippingView2.maskView);
3995 XCTAssertNil(childClippingView1.maskView);
3998 - (void)testDifferentClipMaskViewIsUsedForEachView {
3999 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4001 flutter::TaskRunners runners(
self.name.UTF8String,
4002 GetDefaultTaskRunner(),
4003 GetDefaultTaskRunner(),
4004 GetDefaultTaskRunner(),
4005 GetDefaultTaskRunner());
4008 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4009 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4012 flutterPlatformViewsController,
4015 std::make_shared<fml::SyncSwitch>());
4019 [flutterPlatformViewsController
4021 withId:@"MockFlutterPlatformView"
4026 [flutterPlatformViewsController
4030 @"viewType" : @"MockFlutterPlatformView"
4036 [flutterPlatformViewsController
4040 @"viewType" : @"MockFlutterPlatformView"
4046 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4047 flutterPlatformViewsController.
flutterView = flutterView;
4049 flutter::MutatorsStack stack1;
4051 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4052 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4053 stack1.PushTransform(screenScaleMatrix);
4055 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4056 stack1.PushClipRect(rect);
4058 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4059 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
4061 flutter::MutatorsStack stack2;
4062 stack2.PushClipRect(rect);
4063 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4064 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
4066 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4067 withParams:std::move(embeddedViewParams1)];
4068 [flutterPlatformViewsController
4072 UIView* childClippingView1 = view1.superview.superview;
4074 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4075 withParams:std::move(embeddedViewParams2)];
4076 [flutterPlatformViewsController
4080 UIView* childClippingView2 = view2.superview.superview;
4081 UIView* maskView1 = childClippingView1.maskView;
4082 UIView* maskView2 = childClippingView2.maskView;
4083 XCTAssertNotEqual(maskView1, maskView2);
4086 - (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4087 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4089 flutter::TaskRunners runners(
self.name.UTF8String,
4090 GetDefaultTaskRunner(),
4091 GetDefaultTaskRunner(),
4092 GetDefaultTaskRunner(),
4093 GetDefaultTaskRunner());
4096 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4097 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4100 flutterPlatformViewsController,
4103 std::make_shared<fml::SyncSwitch>());
4107 [flutterPlatformViewsController
4109 withId:@"MockFlutterPlatformView"
4114 [flutterPlatformViewsController
4118 @"viewType" : @"MockFlutterPlatformView"
4123 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4124 flutterPlatformViewsController.
flutterView = flutterView;
4126 flutter::MutatorsStack stack1;
4128 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4129 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4130 stack1.PushTransform(screenScaleMatrix);
4132 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4133 stack1.PushClipRect(rect);
4135 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4136 screenScaleMatrix, flutter::DlSize(10, 10), stack1);
4138 flutter::MutatorsStack stack2;
4139 stack2.PushClipRect(rect);
4140 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4141 screenScaleMatrix, flutter::DlSize(10, 10), stack2);
4143 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4144 withParams:std::move(embeddedViewParams1)];
4145 [flutterPlatformViewsController
4151 UIView* maskView = childClippingView.maskView;
4152 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer
class]],
4153 @"Mask view must use CAShapeLayer as its backing layer.");
4161 - (BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4162 expectedFrame:(CGRect)frame
4163 inputRadius:(CGFloat)inputRadius {
4164 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4165 for (UIView* view in visualEffectView.subviews) {
4166 if (![NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
4169 XCTAssertEqual(view.layer.filters.count, 1u);
4170 NSObject* filter = view.layer.filters.firstObject;
4172 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4174 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4175 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber
class]] &&
4176 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4183 - (void)testDisposingViewInCompositionOrderDoNotCrash {
4184 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4186 flutter::TaskRunners runners(
self.name.UTF8String,
4187 GetDefaultTaskRunner(),
4188 GetDefaultTaskRunner(),
4189 GetDefaultTaskRunner(),
4190 GetDefaultTaskRunner());
4193 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4194 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4197 flutterPlatformViewsController,
4200 std::make_shared<fml::SyncSwitch>());
4202 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4203 flutterPlatformViewsController.
flutterView = flutterView;
4207 [flutterPlatformViewsController
4209 withId:@"MockFlutterPlatformView"
4214 [flutterPlatformViewsController
4218 @"viewType" : @"MockFlutterPlatformView"
4221 [flutterPlatformViewsController
4225 @"viewType" : @"MockFlutterPlatformView"
4232 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4233 flutter::MutatorsStack stack;
4234 flutter::DlMatrix finalMatrix;
4235 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4236 finalMatrix, flutter::DlSize(300, 300), stack);
4237 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4238 withParams:std::move(embeddedViewParams0)];
4240 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4241 finalMatrix, flutter::DlSize(300, 300), stack);
4242 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4243 withParams:std::move(embeddedViewParams1)];
4247 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
4249 [expectation fulfill];
4252 [flutterPlatformViewsController
4255 [
self waitForExpectationsWithTimeout:30 handler:nil];
4257 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4258 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4259 nullptr, framebuffer_info,
4260 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4261 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4262 flutter::DlISize(800, 600),
nullptr,
4264 XCTAssertTrue([flutterPlatformViewsController
4265 submitFrame:std::move(mock_surface)
4266 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4270 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
4271 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4277 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4278 flutter::MutatorsStack stack;
4279 flutter::DlMatrix finalMatrix;
4280 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4281 finalMatrix, flutter::DlSize(300, 300), stack);
4282 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4283 withParams:std::move(embeddedViewParams1)];
4285 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4286 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4287 nullptr, framebuffer_info,
4288 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4289 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4290 flutter::DlISize(800, 600),
nullptr,
true);
4291 XCTAssertTrue([flutterPlatformViewsController
4292 submitFrame:std::move(mock_surface)
4293 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4297 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
4298 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4301 - (void)testOnlyPlatformViewsAreRemovedWhenReset {
4302 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4304 flutter::TaskRunners runners(
self.name.UTF8String,
4305 GetDefaultTaskRunner(),
4306 GetDefaultTaskRunner(),
4307 GetDefaultTaskRunner(),
4308 GetDefaultTaskRunner());
4311 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4312 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4315 flutterPlatformViewsController,
4318 std::make_shared<fml::SyncSwitch>());
4322 [flutterPlatformViewsController
4324 withId:@"MockFlutterPlatformView"
4328 [flutterPlatformViewsController
4332 @"viewType" : @"MockFlutterPlatformView"
4335 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4336 flutterPlatformViewsController.
flutterView = flutterView;
4338 flutter::MutatorsStack stack;
4340 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4341 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4342 stack.PushTransform(screenScaleMatrix);
4344 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4345 stack.PushTransform(translateMatrix);
4346 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4348 auto embeddedViewParams =
4349 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4351 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4352 withParams:std::move(embeddedViewParams)];
4354 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4355 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4356 nullptr, framebuffer_info,
4357 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4358 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4359 flutter::DlISize(800, 600),
nullptr,
true);
4360 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4361 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4363 UIView* someView = [[UIView alloc] init];
4364 [flutterView addSubview:someView];
4366 [flutterPlatformViewsController
reset];
4367 XCTAssertEqual(flutterView.subviews.count, 1u);
4368 XCTAssertEqual(flutterView.subviews.firstObject, someView);
4371 - (void)testResetClearsPreviousCompositionOrder {
4372 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4374 flutter::TaskRunners runners(
self.name.UTF8String,
4375 GetDefaultTaskRunner(),
4376 GetDefaultTaskRunner(),
4377 GetDefaultTaskRunner(),
4378 GetDefaultTaskRunner());
4381 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4382 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4385 flutterPlatformViewsController,
4388 std::make_shared<fml::SyncSwitch>());
4392 [flutterPlatformViewsController
4394 withId:@"MockFlutterPlatformView"
4398 [flutterPlatformViewsController
4402 @"viewType" : @"MockFlutterPlatformView"
4405 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4406 flutterPlatformViewsController.
flutterView = flutterView;
4408 flutter::MutatorsStack stack;
4410 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4411 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4412 stack.PushTransform(screenScaleMatrix);
4414 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4415 stack.PushTransform(translateMatrix);
4416 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4418 auto embeddedViewParams =
4419 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4421 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4422 withParams:std::move(embeddedViewParams)];
4424 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4425 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4426 nullptr, framebuffer_info,
4427 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4428 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4429 flutter::DlISize(800, 600),
nullptr,
true);
4430 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4431 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4437 [flutterPlatformViewsController
reset];
4443 - (void)testNilPlatformViewDoesntCrash {
4444 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4446 flutter::TaskRunners runners(
self.name.UTF8String,
4447 GetDefaultTaskRunner(),
4448 GetDefaultTaskRunner(),
4449 GetDefaultTaskRunner(),
4450 GetDefaultTaskRunner());
4453 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4454 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4457 flutterPlatformViewsController,
4460 std::make_shared<fml::SyncSwitch>());
4464 [flutterPlatformViewsController
4466 withId:@"MockFlutterPlatformView"
4470 [flutterPlatformViewsController
4474 @"viewType" : @"MockFlutterPlatformView"
4477 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4478 flutterPlatformViewsController.
flutterView = flutterView;
4481 flutter::MutatorsStack stack;
4483 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4484 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4485 stack.PushTransform(screenScaleMatrix);
4487 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4488 stack.PushTransform(translateMatrix);
4489 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4491 auto embeddedViewParams =
4492 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4494 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4495 withParams:std::move(embeddedViewParams)];
4497 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4498 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4499 nullptr, framebuffer_info,
4500 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4501 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4502 flutter::DlISize(800, 600),
nullptr,
true);
4503 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4504 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4506 XCTAssertEqual(flutterView.subviews.count, 1u);
4509 - (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
4511 NSObject* container = [[NSObject alloc] init];
4512 [touchInteceptorView setFlutterAccessibilityContainer:container];
4513 XCTAssertEqualObjects([touchInteceptorView accessibilityContainer], container);
4516 - (void)testLayerPool {
4520 XCTAssertTrue(
engine.platformView !=
nullptr);
4521 auto ios_context =
engine.platformView->GetIosContext();
4526 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4527 XCTAssertEqual(pool.size(), 1u);
4528 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4529 XCTAssertEqual(pool.size(), 2u);
4532 pool.RecycleLayers();
4533 XCTAssertEqual(pool.size(), 2u);
4536 auto unused_layers = pool.RemoveUnusedLayers();
4537 XCTAssertEqual(unused_layers.size(), 2u);
4538 XCTAssertEqual(pool.size(), 1u);
4541 - (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
4542 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4544 flutter::TaskRunners runners(
self.name.UTF8String,
4545 GetDefaultTaskRunner(),
4546 GetDefaultTaskRunner(),
4547 GetDefaultTaskRunner(),
4548 GetDefaultTaskRunner());
4551 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4552 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4555 flutterPlatformViewsController,
4558 std::make_shared<fml::SyncSwitch>());
4560 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4561 flutterPlatformViewsController.
flutterView = flutterView;
4565 [flutterPlatformViewsController
4567 withId:@"MockFlutterPlatformView"
4571 [flutterPlatformViewsController
4575 @"viewType" : @"MockFlutterPlatformView"
4580 [flutterPlatformViewsController
4584 @"viewType" : @"MockFlutterPlatformView"
4588 [flutterPlatformViewsController beginFrameWithSize:flutter::DlISize(300, 300)];
4589 flutter::MutatorsStack stack;
4590 flutter::DlMatrix finalMatrix;
4591 auto embeddedViewParams1 =
4592 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(300, 300), stack);
4593 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4594 withParams:std::move(embeddedViewParams1)];
4596 auto embeddedViewParams2 =
4597 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, flutter::DlSize(500, 500), stack);
4598 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4599 withParams:std::move(embeddedViewParams2)];
4601 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4602 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
4603 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4604 nullptr, framebuffer_info,
4605 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4606 [&](
const flutter::SurfaceFrame& surface_frame) {
4607 submit_info = surface_frame.submit_info();
4610 flutter::DlISize(800, 600),
nullptr,
4612 mock_surface->set_submit_info({
4613 .frame_damage = flutter::DlIRect::MakeWH(800, 600),
4614 .buffer_damage = flutter::DlIRect::MakeWH(400, 600),
4617 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4618 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4620 XCTAssertTrue(submit_info.has_value());
4621 XCTAssertEqual(*submit_info->frame_damage, flutter::DlIRect::MakeWH(800, 600));
4622 XCTAssertEqual(*submit_info->buffer_damage, flutter::DlIRect::MakeWH(400, 600));
4625 - (void)testClipSuperellipse {
4626 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4628 flutter::TaskRunners runners(
self.name.UTF8String,
4629 GetDefaultTaskRunner(),
4630 GetDefaultTaskRunner(),
4631 GetDefaultTaskRunner(),
4632 GetDefaultTaskRunner());
4635 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4636 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4639 flutterPlatformViewsController,
4642 std::make_shared<fml::SyncSwitch>());
4646 [flutterPlatformViewsController
4648 withId:@"MockFlutterPlatformView"
4652 [flutterPlatformViewsController
4656 @"viewType" : @"MockFlutterPlatformView"
4662 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4663 flutterPlatformViewsController.
flutterView = flutterView;
4665 flutter::MutatorsStack stack;
4667 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4668 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4669 stack.PushTransform(screenScaleMatrix);
4671 flutter::DlRect rect = flutter::DlRect::MakeXYWH(3, 3, 5, 5);
4672 stack.PushClipRSE(flutter::DlRoundSuperellipse::MakeOval(rect));
4674 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4675 screenScaleMatrix, flutter::DlSize(10, 10), stack);
4677 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4678 withParams:std::move(embeddedViewParams)];
4679 [flutterPlatformViewsController
4686 [flutterView addSubview:childClippingView];
4688 [flutterView setNeedsLayout];
4689 [flutterView layoutIfNeeded];
4691 CGPoint corners[] = {CGPointMake(rect.GetLeft(), rect.GetTop()),
4692 CGPointMake(rect.GetRight(), rect.GetTop()),
4693 CGPointMake(rect.GetLeft(), rect.GetBottom()),
4694 CGPointMake(rect.GetRight(), rect.GetBottom())};
4695 for (
auto point : corners) {
4696 int alpha = [
self alphaOfPoint:point onView:flutterView];
4697 XCTAssertNotEqual(alpha, 255);
4700 CGPointMake(rect.GetLeft() + rect.GetWidth() / 2, rect.GetTop() + rect.GetHeight() / 2);
4701 int alpha = [
self alphaOfPoint:center onView:flutterView];
4702 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)