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 = std::make_unique<flutter::EmbeddedViewParams>(
346 flutter::ToSkMatrix(finalMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(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 = std::make_unique<flutter::EmbeddedViewParams>(
1669 flutter::ToSkMatrix(finalMatrix), SkSize::Make(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 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
1731 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(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:SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10)];
1739 [flutterPlatformViewsController
1745 [flutterView addSubview:childClippingView];
1747 [flutterView setNeedsLayout];
1748 [flutterView layoutIfNeeded];
1751 NSUInteger numberOfExpectedVisualEffectView = 0;
1752 for (UIView* subview in childClippingView.subviews) {
1753 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1756 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1757 if ([
self validateOneVisualEffectView:subview
1758 expectedFrame:CGRectMake(0, 0, 10, 10)
1760 numberOfExpectedVisualEffectView++;
1763 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1766 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
1767 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
1768 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(0, 0)];
1769 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1770 withParams:std::move(embeddedViewParams2)];
1771 [flutterPlatformViewsController
1777 [flutterView setNeedsLayout];
1778 [flutterView layoutIfNeeded];
1780 numberOfExpectedVisualEffectView = 0;
1781 for (UIView* subview in childClippingView.subviews) {
1782 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1785 numberOfExpectedVisualEffectView++;
1787 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1790 - (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1791 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1793 flutter::TaskRunners runners(
self.name.UTF8String,
1794 GetDefaultTaskRunner(),
1795 GetDefaultTaskRunner(),
1796 GetDefaultTaskRunner(),
1797 GetDefaultTaskRunner());
1800 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1801 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1804 flutterPlatformViewsController,
1807 std::make_shared<fml::SyncSwitch>());
1811 [flutterPlatformViewsController
1813 withId:@"MockFlutterPlatformView"
1817 [flutterPlatformViewsController
1821 @"viewType" : @"MockFlutterPlatformView"
1827 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1828 flutterPlatformViewsController.
flutterView = flutterView;
1830 flutter::MutatorsStack stack;
1832 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1833 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1834 stack.PushTransform(screenScaleMatrix);
1836 flutter::DlMatrix rotateMatrix = flutter::DlMatrix::MakeRotationZ(flutter::DlDegrees(10));
1837 stack.PushTransform(rotateMatrix);
1838 flutter::DlMatrix finalMatrix = screenScaleMatrix * rotateMatrix;
1840 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1841 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
1843 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1844 withParams:std::move(embeddedViewParams)];
1845 [flutterPlatformViewsController
1849 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1850 toView:flutterView];
1856 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
1858 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
1861 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
1864 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
1868 - (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
1869 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1871 flutter::TaskRunners runners(
self.name.UTF8String,
1872 GetDefaultTaskRunner(),
1873 GetDefaultTaskRunner(),
1874 GetDefaultTaskRunner(),
1875 GetDefaultTaskRunner());
1878 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1879 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1882 flutterPlatformViewsController,
1885 std::make_shared<fml::SyncSwitch>());
1889 [flutterPlatformViewsController
1891 withId:@"MockFlutterPlatformView"
1895 [flutterPlatformViewsController
1899 @"viewType" : @"MockFlutterPlatformView"
1905 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1906 flutterPlatformViewsController.
flutterView = flutterView;
1908 flutter::MutatorsStack stack;
1910 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1911 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1912 stack.PushTransform(screenScaleMatrix);
1913 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({5, 5});
1915 stack.PushTransform(translateMatrix);
1917 flutter::DlRect rect = flutter::DlRect::MakeXYWH(0, 0, 25, 25);
1918 stack.PushClipRect(rect);
1921 flutter::DlRect rect_for_rrect = flutter::DlRect::MakeXYWH(-1, -1, 25, 25);
1922 flutter::DlRoundRect rrect = flutter::DlRoundRect::MakeRectXY(rect_for_rrect, 1, 1);
1923 stack.PushClipRRect(rrect);
1925 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1926 flutter::ToSkMatrix(screenScaleMatrix * translateMatrix), SkSize::Make(5, 5), stack);
1928 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
1929 withParams:std::move(embeddedViewParams)];
1930 [flutterPlatformViewsController
1937 [flutterView addSubview:childClippingView];
1939 [flutterView setNeedsLayout];
1940 [flutterView layoutIfNeeded];
1941 XCTAssertNil(childClippingView.maskView);
1944 - (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
1945 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1947 flutter::TaskRunners runners(
self.name.UTF8String,
1948 GetDefaultTaskRunner(),
1949 GetDefaultTaskRunner(),
1950 GetDefaultTaskRunner(),
1951 GetDefaultTaskRunner());
1954 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
1955 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1958 flutterPlatformViewsController,
1961 std::make_shared<fml::SyncSwitch>());
1965 [flutterPlatformViewsController
1967 withId:@"MockFlutterPlatformView"
1971 [flutterPlatformViewsController
1975 @"viewType" : @"MockFlutterPlatformView"
1981 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1982 flutterPlatformViewsController.
flutterView = flutterView;
1984 flutter::MutatorsStack stack;
1986 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
1987 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
1988 stack.PushTransform(screenScaleMatrix);
1989 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({5, 5});
1991 stack.PushTransform(translateMatrix);
1995 flutter::DlRect rect_for_rrect = flutter::DlRect::MakeXYWH(0, 0, 10, 10);
1996 flutter::DlRoundRect rrect = flutter::DlRoundRect::MakeRectXY(rect_for_rrect, 1, 1);
1997 stack.PushClipRRect(rrect);
1999 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2000 flutter::ToSkMatrix(screenScaleMatrix * translateMatrix), SkSize::Make(5, 5), stack);
2002 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2003 withParams:std::move(embeddedViewParams)];
2004 [flutterPlatformViewsController
2011 [flutterView addSubview:childClippingView];
2013 [flutterView setNeedsLayout];
2014 [flutterView layoutIfNeeded];
2016 XCTAssertNotNil(childClippingView.maskView);
2019 - (void)testClipRect {
2020 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2022 flutter::TaskRunners runners(
self.name.UTF8String,
2023 GetDefaultTaskRunner(),
2024 GetDefaultTaskRunner(),
2025 GetDefaultTaskRunner(),
2026 GetDefaultTaskRunner());
2029 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2030 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2033 flutterPlatformViewsController,
2036 std::make_shared<fml::SyncSwitch>());
2040 [flutterPlatformViewsController
2042 withId:@"MockFlutterPlatformView"
2046 [flutterPlatformViewsController
2050 @"viewType" : @"MockFlutterPlatformView"
2056 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2057 flutterPlatformViewsController.
flutterView = flutterView;
2059 flutter::MutatorsStack stack;
2061 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2062 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2063 stack.PushTransform(screenScaleMatrix);
2065 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
2066 stack.PushClipRect(rect);
2068 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2069 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2071 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2072 withParams:std::move(embeddedViewParams)];
2073 [flutterPlatformViewsController
2080 [flutterView addSubview:childClippingView];
2082 [flutterView setNeedsLayout];
2083 [flutterView layoutIfNeeded];
2085 CGRect insideClipping = CGRectMake(2, 2, 3, 3);
2086 for (
int i = 0; i < 10; i++) {
2087 for (
int j = 0; j < 10; j++) {
2088 CGPoint point = CGPointMake(i, j);
2089 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2090 if (CGRectContainsPoint(insideClipping, point)) {
2091 XCTAssertEqual(alpha, 255);
2093 XCTAssertEqual(alpha, 0);
2099 - (void)testClipRect_multipleClips {
2100 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2102 flutter::TaskRunners runners(
self.name.UTF8String,
2103 GetDefaultTaskRunner(),
2104 GetDefaultTaskRunner(),
2105 GetDefaultTaskRunner(),
2106 GetDefaultTaskRunner());
2109 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2110 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2113 flutterPlatformViewsController,
2116 std::make_shared<fml::SyncSwitch>());
2120 [flutterPlatformViewsController
2122 withId:@"MockFlutterPlatformView"
2126 [flutterPlatformViewsController
2130 @"viewType" : @"MockFlutterPlatformView"
2136 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2137 flutterPlatformViewsController.
flutterView = flutterView;
2139 flutter::MutatorsStack stack;
2141 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2142 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2143 stack.PushTransform(screenScaleMatrix);
2145 flutter::DlRect rect1 = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
2146 stack.PushClipRect(rect1);
2148 flutter::DlRect rect2 = flutter::DlRect::MakeXYWH(3, 3, 3, 3);
2149 stack.PushClipRect(rect2);
2151 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2152 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2154 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2155 withParams:std::move(embeddedViewParams)];
2156 [flutterPlatformViewsController
2163 [flutterView addSubview:childClippingView];
2165 [flutterView setNeedsLayout];
2166 [flutterView layoutIfNeeded];
2185 CGRect insideClipping = CGRectMake(3, 3, 2, 2);
2186 for (
int i = 0; i < 10; i++) {
2187 for (
int j = 0; j < 10; j++) {
2188 CGPoint point = CGPointMake(i, j);
2189 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2190 if (CGRectContainsPoint(insideClipping, point)) {
2191 XCTAssertEqual(alpha, 255);
2193 XCTAssertEqual(alpha, 0);
2199 - (void)testClipRRect {
2200 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2202 flutter::TaskRunners runners(
self.name.UTF8String,
2203 GetDefaultTaskRunner(),
2204 GetDefaultTaskRunner(),
2205 GetDefaultTaskRunner(),
2206 GetDefaultTaskRunner());
2209 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2210 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2213 flutterPlatformViewsController,
2216 std::make_shared<fml::SyncSwitch>());
2220 [flutterPlatformViewsController
2222 withId:@"MockFlutterPlatformView"
2226 [flutterPlatformViewsController
2230 @"viewType" : @"MockFlutterPlatformView"
2236 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2237 flutterPlatformViewsController.
flutterView = flutterView;
2239 flutter::MutatorsStack stack;
2241 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2242 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2243 stack.PushTransform(screenScaleMatrix);
2245 flutter::DlRoundRect rrect =
2246 flutter::DlRoundRect::MakeRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2247 stack.PushClipRRect(rrect);
2249 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2250 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2252 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2253 withParams:std::move(embeddedViewParams)];
2254 [flutterPlatformViewsController
2261 [flutterView addSubview:childClippingView];
2263 [flutterView setNeedsLayout];
2264 [flutterView layoutIfNeeded];
2285 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2286 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2287 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2288 for (
int i = 0; i < 10; i++) {
2289 for (
int j = 0; j < 10; j++) {
2290 CGPoint point = CGPointMake(i, j);
2291 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2292 if (CGRectContainsPoint(innerClipping1, point) ||
2293 CGRectContainsPoint(innerClipping2, point)) {
2295 XCTAssertEqual(alpha, 255);
2296 }
else if (CGRectContainsPoint(outterClipping, point)) {
2298 XCTAssert(0 < alpha && alpha < 255);
2301 XCTAssertEqual(alpha, 0);
2307 - (void)testClipRRect_multipleClips {
2308 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2310 flutter::TaskRunners runners(
self.name.UTF8String,
2311 GetDefaultTaskRunner(),
2312 GetDefaultTaskRunner(),
2313 GetDefaultTaskRunner(),
2314 GetDefaultTaskRunner());
2317 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2318 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2321 flutterPlatformViewsController,
2324 std::make_shared<fml::SyncSwitch>());
2328 [flutterPlatformViewsController
2330 withId:@"MockFlutterPlatformView"
2334 [flutterPlatformViewsController
2338 @"viewType" : @"MockFlutterPlatformView"
2344 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2345 flutterPlatformViewsController.
flutterView = flutterView;
2347 flutter::MutatorsStack stack;
2349 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2350 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2351 stack.PushTransform(screenScaleMatrix);
2353 flutter::DlRoundRect rrect =
2354 flutter::DlRoundRect::MakeRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2355 stack.PushClipRRect(rrect);
2357 flutter::DlRect rect = flutter::DlRect::MakeXYWH(4, 2, 6, 6);
2358 stack.PushClipRect(rect);
2360 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2361 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2363 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2364 withParams:std::move(embeddedViewParams)];
2365 [flutterPlatformViewsController
2372 [flutterView addSubview:childClippingView];
2374 [flutterView setNeedsLayout];
2375 [flutterView layoutIfNeeded];
2396 CGRect clipping = CGRectMake(4, 2, 4, 6);
2397 for (
int i = 0; i < 10; i++) {
2398 for (
int j = 0; j < 10; j++) {
2399 CGPoint point = CGPointMake(i, j);
2400 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2401 if (i == 7 && (j == 2 || j == 7)) {
2403 XCTAssert(0 < alpha && alpha < 255);
2406 (i == 4 && j >= 2 && j <= 7) ||
2408 (i == 7 && j >= 2 && j <= 7) ||
2410 (j == 2 && i >= 4 && i <= 7) ||
2412 (j == 7 && i >= 4 && i <= 7)) {
2415 XCTAssert(alpha > 127);
2416 }
else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) ||
2417 (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) {
2420 XCTAssert(alpha < 127);
2421 }
else if (CGRectContainsPoint(clipping, point)) {
2423 XCTAssertEqual(alpha, 255);
2426 XCTAssertEqual(alpha, 0);
2432 - (void)testClipPath {
2433 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2435 flutter::TaskRunners runners(
self.name.UTF8String,
2436 GetDefaultTaskRunner(),
2437 GetDefaultTaskRunner(),
2438 GetDefaultTaskRunner(),
2439 GetDefaultTaskRunner());
2442 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2443 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2446 flutterPlatformViewsController,
2449 std::make_shared<fml::SyncSwitch>());
2453 [flutterPlatformViewsController
2455 withId:@"MockFlutterPlatformView"
2459 [flutterPlatformViewsController
2463 @"viewType" : @"MockFlutterPlatformView"
2469 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2470 flutterPlatformViewsController.
flutterView = flutterView;
2472 flutter::MutatorsStack stack;
2474 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2475 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2476 stack.PushTransform(screenScaleMatrix);
2478 flutter::DlPath path =
2479 flutter::DlPath::MakeRoundRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2480 stack.PushClipPath(path);
2482 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2483 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2485 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2486 withParams:std::move(embeddedViewParams)];
2487 [flutterPlatformViewsController
2494 [flutterView addSubview:childClippingView];
2496 [flutterView setNeedsLayout];
2497 [flutterView layoutIfNeeded];
2518 CGRect innerClipping1 = CGRectMake(3, 2, 4, 6);
2519 CGRect innerClipping2 = CGRectMake(2, 3, 6, 4);
2520 CGRect outterClipping = CGRectMake(2, 2, 6, 6);
2521 for (
int i = 0; i < 10; i++) {
2522 for (
int j = 0; j < 10; j++) {
2523 CGPoint point = CGPointMake(i, j);
2524 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2525 if (CGRectContainsPoint(innerClipping1, point) ||
2526 CGRectContainsPoint(innerClipping2, point)) {
2528 XCTAssertEqual(alpha, 255);
2529 }
else if (CGRectContainsPoint(outterClipping, point)) {
2531 XCTAssert(0 < alpha && alpha < 255);
2534 XCTAssertEqual(alpha, 0);
2540 - (void)testClipPath_multipleClips {
2541 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2543 flutter::TaskRunners runners(
self.name.UTF8String,
2544 GetDefaultTaskRunner(),
2545 GetDefaultTaskRunner(),
2546 GetDefaultTaskRunner(),
2547 GetDefaultTaskRunner());
2550 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2551 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2554 flutterPlatformViewsController,
2557 std::make_shared<fml::SyncSwitch>());
2561 [flutterPlatformViewsController
2563 withId:@"MockFlutterPlatformView"
2567 [flutterPlatformViewsController
2571 @"viewType" : @"MockFlutterPlatformView"
2577 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2578 flutterPlatformViewsController.
flutterView = flutterView;
2580 flutter::MutatorsStack stack;
2582 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
2583 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
2584 stack.PushTransform(screenScaleMatrix);
2586 flutter::DlPath path =
2587 flutter::DlPath::MakeRoundRectXY(flutter::DlRect::MakeXYWH(2, 2, 6, 6), 1, 1);
2588 stack.PushClipPath(path);
2590 flutter::DlRect rect = flutter::DlRect::MakeXYWH(4, 2, 6, 6);
2591 stack.PushClipRect(rect);
2593 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
2594 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
2596 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
2597 withParams:std::move(embeddedViewParams)];
2598 [flutterPlatformViewsController
2605 [flutterView addSubview:childClippingView];
2607 [flutterView setNeedsLayout];
2608 [flutterView layoutIfNeeded];
2629 CGRect clipping = CGRectMake(4, 2, 4, 6);
2630 for (
int i = 0; i < 10; i++) {
2631 for (
int j = 0; j < 10; j++) {
2632 CGPoint point = CGPointMake(i, j);
2633 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:flutterView];
2634 if (i == 7 && (j == 2 || j == 7)) {
2636 XCTAssert(0 < alpha && alpha < 255);
2639 (i == 4 && j >= 2 && j <= 7) ||
2641 (i == 7 && j >= 2 && j <= 7) ||
2643 (j == 2 && i >= 4 && i <= 7) ||
2645 (j == 7 && i >= 4 && i <= 7)) {
2648 XCTAssert(alpha > 127);
2649 }
else if ((i == 3 && j >= 1 && j <= 8) || (i == 8 && j >= 1 && j <= 8) ||
2650 (j == 1 && i >= 3 && i <= 8) || (j == 8 && i >= 3 && i <= 8)) {
2653 XCTAssert(alpha < 127);
2654 }
else if (CGRectContainsPoint(clipping, point)) {
2656 XCTAssertEqual(alpha, 255);
2659 XCTAssertEqual(alpha, 0);
2665 - (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
2666 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2668 flutter::TaskRunners runners(
self.name.UTF8String,
2669 GetDefaultTaskRunner(),
2670 GetDefaultTaskRunner(),
2671 GetDefaultTaskRunner(),
2672 GetDefaultTaskRunner());
2675 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2676 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2679 flutterPlatformViewsController,
2682 std::make_shared<fml::SyncSwitch>());
2686 [flutterPlatformViewsController
2688 withId:@"MockFlutterPlatformView"
2692 [flutterPlatformViewsController
2696 @"viewType" : @"MockFlutterPlatformView"
2704 while (touchInteceptorView != nil &&
2706 touchInteceptorView = touchInteceptorView.superview;
2708 XCTAssertNotNil(touchInteceptorView);
2711 UIGestureRecognizer* forwardGectureRecognizer = nil;
2712 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2714 forwardGectureRecognizer = gestureRecognizer;
2720 NSSet* touches1 = [[NSSet alloc] init];
2721 id event1 = OCMClassMock([UIEvent
class]);
2723 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2724 OCMReject([flutterViewController touchesBegan:touches1 withEvent:event1]);
2727 NSSet* touches2 = [[NSSet alloc] init];
2728 id event2 = OCMClassMock([UIEvent
class]);
2730 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2731 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2734 - (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
2735 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2737 flutter::TaskRunners runners(
self.name.UTF8String,
2738 GetDefaultTaskRunner(),
2739 GetDefaultTaskRunner(),
2740 GetDefaultTaskRunner(),
2741 GetDefaultTaskRunner());
2744 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2745 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2748 flutterPlatformViewsController,
2751 std::make_shared<fml::SyncSwitch>());
2755 [flutterPlatformViewsController
2757 withId:@"MockFlutterPlatformView"
2761 [flutterPlatformViewsController
2765 @"viewType" : @"MockFlutterPlatformView"
2773 while (touchInteceptorView != nil &&
2775 touchInteceptorView = touchInteceptorView.superview;
2777 XCTAssertNotNil(touchInteceptorView);
2780 UIGestureRecognizer* forwardGectureRecognizer = nil;
2781 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2783 forwardGectureRecognizer = gestureRecognizer;
2792 NSSet* touches1 = [[NSSet alloc] init];
2793 id event1 = OCMClassMock([UIEvent
class]);
2794 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2795 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2800 NSSet* touches2 = [[NSSet alloc] init];
2801 id event2 = OCMClassMock([UIEvent
class]);
2802 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2803 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2805 NSSet* touches3 = [[NSSet alloc] init];
2806 id event3 = OCMClassMock([UIEvent
class]);
2807 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2808 OCMVerify([flutterViewController touchesEnded:touches3 withEvent:event3]);
2811 NSSet* touches4 = [[NSSet alloc] init];
2812 id event4 = OCMClassMock([UIEvent
class]);
2813 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2814 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2816 NSSet* touches5 = [[NSSet alloc] init];
2817 id event5 = OCMClassMock([UIEvent
class]);
2818 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2819 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2826 NSSet* touches1 = [[NSSet alloc] init];
2827 id event1 = OCMClassMock([UIEvent
class]);
2828 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2829 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2834 NSSet* touches2 = [[NSSet alloc] init];
2835 id event2 = OCMClassMock([UIEvent
class]);
2836 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2837 OCMVerify([flutterViewController touchesMoved:touches2 withEvent:event2]);
2839 NSSet* touches3 = [[NSSet alloc] init];
2840 id event3 = OCMClassMock([UIEvent
class]);
2841 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2842 OCMVerify([flutterViewController forceTouchesCancelled:touches3]);
2845 NSSet* touches4 = [[NSSet alloc] init];
2846 id event4 = OCMClassMock([UIEvent
class]);
2847 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2848 OCMReject([flutterViewController touchesBegan:touches4 withEvent:event4]);
2850 NSSet* touches5 = [[NSSet alloc] init];
2851 id event5 = OCMClassMock([UIEvent
class]);
2852 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2853 OCMReject([flutterViewController touchesEnded:touches5 withEvent:event5]);
2856 [flutterPlatformViewsController
reset];
2860 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2861 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2863 flutter::TaskRunners runners(
self.name.UTF8String,
2864 GetDefaultTaskRunner(),
2865 GetDefaultTaskRunner(),
2866 GetDefaultTaskRunner(),
2867 GetDefaultTaskRunner());
2870 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2871 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2874 flutterPlatformViewsController,
2877 std::make_shared<fml::SyncSwitch>());
2881 [flutterPlatformViewsController
2883 withId:@"MockFlutterPlatformView"
2887 [flutterPlatformViewsController
2891 @"viewType" : @"MockFlutterPlatformView"
2899 while (touchInteceptorView != nil &&
2901 touchInteceptorView = touchInteceptorView.superview;
2903 XCTAssertNotNil(touchInteceptorView);
2906 UIGestureRecognizer* forwardGectureRecognizer = nil;
2907 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2909 forwardGectureRecognizer = gestureRecognizer;
2917 NSSet* touches1 = [NSSet setWithObject:@1];
2918 id event1 = OCMClassMock([UIEvent
class]);
2919 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2920 OCMVerify([flutterViewController touchesBegan:touches1 withEvent:event1]);
2927 NSSet* touches2 = [NSSet setWithObject:@1];
2928 id event2 = OCMClassMock([UIEvent
class]);
2929 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2930 OCMVerify([flutterViewController touchesBegan:touches2 withEvent:event2]);
2931 OCMReject([flutterViewController2 touchesBegan:touches2 withEvent:event2]);
2933 NSSet* touches3 = [NSSet setWithObject:@1];
2934 id event3 = OCMClassMock([UIEvent
class]);
2935 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
2936 OCMVerify([flutterViewController touchesMoved:touches3 withEvent:event3]);
2937 OCMReject([flutterViewController2 touchesMoved:touches3 withEvent:event3]);
2939 NSSet* touches4 = [NSSet setWithObject:@1];
2940 id event4 = OCMClassMock([UIEvent
class]);
2941 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
2942 OCMVerify([flutterViewController touchesEnded:touches4 withEvent:event4]);
2943 OCMReject([flutterViewController2 touchesEnded:touches4 withEvent:event4]);
2945 NSSet* touches5 = [NSSet setWithObject:@1];
2946 id event5 = OCMClassMock([UIEvent
class]);
2947 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2948 OCMVerify([flutterViewController touchesEnded:touches5 withEvent:event5]);
2949 OCMReject([flutterViewController2 touchesEnded:touches5 withEvent:event5]);
2953 NSSet* touches6 = [NSSet setWithObject:@1];
2954 id event6 = OCMClassMock([UIEvent
class]);
2955 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
2956 OCMVerify([flutterViewController2 touchesBegan:touches6 withEvent:event6]);
2957 OCMReject([flutterViewController touchesBegan:touches6 withEvent:event6]);
2960 NSSet* touches7 = [NSSet setWithObject:@1];
2961 id event7 = OCMClassMock([UIEvent
class]);
2962 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
2963 OCMVerify([flutterViewController2 touchesMoved:touches7 withEvent:event7]);
2964 OCMReject([flutterViewController touchesMoved:touches7 withEvent:event7]);
2966 NSSet* touches8 = [NSSet setWithObject:@1];
2967 id event8 = OCMClassMock([UIEvent
class]);
2968 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
2969 OCMVerify([flutterViewController2 touchesEnded:touches8 withEvent:event8]);
2970 OCMReject([flutterViewController touchesEnded:touches8 withEvent:event8]);
2972 [flutterPlatformViewsController
reset];
2975 - (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
2976 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2978 flutter::TaskRunners runners(
self.name.UTF8String,
2979 GetDefaultTaskRunner(),
2980 GetDefaultTaskRunner(),
2981 GetDefaultTaskRunner(),
2982 GetDefaultTaskRunner());
2985 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
2986 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2989 flutterPlatformViewsController,
2992 std::make_shared<fml::SyncSwitch>());
2996 [flutterPlatformViewsController
2998 withId:@"MockFlutterPlatformView"
3002 [flutterPlatformViewsController
3006 @"viewType" : @"MockFlutterPlatformView"
3014 while (touchInteceptorView != nil &&
3016 touchInteceptorView = touchInteceptorView.superview;
3018 XCTAssertNotNil(touchInteceptorView);
3021 UIGestureRecognizer* forwardGectureRecognizer = nil;
3022 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3024 forwardGectureRecognizer = gestureRecognizer;
3031 NSSet* touches1 = [NSSet setWithObject:@1];
3032 id event1 = OCMClassMock([UIEvent
class]);
3033 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
3035 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
3036 OCMVerify([flutterViewController forceTouchesCancelled:touches1]);
3038 [flutterPlatformViewsController
reset];
3041 - (void)testFlutterPlatformViewTouchesEndedOrTouchesCancelledEventDoesNotFailTheGestureRecognizer {
3042 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3044 flutter::TaskRunners runners(
self.name.UTF8String,
3045 GetDefaultTaskRunner(),
3046 GetDefaultTaskRunner(),
3047 GetDefaultTaskRunner(),
3048 GetDefaultTaskRunner());
3051 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3052 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3055 flutterPlatformViewsController,
3058 std::make_shared<fml::SyncSwitch>());
3062 [flutterPlatformViewsController
3064 withId:@"MockFlutterPlatformView"
3068 [flutterPlatformViewsController
3072 @"viewType" : @"MockFlutterPlatformView"
3080 while (touchInteceptorView != nil &&
3082 touchInteceptorView = touchInteceptorView.superview;
3084 XCTAssertNotNil(touchInteceptorView);
3087 __block UIGestureRecognizer* forwardGestureRecognizer = nil;
3088 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3090 forwardGestureRecognizer = gestureRecognizer;
3097 NSSet* touches1 = [NSSet setWithObject:@1];
3098 id event1 = OCMClassMock([UIEvent
class]);
3099 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3100 @"Forwarding gesture recognizer must start with possible state.");
3101 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3102 [forwardGestureRecognizer touchesEnded:touches1 withEvent:event1];
3103 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3104 @"Forwarding gesture recognizer must end with failed state.");
3106 XCTestExpectation* touchEndedExpectation =
3107 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3108 dispatch_async(dispatch_get_main_queue(), ^{
3110 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3111 if ([gestureRecognizer isKindOfClass:[ForwardingGestureRecognizer class]]) {
3112 forwardGestureRecognizer = gestureRecognizer;
3116 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3117 @"Forwarding gesture recognizer must be reset to possible state.");
3118 [touchEndedExpectation fulfill];
3120 [
self waitForExpectationsWithTimeout:30 handler:nil];
3122 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3123 @"Forwarding gesture recognizer must start with possible state.");
3124 [forwardGestureRecognizer touchesBegan:touches1 withEvent:event1];
3125 [forwardGestureRecognizer touchesCancelled:touches1 withEvent:event1];
3126 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStateFailed,
3127 @"Forwarding gesture recognizer must end with failed state.");
3128 XCTestExpectation* touchCancelledExpectation =
3129 [
self expectationWithDescription:@"Wait for gesture recognizer's state change."];
3130 dispatch_async(dispatch_get_main_queue(), ^{
3132 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
3133 if ([gestureRecognizer isKindOfClass:[ForwardingGestureRecognizer class]]) {
3134 forwardGestureRecognizer = gestureRecognizer;
3138 XCTAssert(forwardGestureRecognizer.state == UIGestureRecognizerStatePossible,
3139 @"Forwarding gesture recognizer must be reset to possible state.");
3140 [touchCancelledExpectation fulfill];
3142 [
self waitForExpectationsWithTimeout:30 handler:nil];
3144 [flutterPlatformViewsController reset];
3148 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWebView {
3149 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3151 flutter::TaskRunners runners(
self.name.UTF8String,
3152 GetDefaultTaskRunner(),
3153 GetDefaultTaskRunner(),
3154 GetDefaultTaskRunner(),
3155 GetDefaultTaskRunner());
3158 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3159 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3162 flutterPlatformViewsController,
3165 std::make_shared<fml::SyncSwitch>());
3169 [flutterPlatformViewsController
3175 [flutterPlatformViewsController
3178 arguments:@{@"id" : @2, @"viewType" : @"MockWebView"}]
3185 while (touchInteceptorView != nil &&
3187 touchInteceptorView = touchInteceptorView.superview;
3189 XCTAssertNotNil(touchInteceptorView);
3191 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3192 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3193 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3200 BOOL shouldReAddDelayingRecognizer = NO;
3201 if (@available(iOS 26.0, *)) {
3204 }
else if (@available(iOS 18.2, *)) {
3205 shouldReAddDelayingRecognizer = YES;
3207 if (shouldReAddDelayingRecognizer) {
3209 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3210 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3212 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3213 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3218 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3219 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3221 flutter::TaskRunners runners(
self.name.UTF8String,
3222 GetDefaultTaskRunner(),
3223 GetDefaultTaskRunner(),
3224 GetDefaultTaskRunner(),
3225 GetDefaultTaskRunner());
3228 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3229 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3232 flutterPlatformViewsController,
3235 std::make_shared<fml::SyncSwitch>());
3239 [flutterPlatformViewsController
3241 withId:@"MockWrapperWebView"
3245 [flutterPlatformViewsController
3248 arguments:@{@"id" : @2, @"viewType" : @"MockWrapperWebView"}]
3255 while (touchInteceptorView != nil &&
3257 touchInteceptorView = touchInteceptorView.superview;
3259 XCTAssertNotNil(touchInteceptorView);
3261 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3262 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3263 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3270 BOOL shouldReAddDelayingRecognizer = NO;
3271 if (@available(iOS 26.0, *)) {
3274 }
else if (@available(iOS 18.2, *)) {
3275 shouldReAddDelayingRecognizer = YES;
3277 if (shouldReAddDelayingRecognizer) {
3279 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3280 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3282 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3283 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3288 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3289 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3291 flutter::TaskRunners runners(
self.name.UTF8String,
3292 GetDefaultTaskRunner(),
3293 GetDefaultTaskRunner(),
3294 GetDefaultTaskRunner(),
3295 GetDefaultTaskRunner());
3298 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3299 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3302 flutterPlatformViewsController,
3305 std::make_shared<fml::SyncSwitch>());
3309 [flutterPlatformViewsController
3311 withId:@"MockNestedWrapperWebView"
3315 [flutterPlatformViewsController
3319 @"viewType" : @"MockNestedWrapperWebView"
3327 while (touchInteceptorView != nil &&
3329 touchInteceptorView = touchInteceptorView.superview;
3331 XCTAssertNotNil(touchInteceptorView);
3333 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3334 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3335 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3342 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3343 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3347 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3348 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3350 flutter::TaskRunners runners(
self.name.UTF8String,
3351 GetDefaultTaskRunner(),
3352 GetDefaultTaskRunner(),
3353 GetDefaultTaskRunner(),
3354 GetDefaultTaskRunner());
3357 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3358 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3361 flutterPlatformViewsController,
3364 std::make_shared<fml::SyncSwitch>());
3368 [flutterPlatformViewsController
3370 withId:@"MockFlutterPlatformView"
3374 [flutterPlatformViewsController
3378 @"viewType" : @"MockFlutterPlatformView"
3386 while (touchInteceptorView != nil &&
3388 touchInteceptorView = touchInteceptorView.superview;
3390 XCTAssertNotNil(touchInteceptorView);
3392 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3393 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3394 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3401 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3402 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3405 - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
3406 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3408 flutter::TaskRunners runners(
self.name.UTF8String,
3409 GetDefaultTaskRunner(),
3410 GetDefaultTaskRunner(),
3411 GetDefaultTaskRunner(),
3412 GetDefaultTaskRunner());
3415 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3416 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3419 flutterPlatformViewsController,
3422 std::make_shared<fml::SyncSwitch>());
3426 [flutterPlatformViewsController
3428 withId:@"MockFlutterPlatformView"
3432 [flutterPlatformViewsController
3436 @"viewType" : @"MockFlutterPlatformView"
3443 flutter::MutatorsStack stack;
3444 flutter::DlMatrix finalMatrix;
3446 auto embeddedViewParams_1 = std::make_unique<flutter::EmbeddedViewParams>(
3447 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3449 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3450 withParams:std::move(embeddedViewParams_1)];
3451 [flutterPlatformViewsController
3455 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3456 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3457 nullptr, framebuffer_info,
3458 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return false; },
3459 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3460 SkISize::Make(800, 600));
3461 XCTAssertFalse([flutterPlatformViewsController
3462 submitFrame:std::move(mock_surface)
3463 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3465 auto embeddedViewParams_2 = std::make_unique<flutter::EmbeddedViewParams>(
3466 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3467 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3468 withParams:std::move(embeddedViewParams_2)];
3469 [flutterPlatformViewsController
3473 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
3474 nullptr, framebuffer_info,
3475 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3476 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3477 SkISize::Make(800, 600));
3478 XCTAssertTrue([flutterPlatformViewsController
3479 submitFrame:std::move(mock_surface_submit_true)
3480 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3484 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
3485 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3487 flutter::TaskRunners runners(
self.name.UTF8String,
3488 GetDefaultTaskRunner(),
3489 GetDefaultTaskRunner(),
3490 GetDefaultTaskRunner(),
3491 GetDefaultTaskRunner());
3494 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3495 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3498 flutterPlatformViewsController,
3501 std::make_shared<fml::SyncSwitch>());
3503 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3504 flutterPlatformViewsController.
flutterView = flutterView;
3508 [flutterPlatformViewsController
3510 withId:@"MockFlutterPlatformView"
3516 [flutterPlatformViewsController
3520 @"viewType" : @"MockFlutterPlatformView"
3524 flutter::MutatorsStack stack;
3525 flutter::DlMatrix finalMatrix;
3526 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
3527 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3528 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3529 withParams:std::move(embeddedViewParams)];
3535 [flutterPlatformViewsController
reset];
3540 - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
3541 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3543 flutter::TaskRunners runners(
self.name.UTF8String,
3544 GetDefaultTaskRunner(),
3545 GetDefaultTaskRunner(),
3546 GetDefaultTaskRunner(),
3547 GetDefaultTaskRunner());
3550 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3551 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3554 flutterPlatformViewsController,
3557 std::make_shared<fml::SyncSwitch>());
3559 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3560 flutterPlatformViewsController.
flutterView = flutterView;
3564 [flutterPlatformViewsController
3566 withId:@"MockFlutterPlatformView"
3571 [flutterPlatformViewsController
3575 @"viewType" : @"MockFlutterPlatformView"
3580 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3581 flutter::MutatorsStack stack;
3582 flutter::DlMatrix finalMatrix;
3583 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3584 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3585 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3586 withParams:std::move(embeddedViewParams1)];
3587 [flutterPlatformViewsController
3594 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3597 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3598 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3599 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3600 withParams:std::move(embeddedViewParams2)];
3601 [flutterPlatformViewsController
3609 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
3610 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3612 flutter::TaskRunners runners(
self.name.UTF8String,
3613 GetDefaultTaskRunner(),
3614 GetDefaultTaskRunner(),
3615 GetDefaultTaskRunner(),
3616 GetDefaultTaskRunner());
3619 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3620 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3623 flutterPlatformViewsController,
3626 std::make_shared<fml::SyncSwitch>());
3628 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3629 flutterPlatformViewsController.
flutterView = flutterView;
3633 [flutterPlatformViewsController
3635 withId:@"MockFlutterPlatformView"
3639 [flutterPlatformViewsController
3643 @"viewType" : @"MockFlutterPlatformView"
3649 [flutterPlatformViewsController
3653 @"viewType" : @"MockFlutterPlatformView"
3658 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3659 flutter::MutatorsStack stack;
3660 flutter::DlMatrix finalMatrix;
3661 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3662 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3663 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3664 withParams:std::move(embeddedViewParams1)];
3666 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3667 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3668 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3669 withParams:std::move(embeddedViewParams2)];
3671 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3672 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3673 nullptr, framebuffer_info,
3674 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3675 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3676 SkISize::Make(800, 600),
nullptr,
true);
3677 XCTAssertTrue([flutterPlatformViewsController
3678 submitFrame:std::move(mock_surface)
3679 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3682 UIView* clippingView1 = view1.superview.superview;
3683 UIView* clippingView2 = view2.superview.superview;
3684 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3685 [flutterView.subviews indexOfObject:clippingView2],
3686 @"The first clipping view should be added before the second clipping view.");
3689 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3691 embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3692 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3693 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3694 withParams:std::move(embeddedViewParams2)];
3696 embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3697 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3698 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3699 withParams:std::move(embeddedViewParams1)];
3701 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3702 nullptr, framebuffer_info,
3703 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3704 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3705 SkISize::Make(800, 600),
nullptr,
true);
3706 XCTAssertTrue([flutterPlatformViewsController
3707 submitFrame:std::move(mock_surface)
3708 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3710 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
3711 [flutterView.subviews indexOfObject:clippingView2],
3712 @"The first clipping view should be added after the second clipping view.");
3716 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
3717 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3719 flutter::TaskRunners runners(
self.name.UTF8String,
3720 GetDefaultTaskRunner(),
3721 GetDefaultTaskRunner(),
3722 GetDefaultTaskRunner(),
3723 GetDefaultTaskRunner());
3726 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3727 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3730 flutterPlatformViewsController,
3733 std::make_shared<fml::SyncSwitch>());
3735 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3736 flutterPlatformViewsController.
flutterView = flutterView;
3740 [flutterPlatformViewsController
3742 withId:@"MockFlutterPlatformView"
3746 [flutterPlatformViewsController
3750 @"viewType" : @"MockFlutterPlatformView"
3756 [flutterPlatformViewsController
3760 @"viewType" : @"MockFlutterPlatformView"
3765 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3766 flutter::MutatorsStack stack;
3767 flutter::DlMatrix finalMatrix;
3768 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3769 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3770 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3771 withParams:std::move(embeddedViewParams1)];
3773 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3774 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3775 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3776 withParams:std::move(embeddedViewParams2)];
3778 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3779 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3780 nullptr, framebuffer_info,
3781 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3782 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3783 SkISize::Make(800, 600),
nullptr,
true);
3784 XCTAssertTrue([flutterPlatformViewsController
3785 submitFrame:std::move(mock_surface)
3786 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3789 UIView* clippingView1 = view1.superview.superview;
3790 UIView* clippingView2 = view2.superview.superview;
3791 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3792 [flutterView.subviews indexOfObject:clippingView2],
3793 @"The first clipping view should be added before the second clipping view.");
3796 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3798 embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3799 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3800 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3801 withParams:std::move(embeddedViewParams1)];
3803 embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3804 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3805 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3806 withParams:std::move(embeddedViewParams2)];
3808 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3809 nullptr, framebuffer_info,
3810 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3811 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3812 SkISize::Make(800, 600),
nullptr,
true);
3813 XCTAssertTrue([flutterPlatformViewsController
3814 submitFrame:std::move(mock_surface)
3815 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3817 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3818 [flutterView.subviews indexOfObject:clippingView2],
3819 @"The first clipping view should be added before the second clipping view.");
3822 - (int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
3823 unsigned char pixel[4] = {0};
3825 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
3828 CGContextRef context = CGBitmapContextCreate(
3829 pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
3830 CGContextTranslateCTM(context, -point.x, -point.y);
3831 [view.layer renderInContext:context];
3833 CGContextRelease(context);
3834 CGColorSpaceRelease(colorSpace);
3839 - (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
3841 UIWindow* window = [[UIWindow alloc] init];
3842 UITextField* textField = [[UITextField alloc] init];
3843 [window addSubview:textField];
3845 [textField becomeFirstResponder];
3846 XCTAssertTrue(textField.isFirstResponder);
3847 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
3848 [textField resignFirstResponder];
3849 XCTAssertFalse(textField.isFirstResponder);
3850 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
3853 - (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
3855 UIWindow* window = [[UIWindow alloc] init];
3856 UIView* view = [[UIView alloc] init];
3857 UIView* childView = [[UIView alloc] init];
3858 UITextField* textField = [[UITextField alloc] init];
3859 [window addSubview:view];
3860 [view addSubview:childView];
3861 [childView addSubview:textField];
3863 [textField becomeFirstResponder];
3864 XCTAssertTrue(textField.isFirstResponder);
3865 XCTAssertTrue(view.flt_hasFirstResponderInViewHierarchySubtree);
3866 [textField resignFirstResponder];
3867 XCTAssertFalse(textField.isFirstResponder);
3868 XCTAssertFalse(view.flt_hasFirstResponderInViewHierarchySubtree);
3871 - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
3877 CGRect newRect = CGRectMake(0, 0, 10, 10);
3881 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
3882 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
3883 XCTAssertEqualObjects(set1, set2);
3884 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
3885 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
3888 - (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
3893 XCTAssertNotEqual(view1, view3);
3894 XCTAssertNotEqual(view2, view3);
3897 - (void)testMaskViewsReleasedWhenPoolIsReleased {
3898 __weak UIView* weakView;
3903 XCTAssertNotNil(weakView);
3905 XCTAssertNil(weakView);
3908 - (void)testClipMaskViewIsReused {
3909 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3911 flutter::TaskRunners runners(
self.name.UTF8String,
3912 GetDefaultTaskRunner(),
3913 GetDefaultTaskRunner(),
3914 GetDefaultTaskRunner(),
3915 GetDefaultTaskRunner());
3918 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3919 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3922 flutterPlatformViewsController,
3925 std::make_shared<fml::SyncSwitch>());
3929 [flutterPlatformViewsController
3931 withId:@"MockFlutterPlatformView"
3935 [flutterPlatformViewsController
3939 @"viewType" : @"MockFlutterPlatformView"
3944 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
3945 flutterPlatformViewsController.
flutterView = flutterView;
3947 flutter::MutatorsStack stack1;
3949 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
3950 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
3951 stack1.PushTransform(screenScaleMatrix);
3953 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
3954 stack1.PushClipRect(rect);
3956 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3957 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
3959 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3960 withParams:std::move(embeddedViewParams1)];
3961 [flutterPlatformViewsController
3966 UIView* maskView1 = childClippingView1.maskView;
3967 XCTAssertNotNil(maskView1);
3970 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(100, 100)];
3971 flutter::MutatorsStack stack2;
3972 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3973 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
3974 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
3975 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
3976 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3977 withParams:std::move(embeddedViewParams3)];
3978 [flutterPlatformViewsController
3985 [flutterPlatformViewsController
3989 @"viewType" : @"MockFlutterPlatformView"
3993 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
3994 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
3995 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3996 withParams:std::move(embeddedViewParams4)];
3997 [flutterPlatformViewsController
4003 UIView* maskView2 = childClippingView2.maskView;
4004 XCTAssertEqual(maskView1, maskView2);
4005 XCTAssertNotNil(childClippingView2.maskView);
4006 XCTAssertNil(childClippingView1.maskView);
4009 - (void)testDifferentClipMaskViewIsUsedForEachView {
4010 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4012 flutter::TaskRunners runners(
self.name.UTF8String,
4013 GetDefaultTaskRunner(),
4014 GetDefaultTaskRunner(),
4015 GetDefaultTaskRunner(),
4016 GetDefaultTaskRunner());
4019 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4020 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4023 flutterPlatformViewsController,
4026 std::make_shared<fml::SyncSwitch>());
4030 [flutterPlatformViewsController
4032 withId:@"MockFlutterPlatformView"
4037 [flutterPlatformViewsController
4041 @"viewType" : @"MockFlutterPlatformView"
4047 [flutterPlatformViewsController
4051 @"viewType" : @"MockFlutterPlatformView"
4057 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4058 flutterPlatformViewsController.
flutterView = flutterView;
4060 flutter::MutatorsStack stack1;
4062 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4063 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4064 stack1.PushTransform(screenScaleMatrix);
4066 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4067 stack1.PushClipRect(rect);
4069 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4070 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
4072 flutter::MutatorsStack stack2;
4073 stack2.PushClipRect(rect);
4074 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4075 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
4077 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4078 withParams:std::move(embeddedViewParams1)];
4079 [flutterPlatformViewsController
4083 UIView* childClippingView1 = view1.superview.superview;
4085 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4086 withParams:std::move(embeddedViewParams2)];
4087 [flutterPlatformViewsController
4091 UIView* childClippingView2 = view2.superview.superview;
4092 UIView* maskView1 = childClippingView1.maskView;
4093 UIView* maskView2 = childClippingView2.maskView;
4094 XCTAssertNotEqual(maskView1, maskView2);
4097 - (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4098 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4100 flutter::TaskRunners runners(
self.name.UTF8String,
4101 GetDefaultTaskRunner(),
4102 GetDefaultTaskRunner(),
4103 GetDefaultTaskRunner(),
4104 GetDefaultTaskRunner());
4107 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4108 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4111 flutterPlatformViewsController,
4114 std::make_shared<fml::SyncSwitch>());
4118 [flutterPlatformViewsController
4120 withId:@"MockFlutterPlatformView"
4125 [flutterPlatformViewsController
4129 @"viewType" : @"MockFlutterPlatformView"
4134 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4135 flutterPlatformViewsController.
flutterView = flutterView;
4137 flutter::MutatorsStack stack1;
4139 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4140 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4141 stack1.PushTransform(screenScaleMatrix);
4143 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4144 stack1.PushClipRect(rect);
4146 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4147 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
4149 flutter::MutatorsStack stack2;
4150 stack2.PushClipRect(rect);
4151 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4152 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
4154 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4155 withParams:std::move(embeddedViewParams1)];
4156 [flutterPlatformViewsController
4162 UIView* maskView = childClippingView.maskView;
4163 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer
class]],
4164 @"Mask view must use CAShapeLayer as its backing layer.");
4172 - (BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4173 expectedFrame:(CGRect)frame
4174 inputRadius:(CGFloat)inputRadius {
4175 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4176 for (UIView* view in visualEffectView.subviews) {
4177 if (![NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
4180 XCTAssertEqual(view.layer.filters.count, 1u);
4181 NSObject* filter = view.layer.filters.firstObject;
4183 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4185 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4186 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber
class]] &&
4187 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4194 - (void)testDisposingViewInCompositionOrderDoNotCrash {
4195 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4197 flutter::TaskRunners runners(
self.name.UTF8String,
4198 GetDefaultTaskRunner(),
4199 GetDefaultTaskRunner(),
4200 GetDefaultTaskRunner(),
4201 GetDefaultTaskRunner());
4204 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4205 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4208 flutterPlatformViewsController,
4211 std::make_shared<fml::SyncSwitch>());
4213 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4214 flutterPlatformViewsController.
flutterView = flutterView;
4218 [flutterPlatformViewsController
4220 withId:@"MockFlutterPlatformView"
4225 [flutterPlatformViewsController
4229 @"viewType" : @"MockFlutterPlatformView"
4232 [flutterPlatformViewsController
4236 @"viewType" : @"MockFlutterPlatformView"
4243 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4244 flutter::MutatorsStack stack;
4245 flutter::DlMatrix finalMatrix;
4246 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4247 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4248 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4249 withParams:std::move(embeddedViewParams0)];
4251 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4252 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4253 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4254 withParams:std::move(embeddedViewParams1)];
4258 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
4260 [expectation fulfill];
4263 [flutterPlatformViewsController
4266 [
self waitForExpectationsWithTimeout:30 handler:nil];
4268 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4269 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4270 nullptr, framebuffer_info,
4271 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4272 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4273 SkISize::Make(800, 600),
nullptr,
4275 XCTAssertTrue([flutterPlatformViewsController
4276 submitFrame:std::move(mock_surface)
4277 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4281 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
4282 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4288 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4289 flutter::MutatorsStack stack;
4290 flutter::DlMatrix finalMatrix;
4291 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4292 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4293 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4294 withParams:std::move(embeddedViewParams1)];
4296 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4297 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4298 nullptr, framebuffer_info,
4299 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4300 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4301 SkISize::Make(800, 600),
nullptr,
true);
4302 XCTAssertTrue([flutterPlatformViewsController
4303 submitFrame:std::move(mock_surface)
4304 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4308 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
4309 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4312 - (void)testOnlyPlatformViewsAreRemovedWhenReset {
4313 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4315 flutter::TaskRunners runners(
self.name.UTF8String,
4316 GetDefaultTaskRunner(),
4317 GetDefaultTaskRunner(),
4318 GetDefaultTaskRunner(),
4319 GetDefaultTaskRunner());
4322 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4323 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4326 flutterPlatformViewsController,
4329 std::make_shared<fml::SyncSwitch>());
4333 [flutterPlatformViewsController
4335 withId:@"MockFlutterPlatformView"
4339 [flutterPlatformViewsController
4343 @"viewType" : @"MockFlutterPlatformView"
4346 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4347 flutterPlatformViewsController.
flutterView = flutterView;
4349 flutter::MutatorsStack stack;
4351 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4352 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4353 stack.PushTransform(screenScaleMatrix);
4355 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4356 stack.PushTransform(translateMatrix);
4357 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4359 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4360 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4362 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4363 withParams:std::move(embeddedViewParams)];
4365 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4366 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4367 nullptr, framebuffer_info,
4368 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4369 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4370 SkISize::Make(800, 600),
nullptr,
true);
4371 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4372 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4374 UIView* someView = [[UIView alloc] init];
4375 [flutterView addSubview:someView];
4377 [flutterPlatformViewsController
reset];
4378 XCTAssertEqual(flutterView.subviews.count, 1u);
4379 XCTAssertEqual(flutterView.subviews.firstObject, someView);
4382 - (void)testResetClearsPreviousCompositionOrder {
4383 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4385 flutter::TaskRunners runners(
self.name.UTF8String,
4386 GetDefaultTaskRunner(),
4387 GetDefaultTaskRunner(),
4388 GetDefaultTaskRunner(),
4389 GetDefaultTaskRunner());
4392 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4393 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4396 flutterPlatformViewsController,
4399 std::make_shared<fml::SyncSwitch>());
4403 [flutterPlatformViewsController
4405 withId:@"MockFlutterPlatformView"
4409 [flutterPlatformViewsController
4413 @"viewType" : @"MockFlutterPlatformView"
4416 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4417 flutterPlatformViewsController.
flutterView = flutterView;
4419 flutter::MutatorsStack stack;
4421 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4422 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4423 stack.PushTransform(screenScaleMatrix);
4425 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4426 stack.PushTransform(translateMatrix);
4427 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4429 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4430 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4432 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4433 withParams:std::move(embeddedViewParams)];
4435 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4436 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4437 nullptr, framebuffer_info,
4438 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4439 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4440 SkISize::Make(800, 600),
nullptr,
true);
4441 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4442 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4448 [flutterPlatformViewsController
reset];
4454 - (void)testNilPlatformViewDoesntCrash {
4455 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4457 flutter::TaskRunners runners(
self.name.UTF8String,
4458 GetDefaultTaskRunner(),
4459 GetDefaultTaskRunner(),
4460 GetDefaultTaskRunner(),
4461 GetDefaultTaskRunner());
4464 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4465 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4468 flutterPlatformViewsController,
4471 std::make_shared<fml::SyncSwitch>());
4475 [flutterPlatformViewsController
4477 withId:@"MockFlutterPlatformView"
4481 [flutterPlatformViewsController
4485 @"viewType" : @"MockFlutterPlatformView"
4488 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4489 flutterPlatformViewsController.
flutterView = flutterView;
4492 flutter::MutatorsStack stack;
4494 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4495 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4496 stack.PushTransform(screenScaleMatrix);
4498 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4499 stack.PushTransform(translateMatrix);
4500 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4502 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4503 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4505 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4506 withParams:std::move(embeddedViewParams)];
4508 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4509 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4510 nullptr, framebuffer_info,
4511 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4512 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4513 SkISize::Make(800, 600),
nullptr,
true);
4514 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4515 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4517 XCTAssertEqual(flutterView.subviews.count, 1u);
4520 - (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
4522 NSObject* container = [[NSObject alloc] init];
4523 [touchInteceptorView setFlutterAccessibilityContainer:container];
4524 XCTAssertEqualObjects([touchInteceptorView accessibilityContainer], container);
4527 - (void)testLayerPool {
4531 XCTAssertTrue(
engine.platformView !=
nullptr);
4532 auto ios_context =
engine.platformView->GetIosContext();
4537 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4538 XCTAssertEqual(pool.size(), 1u);
4539 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4540 XCTAssertEqual(pool.size(), 2u);
4543 pool.RecycleLayers();
4544 XCTAssertEqual(pool.size(), 2u);
4547 auto unused_layers = pool.RemoveUnusedLayers();
4548 XCTAssertEqual(unused_layers.size(), 2u);
4549 XCTAssertEqual(pool.size(), 1u);
4552 - (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
4553 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4555 flutter::TaskRunners runners(
self.name.UTF8String,
4556 GetDefaultTaskRunner(),
4557 GetDefaultTaskRunner(),
4558 GetDefaultTaskRunner(),
4559 GetDefaultTaskRunner());
4562 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4563 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4566 flutterPlatformViewsController,
4569 std::make_shared<fml::SyncSwitch>());
4571 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4572 flutterPlatformViewsController.
flutterView = flutterView;
4576 [flutterPlatformViewsController
4578 withId:@"MockFlutterPlatformView"
4582 [flutterPlatformViewsController
4586 @"viewType" : @"MockFlutterPlatformView"
4591 [flutterPlatformViewsController
4595 @"viewType" : @"MockFlutterPlatformView"
4599 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4600 flutter::MutatorsStack stack;
4601 flutter::DlMatrix finalMatrix;
4602 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4603 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4604 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4605 withParams:std::move(embeddedViewParams1)];
4607 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4608 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
4609 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4610 withParams:std::move(embeddedViewParams2)];
4612 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4613 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
4614 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4615 nullptr, framebuffer_info,
4616 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4617 [&](
const flutter::SurfaceFrame& surface_frame) {
4618 submit_info = surface_frame.submit_info();
4621 SkISize::Make(800, 600),
nullptr,
4623 mock_surface->set_submit_info({
4624 .frame_damage = SkIRect::MakeWH(800, 600),
4625 .buffer_damage = SkIRect::MakeWH(400, 600),
4628 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4629 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4631 XCTAssertTrue(submit_info.has_value());
4632 XCTAssertEqual(*submit_info->frame_damage, SkIRect::MakeWH(800, 600));
4633 XCTAssertEqual(*submit_info->buffer_damage, SkIRect::MakeWH(400, 600));
4636 - (void)testClipSuperellipse {
4637 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4639 flutter::TaskRunners runners(
self.name.UTF8String,
4640 GetDefaultTaskRunner(),
4641 GetDefaultTaskRunner(),
4642 GetDefaultTaskRunner(),
4643 GetDefaultTaskRunner());
4646 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4647 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4650 flutterPlatformViewsController,
4653 std::make_shared<fml::SyncSwitch>());
4657 [flutterPlatformViewsController
4659 withId:@"MockFlutterPlatformView"
4663 [flutterPlatformViewsController
4667 @"viewType" : @"MockFlutterPlatformView"
4673 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4674 flutterPlatformViewsController.
flutterView = flutterView;
4676 flutter::MutatorsStack stack;
4678 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4679 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4680 stack.PushTransform(screenScaleMatrix);
4682 flutter::DlRect rect = flutter::DlRect::MakeXYWH(3, 3, 5, 5);
4683 stack.PushClipRSE(flutter::DlRoundSuperellipse::MakeOval(rect));
4685 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4686 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack);
4688 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4689 withParams:std::move(embeddedViewParams)];
4690 [flutterPlatformViewsController
4697 [flutterView addSubview:childClippingView];
4699 [flutterView setNeedsLayout];
4700 [flutterView layoutIfNeeded];
4702 CGPoint corners[] = {CGPointMake(rect.GetLeft(), rect.GetTop()),
4703 CGPointMake(rect.GetRight(), rect.GetTop()),
4704 CGPointMake(rect.GetLeft(), rect.GetBottom()),
4705 CGPointMake(rect.GetRight(), rect.GetBottom())};
4706 for (
auto point : corners) {
4707 int alpha = [
self alphaOfPoint:point onView:flutterView];
4708 XCTAssertNotEqual(alpha, 255);
4711 CGPointMake(rect.GetLeft() + rect.GetWidth() / 2, rect.GetTop() + rect.GetHeight() / 2);
4712 int alpha = [
self alphaOfPoint:center onView:flutterView];
4713 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)