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 if (@available(iOS 18.2, *)) {
3202 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3203 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3205 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3206 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3211 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldRemoveAndAddBackDelayingRecognizerForWrapperWebView {
3212 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3214 flutter::TaskRunners runners(
self.name.UTF8String,
3215 GetDefaultTaskRunner(),
3216 GetDefaultTaskRunner(),
3217 GetDefaultTaskRunner(),
3218 GetDefaultTaskRunner());
3221 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3222 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3225 flutterPlatformViewsController,
3228 std::make_shared<fml::SyncSwitch>());
3232 [flutterPlatformViewsController
3234 withId:@"MockWrapperWebView"
3238 [flutterPlatformViewsController
3241 arguments:@{@"id" : @2, @"viewType" : @"MockWrapperWebView"}]
3248 while (touchInteceptorView != nil &&
3250 touchInteceptorView = touchInteceptorView.superview;
3252 XCTAssertNotNil(touchInteceptorView);
3254 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3255 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3256 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3263 if (@available(iOS 18.2, *)) {
3265 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], forwardingRecognizer);
3266 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], delayingRecognizer);
3268 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3269 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3274 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNestedWrapperWebView {
3275 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3277 flutter::TaskRunners runners(
self.name.UTF8String,
3278 GetDefaultTaskRunner(),
3279 GetDefaultTaskRunner(),
3280 GetDefaultTaskRunner(),
3281 GetDefaultTaskRunner());
3284 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3285 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3288 flutterPlatformViewsController,
3291 std::make_shared<fml::SyncSwitch>());
3295 [flutterPlatformViewsController
3297 withId:@"MockNestedWrapperWebView"
3301 [flutterPlatformViewsController
3305 @"viewType" : @"MockNestedWrapperWebView"
3313 while (touchInteceptorView != nil &&
3315 touchInteceptorView = touchInteceptorView.superview;
3317 XCTAssertNotNil(touchInteceptorView);
3319 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3320 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3321 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3328 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3329 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3333 testFlutterPlatformViewBlockGestureUnderEagerPolicyShouldNotRemoveAndAddBackDelayingRecognizerForNonWebView {
3334 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3336 flutter::TaskRunners runners(
self.name.UTF8String,
3337 GetDefaultTaskRunner(),
3338 GetDefaultTaskRunner(),
3339 GetDefaultTaskRunner(),
3340 GetDefaultTaskRunner());
3343 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3344 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3347 flutterPlatformViewsController,
3350 std::make_shared<fml::SyncSwitch>());
3354 [flutterPlatformViewsController
3356 withId:@"MockFlutterPlatformView"
3360 [flutterPlatformViewsController
3364 @"viewType" : @"MockFlutterPlatformView"
3372 while (touchInteceptorView != nil &&
3374 touchInteceptorView = touchInteceptorView.superview;
3376 XCTAssertNotNil(touchInteceptorView);
3378 XCTAssert(touchInteceptorView.gestureRecognizers.count == 2);
3379 UIGestureRecognizer* delayingRecognizer = touchInteceptorView.gestureRecognizers[0];
3380 UIGestureRecognizer* forwardingRecognizer = touchInteceptorView.gestureRecognizers[1];
3387 XCTAssertEqual(touchInteceptorView.gestureRecognizers[0], delayingRecognizer);
3388 XCTAssertEqual(touchInteceptorView.gestureRecognizers[1], forwardingRecognizer);
3391 - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
3392 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3394 flutter::TaskRunners runners(
self.name.UTF8String,
3395 GetDefaultTaskRunner(),
3396 GetDefaultTaskRunner(),
3397 GetDefaultTaskRunner(),
3398 GetDefaultTaskRunner());
3401 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3402 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3405 flutterPlatformViewsController,
3408 std::make_shared<fml::SyncSwitch>());
3412 [flutterPlatformViewsController
3414 withId:@"MockFlutterPlatformView"
3418 [flutterPlatformViewsController
3422 @"viewType" : @"MockFlutterPlatformView"
3429 flutter::MutatorsStack stack;
3430 flutter::DlMatrix finalMatrix;
3432 auto embeddedViewParams_1 = std::make_unique<flutter::EmbeddedViewParams>(
3433 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3435 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3436 withParams:std::move(embeddedViewParams_1)];
3437 [flutterPlatformViewsController
3441 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3442 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3443 nullptr, framebuffer_info,
3444 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return false; },
3445 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3446 SkISize::Make(800, 600));
3447 XCTAssertFalse([flutterPlatformViewsController
3448 submitFrame:std::move(mock_surface)
3449 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3451 auto embeddedViewParams_2 = std::make_unique<flutter::EmbeddedViewParams>(
3452 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3453 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3454 withParams:std::move(embeddedViewParams_2)];
3455 [flutterPlatformViewsController
3459 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
3460 nullptr, framebuffer_info,
3461 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3462 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3463 SkISize::Make(800, 600));
3464 XCTAssertTrue([flutterPlatformViewsController
3465 submitFrame:std::move(mock_surface_submit_true)
3466 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3470 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
3471 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3473 flutter::TaskRunners runners(
self.name.UTF8String,
3474 GetDefaultTaskRunner(),
3475 GetDefaultTaskRunner(),
3476 GetDefaultTaskRunner(),
3477 GetDefaultTaskRunner());
3480 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3481 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3484 flutterPlatformViewsController,
3487 std::make_shared<fml::SyncSwitch>());
3489 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3490 flutterPlatformViewsController.
flutterView = flutterView;
3494 [flutterPlatformViewsController
3496 withId:@"MockFlutterPlatformView"
3502 [flutterPlatformViewsController
3506 @"viewType" : @"MockFlutterPlatformView"
3510 flutter::MutatorsStack stack;
3511 flutter::DlMatrix finalMatrix;
3512 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
3513 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3514 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3515 withParams:std::move(embeddedViewParams)];
3521 [flutterPlatformViewsController
reset];
3526 - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
3527 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3529 flutter::TaskRunners runners(
self.name.UTF8String,
3530 GetDefaultTaskRunner(),
3531 GetDefaultTaskRunner(),
3532 GetDefaultTaskRunner(),
3533 GetDefaultTaskRunner());
3536 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3537 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3540 flutterPlatformViewsController,
3543 std::make_shared<fml::SyncSwitch>());
3545 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3546 flutterPlatformViewsController.
flutterView = flutterView;
3550 [flutterPlatformViewsController
3552 withId:@"MockFlutterPlatformView"
3557 [flutterPlatformViewsController
3561 @"viewType" : @"MockFlutterPlatformView"
3566 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3567 flutter::MutatorsStack stack;
3568 flutter::DlMatrix finalMatrix;
3569 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3570 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3571 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3572 withParams:std::move(embeddedViewParams1)];
3573 [flutterPlatformViewsController
3580 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3583 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3584 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3585 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3586 withParams:std::move(embeddedViewParams2)];
3587 [flutterPlatformViewsController
3595 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
3596 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3598 flutter::TaskRunners runners(
self.name.UTF8String,
3599 GetDefaultTaskRunner(),
3600 GetDefaultTaskRunner(),
3601 GetDefaultTaskRunner(),
3602 GetDefaultTaskRunner());
3605 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3606 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3609 flutterPlatformViewsController,
3612 std::make_shared<fml::SyncSwitch>());
3614 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3615 flutterPlatformViewsController.
flutterView = flutterView;
3619 [flutterPlatformViewsController
3621 withId:@"MockFlutterPlatformView"
3625 [flutterPlatformViewsController
3629 @"viewType" : @"MockFlutterPlatformView"
3635 [flutterPlatformViewsController
3639 @"viewType" : @"MockFlutterPlatformView"
3644 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3645 flutter::MutatorsStack stack;
3646 flutter::DlMatrix finalMatrix;
3647 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3648 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3649 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3650 withParams:std::move(embeddedViewParams1)];
3652 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3653 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3654 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3655 withParams:std::move(embeddedViewParams2)];
3657 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3658 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3659 nullptr, framebuffer_info,
3660 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3661 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3662 SkISize::Make(800, 600),
nullptr,
true);
3663 XCTAssertTrue([flutterPlatformViewsController
3664 submitFrame:std::move(mock_surface)
3665 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3668 UIView* clippingView1 = view1.superview.superview;
3669 UIView* clippingView2 = view2.superview.superview;
3670 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3671 [flutterView.subviews indexOfObject:clippingView2],
3672 @"The first clipping view should be added before the second clipping view.");
3675 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3677 embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3678 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3679 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3680 withParams:std::move(embeddedViewParams2)];
3682 embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3683 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3684 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3685 withParams:std::move(embeddedViewParams1)];
3687 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3688 nullptr, framebuffer_info,
3689 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3690 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3691 SkISize::Make(800, 600),
nullptr,
true);
3692 XCTAssertTrue([flutterPlatformViewsController
3693 submitFrame:std::move(mock_surface)
3694 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3696 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
3697 [flutterView.subviews indexOfObject:clippingView2],
3698 @"The first clipping view should be added after the second clipping view.");
3702 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
3703 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3705 flutter::TaskRunners runners(
self.name.UTF8String,
3706 GetDefaultTaskRunner(),
3707 GetDefaultTaskRunner(),
3708 GetDefaultTaskRunner(),
3709 GetDefaultTaskRunner());
3712 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3713 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3716 flutterPlatformViewsController,
3719 std::make_shared<fml::SyncSwitch>());
3721 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3722 flutterPlatformViewsController.
flutterView = flutterView;
3726 [flutterPlatformViewsController
3728 withId:@"MockFlutterPlatformView"
3732 [flutterPlatformViewsController
3736 @"viewType" : @"MockFlutterPlatformView"
3742 [flutterPlatformViewsController
3746 @"viewType" : @"MockFlutterPlatformView"
3751 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3752 flutter::MutatorsStack stack;
3753 flutter::DlMatrix finalMatrix;
3754 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3755 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3756 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3757 withParams:std::move(embeddedViewParams1)];
3759 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3760 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3761 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3762 withParams:std::move(embeddedViewParams2)];
3764 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3765 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3766 nullptr, framebuffer_info,
3767 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3768 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3769 SkISize::Make(800, 600),
nullptr,
true);
3770 XCTAssertTrue([flutterPlatformViewsController
3771 submitFrame:std::move(mock_surface)
3772 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3775 UIView* clippingView1 = view1.superview.superview;
3776 UIView* clippingView2 = view2.superview.superview;
3777 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3778 [flutterView.subviews indexOfObject:clippingView2],
3779 @"The first clipping view should be added before the second clipping view.");
3782 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
3784 embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3785 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
3786 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
3787 withParams:std::move(embeddedViewParams1)];
3789 embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3790 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
3791 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3792 withParams:std::move(embeddedViewParams2)];
3794 mock_surface = std::make_unique<flutter::SurfaceFrame>(
3795 nullptr, framebuffer_info,
3796 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3797 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
3798 SkISize::Make(800, 600),
nullptr,
true);
3799 XCTAssertTrue([flutterPlatformViewsController
3800 submitFrame:std::move(mock_surface)
3801 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
3803 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
3804 [flutterView.subviews indexOfObject:clippingView2],
3805 @"The first clipping view should be added before the second clipping view.");
3808 - (int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
3809 unsigned char pixel[4] = {0};
3811 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
3814 CGContextRef context = CGBitmapContextCreate(
3815 pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
3816 CGContextTranslateCTM(context, -point.x, -point.y);
3817 [view.layer renderInContext:context];
3819 CGContextRelease(context);
3820 CGColorSpaceRelease(colorSpace);
3825 - (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
3827 UIWindow* window = [[UIWindow alloc] init];
3828 UITextField* textField = [[UITextField alloc] init];
3829 [window addSubview:textField];
3831 [textField becomeFirstResponder];
3832 XCTAssertTrue(textField.isFirstResponder);
3833 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
3834 [textField resignFirstResponder];
3835 XCTAssertFalse(textField.isFirstResponder);
3836 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
3839 - (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
3841 UIWindow* window = [[UIWindow alloc] init];
3842 UIView* view = [[UIView alloc] init];
3843 UIView* childView = [[UIView alloc] init];
3844 UITextField* textField = [[UITextField alloc] init];
3845 [window addSubview:view];
3846 [view addSubview:childView];
3847 [childView addSubview:textField];
3849 [textField becomeFirstResponder];
3850 XCTAssertTrue(textField.isFirstResponder);
3851 XCTAssertTrue(view.flt_hasFirstResponderInViewHierarchySubtree);
3852 [textField resignFirstResponder];
3853 XCTAssertFalse(textField.isFirstResponder);
3854 XCTAssertFalse(view.flt_hasFirstResponderInViewHierarchySubtree);
3857 - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
3863 CGRect newRect = CGRectMake(0, 0, 10, 10);
3867 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
3868 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
3869 XCTAssertEqualObjects(set1, set2);
3870 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
3871 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
3874 - (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
3879 XCTAssertNotEqual(view1, view3);
3880 XCTAssertNotEqual(view2, view3);
3883 - (void)testMaskViewsReleasedWhenPoolIsReleased {
3884 __weak UIView* weakView;
3889 XCTAssertNotNil(weakView);
3891 XCTAssertNil(weakView);
3894 - (void)testClipMaskViewIsReused {
3895 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3897 flutter::TaskRunners runners(
self.name.UTF8String,
3898 GetDefaultTaskRunner(),
3899 GetDefaultTaskRunner(),
3900 GetDefaultTaskRunner(),
3901 GetDefaultTaskRunner());
3904 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
3905 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3908 flutterPlatformViewsController,
3911 std::make_shared<fml::SyncSwitch>());
3915 [flutterPlatformViewsController
3917 withId:@"MockFlutterPlatformView"
3921 [flutterPlatformViewsController
3925 @"viewType" : @"MockFlutterPlatformView"
3930 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
3931 flutterPlatformViewsController.
flutterView = flutterView;
3933 flutter::MutatorsStack stack1;
3935 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
3936 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
3937 stack1.PushTransform(screenScaleMatrix);
3939 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
3940 stack1.PushClipRect(rect);
3942 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
3943 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
3945 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3946 withParams:std::move(embeddedViewParams1)];
3947 [flutterPlatformViewsController
3952 UIView* maskView1 = childClippingView1.maskView;
3953 XCTAssertNotNil(maskView1);
3956 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(100, 100)];
3957 flutter::MutatorsStack stack2;
3958 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
3959 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
3960 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
3961 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
3962 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
3963 withParams:std::move(embeddedViewParams3)];
3964 [flutterPlatformViewsController
3971 [flutterPlatformViewsController
3975 @"viewType" : @"MockFlutterPlatformView"
3979 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
3980 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
3981 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
3982 withParams:std::move(embeddedViewParams4)];
3983 [flutterPlatformViewsController
3989 UIView* maskView2 = childClippingView2.maskView;
3990 XCTAssertEqual(maskView1, maskView2);
3991 XCTAssertNotNil(childClippingView2.maskView);
3992 XCTAssertNil(childClippingView1.maskView);
3995 - (void)testDifferentClipMaskViewIsUsedForEachView {
3996 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3998 flutter::TaskRunners runners(
self.name.UTF8String,
3999 GetDefaultTaskRunner(),
4000 GetDefaultTaskRunner(),
4001 GetDefaultTaskRunner(),
4002 GetDefaultTaskRunner());
4005 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4006 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4009 flutterPlatformViewsController,
4012 std::make_shared<fml::SyncSwitch>());
4016 [flutterPlatformViewsController
4018 withId:@"MockFlutterPlatformView"
4023 [flutterPlatformViewsController
4027 @"viewType" : @"MockFlutterPlatformView"
4033 [flutterPlatformViewsController
4037 @"viewType" : @"MockFlutterPlatformView"
4043 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4044 flutterPlatformViewsController.
flutterView = flutterView;
4046 flutter::MutatorsStack stack1;
4048 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4049 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4050 stack1.PushTransform(screenScaleMatrix);
4052 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4053 stack1.PushClipRect(rect);
4055 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4056 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
4058 flutter::MutatorsStack stack2;
4059 stack2.PushClipRect(rect);
4060 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4061 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
4063 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4064 withParams:std::move(embeddedViewParams1)];
4065 [flutterPlatformViewsController
4069 UIView* childClippingView1 = view1.superview.superview;
4071 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4072 withParams:std::move(embeddedViewParams2)];
4073 [flutterPlatformViewsController
4077 UIView* childClippingView2 = view2.superview.superview;
4078 UIView* maskView1 = childClippingView1.maskView;
4079 UIView* maskView2 = childClippingView2.maskView;
4080 XCTAssertNotEqual(maskView1, maskView2);
4083 - (void)testMaskViewUsesCAShapeLayerAsTheBackingLayer {
4084 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4086 flutter::TaskRunners runners(
self.name.UTF8String,
4087 GetDefaultTaskRunner(),
4088 GetDefaultTaskRunner(),
4089 GetDefaultTaskRunner(),
4090 GetDefaultTaskRunner());
4093 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4094 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4097 flutterPlatformViewsController,
4100 std::make_shared<fml::SyncSwitch>());
4104 [flutterPlatformViewsController
4106 withId:@"MockFlutterPlatformView"
4111 [flutterPlatformViewsController
4115 @"viewType" : @"MockFlutterPlatformView"
4120 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
4121 flutterPlatformViewsController.
flutterView = flutterView;
4123 flutter::MutatorsStack stack1;
4125 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4126 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4127 stack1.PushTransform(screenScaleMatrix);
4129 flutter::DlRect rect = flutter::DlRect::MakeXYWH(2, 2, 3, 3);
4130 stack1.PushClipRect(rect);
4132 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4133 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack1);
4135 flutter::MutatorsStack stack2;
4136 stack2.PushClipRect(rect);
4137 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4138 flutter::ToSkMatrix(screenScaleMatrix), SkSize::Make(10, 10), stack2);
4140 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4141 withParams:std::move(embeddedViewParams1)];
4142 [flutterPlatformViewsController
4148 UIView* maskView = childClippingView.maskView;
4149 XCTAssert([maskView.layer isKindOfClass:[CAShapeLayer
class]],
4150 @"Mask view must use CAShapeLayer as its backing layer.");
4158 - (BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
4159 expectedFrame:(CGRect)frame
4160 inputRadius:(CGFloat)inputRadius {
4161 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
4162 for (UIView* view in visualEffectView.subviews) {
4163 if (![NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
4166 XCTAssertEqual(view.layer.filters.count, 1u);
4167 NSObject* filter = view.layer.filters.firstObject;
4169 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
4171 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
4172 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber
class]] &&
4173 flutter::BlurRadiusEqualToBlurRadius(((NSNumber*)inputRadiusInFilter).floatValue,
4180 - (void)testDisposingViewInCompositionOrderDoNotCrash {
4181 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4183 flutter::TaskRunners runners(
self.name.UTF8String,
4184 GetDefaultTaskRunner(),
4185 GetDefaultTaskRunner(),
4186 GetDefaultTaskRunner(),
4187 GetDefaultTaskRunner());
4190 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4191 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4194 flutterPlatformViewsController,
4197 std::make_shared<fml::SyncSwitch>());
4199 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4200 flutterPlatformViewsController.
flutterView = flutterView;
4204 [flutterPlatformViewsController
4206 withId:@"MockFlutterPlatformView"
4211 [flutterPlatformViewsController
4215 @"viewType" : @"MockFlutterPlatformView"
4218 [flutterPlatformViewsController
4222 @"viewType" : @"MockFlutterPlatformView"
4229 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4230 flutter::MutatorsStack stack;
4231 flutter::DlMatrix finalMatrix;
4232 auto embeddedViewParams0 = std::make_unique<flutter::EmbeddedViewParams>(
4233 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4234 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4235 withParams:std::move(embeddedViewParams0)];
4237 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4238 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4239 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4240 withParams:std::move(embeddedViewParams1)];
4244 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
4246 [expectation fulfill];
4249 [flutterPlatformViewsController
4252 [
self waitForExpectationsWithTimeout:30 handler:nil];
4254 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4255 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4256 nullptr, framebuffer_info,
4257 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4258 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4259 SkISize::Make(800, 600),
nullptr,
4261 XCTAssertTrue([flutterPlatformViewsController
4262 submitFrame:std::move(mock_surface)
4263 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4267 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:0]);
4268 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4274 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4275 flutter::MutatorsStack stack;
4276 flutter::DlMatrix finalMatrix;
4277 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4278 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4279 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4280 withParams:std::move(embeddedViewParams1)];
4282 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4283 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4284 nullptr, framebuffer_info,
4285 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4286 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4287 SkISize::Make(800, 600),
nullptr,
true);
4288 XCTAssertTrue([flutterPlatformViewsController
4289 submitFrame:std::move(mock_surface)
4290 withIosContext:std::make_shared<flutter::IOSContextNoop>()]);
4294 XCTAssertNil([flutterPlatformViewsController platformViewForId:0]);
4295 XCTAssertNotNil([flutterPlatformViewsController platformViewForId:1]);
4298 - (void)testOnlyPlatformViewsAreRemovedWhenReset {
4299 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4301 flutter::TaskRunners runners(
self.name.UTF8String,
4302 GetDefaultTaskRunner(),
4303 GetDefaultTaskRunner(),
4304 GetDefaultTaskRunner(),
4305 GetDefaultTaskRunner());
4308 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4309 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4312 flutterPlatformViewsController,
4315 std::make_shared<fml::SyncSwitch>());
4319 [flutterPlatformViewsController
4321 withId:@"MockFlutterPlatformView"
4325 [flutterPlatformViewsController
4329 @"viewType" : @"MockFlutterPlatformView"
4332 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4333 flutterPlatformViewsController.
flutterView = flutterView;
4335 flutter::MutatorsStack stack;
4337 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4338 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4339 stack.PushTransform(screenScaleMatrix);
4341 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4342 stack.PushTransform(translateMatrix);
4343 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4345 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4346 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4348 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4349 withParams:std::move(embeddedViewParams)];
4351 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4352 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4353 nullptr, framebuffer_info,
4354 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4355 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4356 SkISize::Make(800, 600),
nullptr,
true);
4357 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4358 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4360 UIView* someView = [[UIView alloc] init];
4361 [flutterView addSubview:someView];
4363 [flutterPlatformViewsController
reset];
4364 XCTAssertEqual(flutterView.subviews.count, 1u);
4365 XCTAssertEqual(flutterView.subviews.firstObject, someView);
4368 - (void)testResetClearsPreviousCompositionOrder {
4369 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4371 flutter::TaskRunners runners(
self.name.UTF8String,
4372 GetDefaultTaskRunner(),
4373 GetDefaultTaskRunner(),
4374 GetDefaultTaskRunner(),
4375 GetDefaultTaskRunner());
4378 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4379 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4382 flutterPlatformViewsController,
4385 std::make_shared<fml::SyncSwitch>());
4389 [flutterPlatformViewsController
4391 withId:@"MockFlutterPlatformView"
4395 [flutterPlatformViewsController
4399 @"viewType" : @"MockFlutterPlatformView"
4402 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4403 flutterPlatformViewsController.
flutterView = flutterView;
4405 flutter::MutatorsStack stack;
4407 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4408 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4409 stack.PushTransform(screenScaleMatrix);
4411 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4412 stack.PushTransform(translateMatrix);
4413 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4415 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4416 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4418 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4419 withParams:std::move(embeddedViewParams)];
4421 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4422 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4423 nullptr, framebuffer_info,
4424 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4425 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4426 SkISize::Make(800, 600),
nullptr,
true);
4427 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4428 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4434 [flutterPlatformViewsController
reset];
4440 - (void)testNilPlatformViewDoesntCrash {
4441 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4443 flutter::TaskRunners runners(
self.name.UTF8String,
4444 GetDefaultTaskRunner(),
4445 GetDefaultTaskRunner(),
4446 GetDefaultTaskRunner(),
4447 GetDefaultTaskRunner());
4450 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4451 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4454 flutterPlatformViewsController,
4457 std::make_shared<fml::SyncSwitch>());
4461 [flutterPlatformViewsController
4463 withId:@"MockFlutterPlatformView"
4467 [flutterPlatformViewsController
4471 @"viewType" : @"MockFlutterPlatformView"
4474 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4475 flutterPlatformViewsController.
flutterView = flutterView;
4478 flutter::MutatorsStack stack;
4480 flutter::DlScalar screenScale = [UIScreen mainScreen].scale;
4481 flutter::DlMatrix screenScaleMatrix = flutter::DlMatrix::MakeScale({screenScale, screenScale, 1});
4482 stack.PushTransform(screenScaleMatrix);
4484 flutter::DlMatrix translateMatrix = flutter::DlMatrix::MakeTranslation({100, 100});
4485 stack.PushTransform(translateMatrix);
4486 flutter::DlMatrix finalMatrix = screenScaleMatrix * translateMatrix;
4488 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
4489 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4491 [flutterPlatformViewsController prerollCompositeEmbeddedView:2
4492 withParams:std::move(embeddedViewParams)];
4494 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4495 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4496 nullptr, framebuffer_info,
4497 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4498 [](
const flutter::SurfaceFrame& surface_frame) {
return true; },
4499 SkISize::Make(800, 600),
nullptr,
true);
4500 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4501 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4503 XCTAssertEqual(flutterView.subviews.count, 1u);
4506 - (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
4508 NSObject* container = [[NSObject alloc] init];
4509 [touchInteceptorView setFlutterAccessibilityContainer:container];
4510 XCTAssertEqualObjects([touchInteceptorView accessibilityContainer], container);
4513 - (void)testLayerPool {
4517 XCTAssertTrue(
engine.platformView !=
nullptr);
4518 auto ios_context =
engine.platformView->GetIosContext();
4523 pool.
CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4524 XCTAssertEqual(pool.size(), 1u);
4525 pool.CreateLayer(ios_context, MTLPixelFormatBGRA8Unorm);
4526 XCTAssertEqual(pool.size(), 2u);
4529 pool.RecycleLayers();
4530 XCTAssertEqual(pool.size(), 2u);
4533 auto unused_layers = pool.RemoveUnusedLayers();
4534 XCTAssertEqual(unused_layers.size(), 2u);
4535 XCTAssertEqual(pool.size(), 1u);
4538 - (void)testFlutterPlatformViewControllerSubmitFramePreservingFrameDamage {
4539 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
4541 flutter::TaskRunners runners(
self.name.UTF8String,
4542 GetDefaultTaskRunner(),
4543 GetDefaultTaskRunner(),
4544 GetDefaultTaskRunner(),
4545 GetDefaultTaskRunner());
4548 flutterPlatformViewsController.
taskRunner = GetDefaultTaskRunner();
4549 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
4552 flutterPlatformViewsController,
4555 std::make_shared<fml::SyncSwitch>());
4557 UIView* flutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
4558 flutterPlatformViewsController.
flutterView = flutterView;
4562 [flutterPlatformViewsController
4564 withId:@"MockFlutterPlatformView"
4568 [flutterPlatformViewsController
4572 @"viewType" : @"MockFlutterPlatformView"
4577 [flutterPlatformViewsController
4581 @"viewType" : @"MockFlutterPlatformView"
4585 [flutterPlatformViewsController beginFrameWithSize:SkISize::Make(300, 300)];
4586 flutter::MutatorsStack stack;
4587 flutter::DlMatrix finalMatrix;
4588 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
4589 flutter::ToSkMatrix(finalMatrix), SkSize::Make(300, 300), stack);
4590 [flutterPlatformViewsController prerollCompositeEmbeddedView:0
4591 withParams:std::move(embeddedViewParams1)];
4593 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
4594 flutter::ToSkMatrix(finalMatrix), SkSize::Make(500, 500), stack);
4595 [flutterPlatformViewsController prerollCompositeEmbeddedView:1
4596 withParams:std::move(embeddedViewParams2)];
4598 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
4599 std::optional<flutter::SurfaceFrame::SubmitInfo> submit_info;
4600 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
4601 nullptr, framebuffer_info,
4602 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
4603 [&](
const flutter::SurfaceFrame& surface_frame) {
4604 submit_info = surface_frame.submit_info();
4607 SkISize::Make(800, 600),
nullptr,
4609 mock_surface->set_submit_info({
4610 .frame_damage = SkIRect::MakeWH(800, 600),
4611 .buffer_damage = SkIRect::MakeWH(400, 600),
4614 [flutterPlatformViewsController submitFrame:std::move(mock_surface)
4615 withIosContext:std::make_shared<flutter::IOSContextNoop>()];
4617 XCTAssertTrue(submit_info.has_value());
4618 XCTAssertEqual(*submit_info->frame_damage, SkIRect::MakeWH(800, 600));
4619 XCTAssertEqual(*submit_info->buffer_damage, SkIRect::MakeWH(400, 600));
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)