127 auto thread = std::make_unique<fml::Thread>(
name);
128 auto runner = thread->GetTaskRunner();
138- (void)testFlutterViewOnlyCreateOnceInOneFrame {
139 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
140 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
146 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
147 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
149 mock_delegate.settings_.enable_impeller
152 flutterPlatformViewsController,
155 std::make_shared<fml::SyncSwitch>());
159 flutterPlatformViewsController->RegisterViewFactory(
160 factory,
@"MockFlutterPlatformView",
164 flutterPlatformViewsController->OnMethodCall(
166 methodCallWithMethodName:
@"create"
167 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
169 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
170 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
181 finalMatrix.
setConcat(screenScaleMatrix, translateMatrix);
183 auto embeddedViewParams =
184 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
186 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
187 flutterPlatformViewsController->CompositeEmbeddedView(2);
189 flutterPlatformViewsController->GetPlatformViewRect(2);
193 flutterPlatformViewsController->Reset();
196- (void)testCanCreatePlatformViewWithoutFlutterView {
197 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
198 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
204 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
205 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
207 mock_delegate.settings_.enable_impeller
210 flutterPlatformViewsController,
213 std::make_shared<fml::SyncSwitch>());
217 flutterPlatformViewsController->RegisterViewFactory(
218 factory,
@"MockFlutterPlatformView",
222 flutterPlatformViewsController->OnMethodCall(
224 methodCallWithMethodName:
@"create"
225 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
231- (void)testChildClippingViewHitTests {
234 UIView* childView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
235 [childClippingView addSubview:childView];
237 XCTAssertFalse([childClippingView pointInside:CGPointMake(50, 50) withEvent:nil]);
238 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 100) withEvent:nil]);
239 XCTAssertFalse([childClippingView pointInside:CGPointMake(100, 99) withEvent:nil]);
240 XCTAssertFalse([childClippingView pointInside:CGPointMake(201, 200) withEvent:nil]);
241 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 201) withEvent:nil]);
242 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 200) withEvent:nil]);
243 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 299) withEvent:nil]);
245 XCTAssertTrue([childClippingView pointInside:CGPointMake(150, 150) withEvent:nil]);
246 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 100) withEvent:nil]);
247 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 100) withEvent:nil]);
248 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 199) withEvent:nil]);
249 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 199) withEvent:nil]);
252- (void)testReleasesBackdropFilterSubviewsOnChildClippingViewDealloc {
253 __weak NSMutableArray<UIVisualEffectView*>* weakBackdropFilterSubviews = nil;
257 XCTAssertNotNil(weakBackdropFilterSubviews);
260 XCTAssertNil(weakBackdropFilterSubviews);
263- (void)testApplyBackdropFilter {
264 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
265 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
271 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
272 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
274 mock_delegate.settings_.enable_impeller
277 flutterPlatformViewsController,
280 std::make_shared<fml::SyncSwitch>());
284 flutterPlatformViewsController->RegisterViewFactory(
285 factory,
@"MockFlutterPlatformView",
289 flutterPlatformViewsController->OnMethodCall(
291 methodCallWithMethodName:
@"create"
292 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
297 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
298 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
302 CGFloat screenScale = [UIScreen mainScreen].scale;
309 auto embeddedViewParams =
310 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
312 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
313 flutterPlatformViewsController->CompositeEmbeddedView(2);
316 [mockFlutterView addSubview:childClippingView];
318 [mockFlutterView setNeedsLayout];
319 [mockFlutterView layoutIfNeeded];
322 NSUInteger numberOfExpectedVisualEffectView = 0;
323 for (UIView* subview in childClippingView.subviews) {
324 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
327 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
328 if ([
self validateOneVisualEffectView:subview
329 expectedFrame:CGRectMake(0, 0, 10, 10)
331 numberOfExpectedVisualEffectView++;
334 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
337- (void)testApplyBackdropFilterWithCorrectFrame {
338 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
339 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
345 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
346 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
348 mock_delegate.settings_.enable_impeller
351 flutterPlatformViewsController,
354 std::make_shared<fml::SyncSwitch>());
358 flutterPlatformViewsController->RegisterViewFactory(
359 factory,
@"MockFlutterPlatformView",
363 flutterPlatformViewsController->OnMethodCall(
365 methodCallWithMethodName:
@"create"
366 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
371 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
372 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
376 CGFloat screenScale = [UIScreen mainScreen].scale;
383 auto embeddedViewParams =
384 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(5, 10), stack);
386 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
387 flutterPlatformViewsController->CompositeEmbeddedView(2);
390 [mockFlutterView addSubview:childClippingView];
392 [mockFlutterView setNeedsLayout];
393 [mockFlutterView layoutIfNeeded];
396 NSUInteger numberOfExpectedVisualEffectView = 0;
397 for (UIView* subview in childClippingView.subviews) {
398 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
401 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
402 if ([
self validateOneVisualEffectView:subview
403 expectedFrame:CGRectMake(0, 0, 5, 8)
405 numberOfExpectedVisualEffectView++;
408 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
411- (void)testApplyMultipleBackdropFilters {
412 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
413 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
419 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
420 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
422 mock_delegate.settings_.enable_impeller
425 flutterPlatformViewsController,
428 std::make_shared<fml::SyncSwitch>());
432 flutterPlatformViewsController->RegisterViewFactory(
433 factory,
@"MockFlutterPlatformView",
437 flutterPlatformViewsController->OnMethodCall(
439 methodCallWithMethodName:
@"create"
440 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
445 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
446 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
450 CGFloat screenScale = [UIScreen mainScreen].scale;
454 for (
int i = 0; i < 50; i++) {
459 auto embeddedViewParams =
460 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(20, 20), stack);
462 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
463 flutterPlatformViewsController->CompositeEmbeddedView(2);
466 [mockFlutterView addSubview:childClippingView];
468 [mockFlutterView setNeedsLayout];
469 [mockFlutterView layoutIfNeeded];
471 NSUInteger numberOfExpectedVisualEffectView = 0;
472 for (UIView* subview in childClippingView.subviews) {
473 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
476 XCTAssertLessThan(numberOfExpectedVisualEffectView, 50u);
477 if ([
self validateOneVisualEffectView:subview
478 expectedFrame:CGRectMake(0, 0, 10, 10)
479 inputRadius:(CGFloat)numberOfExpectedVisualEffectView]) {
480 numberOfExpectedVisualEffectView++;
483 XCTAssertEqual(numberOfExpectedVisualEffectView, (NSUInteger)numberOfExpectedVisualEffectView);
486- (void)testAddBackdropFilters {
487 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
488 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
494 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
495 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
497 mock_delegate.settings_.enable_impeller
500 flutterPlatformViewsController,
503 std::make_shared<fml::SyncSwitch>());
507 flutterPlatformViewsController->RegisterViewFactory(
508 factory,
@"MockFlutterPlatformView",
512 flutterPlatformViewsController->OnMethodCall(
514 methodCallWithMethodName:
@"create"
515 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
520 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
521 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
525 CGFloat screenScale = [UIScreen mainScreen].scale;
532 auto embeddedViewParams =
533 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
535 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
536 flutterPlatformViewsController->CompositeEmbeddedView(2);
539 [mockFlutterView addSubview:childClippingView];
541 [mockFlutterView setNeedsLayout];
542 [mockFlutterView layoutIfNeeded];
544 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
545 for (UIView* subview in childClippingView.subviews) {
546 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
549 XCTAssertLessThan(originalVisualEffectViews.count, 1u);
550 if ([
self validateOneVisualEffectView:subview
551 expectedFrame:CGRectMake(0, 0, 10, 10)
552 inputRadius:(CGFloat)5]) {
553 [originalVisualEffectViews addObject:subview];
556 XCTAssertEqual(originalVisualEffectViews.count, 1u);
565 for (
int i = 0; i < 2; i++) {
569 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
572 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
573 flutterPlatformViewsController->CompositeEmbeddedView(2);
574 [mockFlutterView setNeedsLayout];
575 [mockFlutterView layoutIfNeeded];
577 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
578 for (UIView* subview in childClippingView.subviews) {
579 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
582 XCTAssertLessThan(newVisualEffectViews.count, 2u);
584 if ([
self validateOneVisualEffectView:subview
585 expectedFrame:CGRectMake(0, 0, 10, 10)
586 inputRadius:(CGFloat)5]) {
587 [newVisualEffectViews addObject:subview];
590 XCTAssertEqual(newVisualEffectViews.count, 2u);
591 for (NSUInteger i = 0; i < originalVisualEffectViews.count; i++) {
592 UIView* originalView = originalVisualEffectViews[i];
593 UIView* newView = newVisualEffectViews[i];
595 XCTAssertEqual(originalView, newView);
596 id mockOrignalView = OCMPartialMock(originalView);
597 OCMReject([mockOrignalView removeFromSuperview]);
601- (void)testRemoveBackdropFilters {
602 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
603 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
609 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
610 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
612 mock_delegate.settings_.enable_impeller
615 flutterPlatformViewsController,
618 std::make_shared<fml::SyncSwitch>());
622 flutterPlatformViewsController->RegisterViewFactory(
623 factory,
@"MockFlutterPlatformView",
627 flutterPlatformViewsController->OnMethodCall(
629 methodCallWithMethodName:
@"create"
630 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
635 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
636 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
640 CGFloat screenScale = [UIScreen mainScreen].scale;
645 for (
int i = 0; i < 5; i++) {
649 auto embeddedViewParams =
650 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
652 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
653 flutterPlatformViewsController->CompositeEmbeddedView(2);
656 [mockFlutterView addSubview:childClippingView];
658 [mockFlutterView setNeedsLayout];
659 [mockFlutterView layoutIfNeeded];
661 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
662 for (UIView* subview in childClippingView.subviews) {
663 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
666 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
667 if ([
self validateOneVisualEffectView:subview
668 expectedFrame:CGRectMake(0, 0, 10, 10)
669 inputRadius:(CGFloat)5]) {
670 [originalVisualEffectViews addObject:subview];
680 for (
int i = 0; i < 4; i++) {
684 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
687 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
688 flutterPlatformViewsController->CompositeEmbeddedView(2);
689 [mockFlutterView setNeedsLayout];
690 [mockFlutterView layoutIfNeeded];
692 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
693 for (UIView* subview in childClippingView.subviews) {
694 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
697 XCTAssertLessThan(newVisualEffectViews.count, 4u);
698 if ([
self validateOneVisualEffectView:subview
699 expectedFrame:CGRectMake(0, 0, 10, 10)
700 inputRadius:(CGFloat)5]) {
701 [newVisualEffectViews addObject:subview];
704 XCTAssertEqual(newVisualEffectViews.count, 4u);
706 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
707 UIView* newView = newVisualEffectViews[i];
708 id mockNewView = OCMPartialMock(newView);
709 UIView* originalView = originalVisualEffectViews[i];
711 XCTAssertEqual(originalView, newView);
712 OCMReject([mockNewView removeFromSuperview]);
713 [mockNewView stopMocking];
718 for (
int i = 0; i < 5; i++) {
723 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
726 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
727 flutterPlatformViewsController->CompositeEmbeddedView(2);
728 [mockFlutterView setNeedsLayout];
729 [mockFlutterView layoutIfNeeded];
731 NSUInteger numberOfExpectedVisualEffectView = 0u;
732 for (UIView* subview in childClippingView.subviews) {
733 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
734 numberOfExpectedVisualEffectView++;
737 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
740- (void)testEditBackdropFilters {
741 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
742 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
748 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
749 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
751 mock_delegate.settings_.enable_impeller
754 flutterPlatformViewsController,
757 std::make_shared<fml::SyncSwitch>());
761 flutterPlatformViewsController->RegisterViewFactory(
762 factory,
@"MockFlutterPlatformView",
766 flutterPlatformViewsController->OnMethodCall(
768 methodCallWithMethodName:
@"create"
769 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
774 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
775 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
779 CGFloat screenScale = [UIScreen mainScreen].scale;
784 for (
int i = 0; i < 5; i++) {
788 auto embeddedViewParams =
789 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
791 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
792 flutterPlatformViewsController->CompositeEmbeddedView(2);
795 [mockFlutterView addSubview:childClippingView];
797 [mockFlutterView setNeedsLayout];
798 [mockFlutterView layoutIfNeeded];
800 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
801 for (UIView* subview in childClippingView.subviews) {
802 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
805 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
806 if ([
self validateOneVisualEffectView:subview
807 expectedFrame:CGRectMake(0, 0, 10, 10)
808 inputRadius:(CGFloat)5]) {
809 [originalVisualEffectViews addObject:subview];
819 for (
int i = 0; i < 5; i++) {
832 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
835 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
836 flutterPlatformViewsController->CompositeEmbeddedView(2);
837 [mockFlutterView setNeedsLayout];
838 [mockFlutterView layoutIfNeeded];
840 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
841 for (UIView* subview in childClippingView.subviews) {
842 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
845 XCTAssertLessThan(newVisualEffectViews.count, 5u);
846 CGFloat expectInputRadius = 5;
847 if (newVisualEffectViews.count == 3) {
848 expectInputRadius = 2;
850 if ([
self validateOneVisualEffectView:subview
851 expectedFrame:CGRectMake(0, 0, 10, 10)
852 inputRadius:(CGFloat)expectInputRadius]) {
853 [newVisualEffectViews addObject:subview];
856 XCTAssertEqual(newVisualEffectViews.count, 5u);
857 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
858 UIView* newView = newVisualEffectViews[i];
859 id mockNewView = OCMPartialMock(newView);
860 UIView* originalView = originalVisualEffectViews[i];
862 XCTAssertEqual(originalView, newView);
863 OCMReject([mockNewView removeFromSuperview]);
864 [mockNewView stopMocking];
866 [newVisualEffectViews removeAllObjects];
870 for (
int i = 0; i < 5; i++) {
874 for (
int i = 0; i < 5; i++) {
886 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
889 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
890 flutterPlatformViewsController->CompositeEmbeddedView(2);
891 [mockFlutterView setNeedsLayout];
892 [mockFlutterView layoutIfNeeded];
894 for (UIView* subview in childClippingView.subviews) {
895 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
898 XCTAssertLessThan(newVisualEffectViews.count, 5u);
899 CGFloat expectInputRadius = 5;
900 if (newVisualEffectViews.count == 0) {
901 expectInputRadius = 2;
903 if ([
self validateOneVisualEffectView:subview
904 expectedFrame:CGRectMake(0, 0, 10, 10)
905 inputRadius:(CGFloat)expectInputRadius]) {
906 [newVisualEffectViews addObject:subview];
909 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
910 UIView* newView = newVisualEffectViews[i];
911 id mockNewView = OCMPartialMock(newView);
912 UIView* originalView = originalVisualEffectViews[i];
914 XCTAssertEqual(originalView, newView);
915 OCMReject([mockNewView removeFromSuperview]);
916 [mockNewView stopMocking];
918 [newVisualEffectViews removeAllObjects];
922 for (
int i = 0; i < 5; i++) {
926 for (
int i = 0; i < 5; i++) {
938 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
941 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
942 flutterPlatformViewsController->CompositeEmbeddedView(2);
943 [mockFlutterView setNeedsLayout];
944 [mockFlutterView layoutIfNeeded];
946 for (UIView* subview in childClippingView.subviews) {
947 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
950 XCTAssertLessThan(newVisualEffectViews.count, 5u);
951 CGFloat expectInputRadius = 5;
952 if (newVisualEffectViews.count == 4) {
953 expectInputRadius = 2;
955 if ([
self validateOneVisualEffectView:subview
956 expectedFrame:CGRectMake(0, 0, 10, 10)
957 inputRadius:(CGFloat)expectInputRadius]) {
958 [newVisualEffectViews addObject:subview];
961 XCTAssertEqual(newVisualEffectViews.count, 5u);
963 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
964 UIView* newView = newVisualEffectViews[i];
965 id mockNewView = OCMPartialMock(newView);
966 UIView* originalView = originalVisualEffectViews[i];
968 XCTAssertEqual(originalView, newView);
969 OCMReject([mockNewView removeFromSuperview]);
970 [mockNewView stopMocking];
972 [newVisualEffectViews removeAllObjects];
976 for (
int i = 0; i < 5; i++) {
980 for (
int i = 0; i < 5; i++) {
986 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
989 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
990 flutterPlatformViewsController->CompositeEmbeddedView(2);
991 [mockFlutterView setNeedsLayout];
992 [mockFlutterView layoutIfNeeded];
994 for (UIView* subview in childClippingView.subviews) {
995 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
998 XCTAssertLessThan(newVisualEffectViews.count, 5u);
999 if ([
self validateOneVisualEffectView:subview
1000 expectedFrame:CGRectMake(0, 0, 10, 10)
1001 inputRadius:(CGFloat)newVisualEffectViews.count]) {
1002 [newVisualEffectViews addObject:subview];
1005 XCTAssertEqual(newVisualEffectViews.count, 5u);
1007 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
1008 UIView* newView = newVisualEffectViews[i];
1009 id mockNewView = OCMPartialMock(newView);
1010 UIView* originalView = originalVisualEffectViews[i];
1012 XCTAssertEqual(originalView, newView);
1013 OCMReject([mockNewView removeFromSuperview]);
1014 [mockNewView stopMocking];
1016 [newVisualEffectViews removeAllObjects];
1019- (void)testApplyBackdropFilterNotDlBlurImageFilter {
1020 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1021 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1026 thread_task_runner);
1027 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1028 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1030 mock_delegate.settings_.enable_impeller
1033 flutterPlatformViewsController,
1036 std::make_shared<fml::SyncSwitch>());
1040 flutterPlatformViewsController->RegisterViewFactory(
1041 factory,
@"MockFlutterPlatformView",
1045 flutterPlatformViewsController->OnMethodCall(
1047 methodCallWithMethodName:
@"create"
1048 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1053 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1054 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1058 CGFloat screenScale = [UIScreen mainScreen].scale;
1062 auto dilateFilter = std::make_shared<flutter::DlDilateImageFilter>(5, 2);
1065 auto embeddedViewParams =
1066 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1068 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1069 flutterPlatformViewsController->CompositeEmbeddedView(2);
1073 [mockFlutterView addSubview:childClippingView];
1075 [mockFlutterView setNeedsLayout];
1076 [mockFlutterView layoutIfNeeded];
1078 NSUInteger numberOfExpectedVisualEffectView = 0;
1079 for (UIView* subview in childClippingView.subviews) {
1080 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1081 numberOfExpectedVisualEffectView++;
1084 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1094 for (
int i = 0; i < 5; i++) {
1105 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1108 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1109 flutterPlatformViewsController->CompositeEmbeddedView(2);
1110 [mockFlutterView setNeedsLayout];
1111 [mockFlutterView layoutIfNeeded];
1113 numberOfExpectedVisualEffectView = 0;
1114 for (UIView* subview in childClippingView.subviews) {
1115 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1118 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1119 if ([
self validateOneVisualEffectView:subview
1120 expectedFrame:CGRectMake(0, 0, 10, 10)
1121 inputRadius:(CGFloat)5]) {
1122 numberOfExpectedVisualEffectView++;
1125 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1129 for (
int i = 0; i < 5; i++) {
1133 for (
int i = 0; i < 5; i++) {
1144 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1147 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1148 flutterPlatformViewsController->CompositeEmbeddedView(2);
1149 [mockFlutterView setNeedsLayout];
1150 [mockFlutterView layoutIfNeeded];
1152 numberOfExpectedVisualEffectView = 0;
1153 for (UIView* subview in childClippingView.subviews) {
1154 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1157 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1158 if ([
self validateOneVisualEffectView:subview
1159 expectedFrame:CGRectMake(0, 0, 10, 10)
1160 inputRadius:(CGFloat)5]) {
1161 numberOfExpectedVisualEffectView++;
1164 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1168 for (
int i = 0; i < 5; i++) {
1172 for (
int i = 0; i < 5; i++) {
1183 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1186 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1187 flutterPlatformViewsController->CompositeEmbeddedView(2);
1188 [mockFlutterView setNeedsLayout];
1189 [mockFlutterView layoutIfNeeded];
1191 numberOfExpectedVisualEffectView = 0;
1192 for (UIView* subview in childClippingView.subviews) {
1193 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1196 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1197 if ([
self validateOneVisualEffectView:subview
1198 expectedFrame:CGRectMake(0, 0, 10, 10)
1199 inputRadius:(CGFloat)5]) {
1200 numberOfExpectedVisualEffectView++;
1203 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1207 for (
int i = 0; i < 5; i++) {
1211 for (
int i = 0; i < 5; i++) {
1216 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1219 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1220 flutterPlatformViewsController->CompositeEmbeddedView(2);
1221 [mockFlutterView setNeedsLayout];
1222 [mockFlutterView layoutIfNeeded];
1224 numberOfExpectedVisualEffectView = 0;
1225 for (UIView* subview in childClippingView.subviews) {
1226 if ([subview isKindOfClass:[UIVisualEffectView class]]) {
1227 numberOfExpectedVisualEffectView++;
1230 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1233- (void)testApplyBackdropFilterCorrectAPI {
1238 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1239 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1243 visualEffectView:visualEffectView];
1244 XCTAssertNotNil(platformViewFilter);
1247- (void)testApplyBackdropFilterAPIChangedInvalidUIVisualEffectView {
1249 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc] init];
1253 visualEffectView:visualEffectView];
1254 XCTAssertNil(platformViewFilter);
1257- (void)testApplyBackdropFilterAPIChangedNoGaussianBlurFilter {
1259 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1260 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1261 NSArray* subviews = editedUIVisualEffectView.subviews;
1262 for (UIView* view in subviews) {
1263 if ([NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
1264 for (CIFilter* filter in view.layer.filters) {
1265 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1266 [filter setValue:@"notGaussianBlur" forKey:@"name"];
1276 visualEffectView:editedUIVisualEffectView];
1277 XCTAssertNil(platformViewFilter);
1280- (void)testApplyBackdropFilterAPIChangedInvalidInputRadius {
1282 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1283 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1284 NSArray* subviews = editedUIVisualEffectView.subviews;
1285 for (UIView* view in subviews) {
1286 if ([NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
1287 for (CIFilter* filter in view.layer.filters) {
1288 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1289 [filter setValue:@"invalidInputRadius" forKey:@"inputRadius"];
1300 visualEffectView:editedUIVisualEffectView];
1301 XCTAssertNil(platformViewFilter);
1304- (void)testBackdropFilterVisualEffectSubviewBackgroundColor {
1305 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1306 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1310 visualEffectView:visualEffectView];
1311 CGColorRef visualEffectSubviewBackgroundColor = nil;
1312 for (UIView* view in [platformViewFilter backdropFilterView].subviews) {
1313 if ([NSStringFromClass([view
class]) hasSuffix:
@"VisualEffectSubview"]) {
1314 visualEffectSubviewBackgroundColor = view.layer.backgroundColor;
1318 CGColorEqualToColor(visualEffectSubviewBackgroundColor, UIColor.clearColor.CGColor));
1321- (void)testCompositePlatformView {
1322 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1323 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1328 thread_task_runner);
1329 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1330 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1332 mock_delegate.settings_.enable_impeller
1335 flutterPlatformViewsController,
1338 std::make_shared<fml::SyncSwitch>());
1342 flutterPlatformViewsController->RegisterViewFactory(
1343 factory,
@"MockFlutterPlatformView",
1347 flutterPlatformViewsController->OnMethodCall(
1349 methodCallWithMethodName:
@"create"
1350 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1355 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1356 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1367 finalMatrix.
setConcat(screenScaleMatrix, translateMatrix);
1369 auto embeddedViewParams =
1370 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
1372 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1373 flutterPlatformViewsController->CompositeEmbeddedView(2);
1374 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1375 toView:mockFlutterView];
1376 XCTAssertTrue(CGRectEqualToRect(platformViewRectInFlutterView, CGRectMake(100, 100, 300, 300)));
1379- (void)testBackdropFilterCorrectlyPushedAndReset {
1380 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1381 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1386 thread_task_runner);
1387 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1388 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1390 mock_delegate.settings_.enable_impeller
1393 flutterPlatformViewsController,
1396 std::make_shared<fml::SyncSwitch>());
1400 flutterPlatformViewsController->RegisterViewFactory(
1401 factory,
@"MockFlutterPlatformView",
1405 flutterPlatformViewsController->OnMethodCall(
1407 methodCallWithMethodName:
@"create"
1408 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1413 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1414 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1418 CGFloat screenScale = [UIScreen mainScreen].scale;
1422 auto embeddedViewParams =
1423 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1425 flutterPlatformViewsController->BeginFrame(
SkISize::Make(0, 0));
1426 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1427 flutterPlatformViewsController->PushVisitedPlatformView(2);
1429 flutterPlatformViewsController->PushFilterToVisitedPlatformViews(
1431 flutterPlatformViewsController->CompositeEmbeddedView(2);
1434 [mockFlutterView addSubview:childClippingView];
1436 [mockFlutterView setNeedsLayout];
1437 [mockFlutterView layoutIfNeeded];
1440 NSUInteger numberOfExpectedVisualEffectView = 0;
1441 for (UIView* subview in childClippingView.subviews) {
1442 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1445 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1446 if ([
self validateOneVisualEffectView:subview
1447 expectedFrame:CGRectMake(0, 0, 10, 10)
1449 numberOfExpectedVisualEffectView++;
1452 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1455 auto embeddedViewParams2 =
1456 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1457 flutterPlatformViewsController->BeginFrame(
SkISize::Make(0, 0));
1458 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams2));
1459 flutterPlatformViewsController->CompositeEmbeddedView(2);
1462 [mockFlutterView setNeedsLayout];
1463 [mockFlutterView layoutIfNeeded];
1465 numberOfExpectedVisualEffectView = 0;
1466 for (UIView* subview in childClippingView.subviews) {
1467 if (![subview isKindOfClass:[UIVisualEffectView class]]) {
1470 numberOfExpectedVisualEffectView++;
1472 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1475- (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1476 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1477 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1482 thread_task_runner);
1483 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1484 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1486 mock_delegate.settings_.enable_impeller
1489 flutterPlatformViewsController,
1492 std::make_shared<fml::SyncSwitch>());
1496 flutterPlatformViewsController->RegisterViewFactory(
1497 factory,
@"MockFlutterPlatformView",
1501 flutterPlatformViewsController->OnMethodCall(
1503 methodCallWithMethodName:
@"create"
1504 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1509 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1510 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1522 finalMatrix.
setConcat(screenScaleMatrix, rotateMatrix);
1524 auto embeddedViewParams =
1525 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
1527 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1528 flutterPlatformViewsController->CompositeEmbeddedView(2);
1529 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1530 toView:mockFlutterView];
1536 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
1538 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
1541 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
1544 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
1548- (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
1549 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1550 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1555 thread_task_runner);
1556 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1557 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1559 mock_delegate.settings_.enable_impeller
1562 flutterPlatformViewsController,
1565 std::make_shared<fml::SyncSwitch>());
1569 flutterPlatformViewsController->RegisterViewFactory(
1570 factory,
@"MockFlutterPlatformView",
1574 flutterPlatformViewsController->OnMethodCall(
1576 methodCallWithMethodName:
@"create"
1577 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1582 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1583 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1602 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1605 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1606 flutterPlatformViewsController->CompositeEmbeddedView(2);
1610 [mockFlutterView addSubview:childClippingView];
1612 [mockFlutterView setNeedsLayout];
1613 [mockFlutterView layoutIfNeeded];
1614 XCTAssertNil(childClippingView.maskView);
1617- (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
1618 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1619 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1624 thread_task_runner);
1625 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1626 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1628 mock_delegate.settings_.enable_impeller
1631 flutterPlatformViewsController,
1634 std::make_shared<fml::SyncSwitch>());
1638 flutterPlatformViewsController->RegisterViewFactory(
1639 factory,
@"MockFlutterPlatformView",
1643 flutterPlatformViewsController->OnMethodCall(
1645 methodCallWithMethodName:
@"create"
1646 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1651 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1652 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1669 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1672 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1673 flutterPlatformViewsController->CompositeEmbeddedView(2);
1677 [mockFlutterView addSubview:childClippingView];
1679 [mockFlutterView setNeedsLayout];
1680 [mockFlutterView layoutIfNeeded];
1682 XCTAssertNotNil(childClippingView.maskView);
1685- (void)testClipRect {
1686 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1687 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1692 thread_task_runner);
1693 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1694 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1696 mock_delegate.settings_.enable_impeller
1699 flutterPlatformViewsController,
1702 std::make_shared<fml::SyncSwitch>());
1706 flutterPlatformViewsController->RegisterViewFactory(
1707 factory,
@"MockFlutterPlatformView",
1711 flutterPlatformViewsController->OnMethodCall(
1713 methodCallWithMethodName:
@"create"
1714 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1719 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1720 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1731 auto embeddedViewParams =
1732 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1734 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1735 flutterPlatformViewsController->CompositeEmbeddedView(2);
1739 [mockFlutterView addSubview:childClippingView];
1741 [mockFlutterView setNeedsLayout];
1742 [mockFlutterView layoutIfNeeded];
1744 for (
int i = 0; i < 10; i++) {
1745 for (
int j = 0; j < 10; j++) {
1746 CGPoint point = CGPointMake(i, j);
1750 CGRect insideClipping = CGRectMake(3, 3, 1, 1);
1751 if (CGRectContainsPoint(insideClipping, point)) {
1752 XCTAssertEqual(alpha, 255);
1754 XCTAssertLessThan(alpha, 255);
1760- (void)testClipRRect {
1761 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1762 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1767 thread_task_runner);
1768 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1769 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1771 mock_delegate.settings_.enable_impeller
1774 flutterPlatformViewsController,
1777 std::make_shared<fml::SyncSwitch>());
1781 flutterPlatformViewsController->RegisterViewFactory(
1782 factory,
@"MockFlutterPlatformView",
1786 flutterPlatformViewsController->OnMethodCall(
1788 methodCallWithMethodName:
@"create"
1789 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1794 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1795 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1806 auto embeddedViewParams =
1807 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1809 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1810 flutterPlatformViewsController->CompositeEmbeddedView(2);
1814 [mockFlutterView addSubview:childClippingView];
1816 [mockFlutterView setNeedsLayout];
1817 [mockFlutterView layoutIfNeeded];
1819 for (
int i = 0; i < 10; i++) {
1820 for (
int j = 0; j < 10; j++) {
1821 CGPoint point = CGPointMake(i, j);
1825 CGRect insideClipping = CGRectMake(3, 3, 4, 4);
1826 if (CGRectContainsPoint(insideClipping, point)) {
1827 XCTAssertEqual(alpha, 255);
1829 XCTAssertLessThan(alpha, 255);
1835- (void)testClipPath {
1836 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1837 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1842 thread_task_runner);
1843 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1844 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1846 mock_delegate.settings_.enable_impeller
1849 flutterPlatformViewsController,
1852 std::make_shared<fml::SyncSwitch>());
1856 flutterPlatformViewsController->RegisterViewFactory(
1857 factory,
@"MockFlutterPlatformView",
1861 flutterPlatformViewsController->OnMethodCall(
1863 methodCallWithMethodName:
@"create"
1864 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1869 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1870 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1882 auto embeddedViewParams =
1883 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
SkSize::Make(10, 10), stack);
1885 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1886 flutterPlatformViewsController->CompositeEmbeddedView(2);
1890 [mockFlutterView addSubview:childClippingView];
1892 [mockFlutterView setNeedsLayout];
1893 [mockFlutterView layoutIfNeeded];
1895 for (
int i = 0; i < 10; i++) {
1896 for (
int j = 0; j < 10; j++) {
1897 CGPoint point = CGPointMake(i, j);
1901 CGRect insideClipping = CGRectMake(3, 3, 4, 4);
1902 if (CGRectContainsPoint(insideClipping, point)) {
1903 XCTAssertEqual(alpha, 255);
1905 XCTAssertLessThan(alpha, 255);
1911- (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
1912 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1913 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1918 thread_task_runner);
1919 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1920 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1922 mock_delegate.settings_.enable_impeller
1925 flutterPlatformViewsController,
1928 std::make_shared<fml::SyncSwitch>());
1932 flutterPlatformViewsController->RegisterViewFactory(
1933 factory,
@"MockFlutterPlatformView",
1937 flutterPlatformViewsController->OnMethodCall(
1939 methodCallWithMethodName:
@"create"
1940 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1947 while (touchInteceptorView != nil &&
1949 touchInteceptorView = touchInteceptorView.superview;
1951 XCTAssertNotNil(touchInteceptorView);
1954 UIGestureRecognizer* forwardGectureRecognizer = nil;
1955 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
1956 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
1957 forwardGectureRecognizer = gestureRecognizer;
1963 NSSet* touches1 = [[NSSet alloc] init];
1964 id event1 = OCMClassMock([
UIEvent class]);
1966 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
1967 OCMReject([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
1970 NSSet* touches2 = [[NSSet alloc] init];
1971 id event2 = OCMClassMock([
UIEvent class]);
1972 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
1973 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
1974 OCMVerify([mockFlutterViewContoller touchesBegan:touches2 withEvent:event2]);
1977- (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
1978 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1979 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
1984 thread_task_runner);
1985 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1986 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1988 mock_delegate.settings_.enable_impeller
1991 flutterPlatformViewsController,
1994 std::make_shared<fml::SyncSwitch>());
1998 flutterPlatformViewsController->RegisterViewFactory(
1999 factory,
@"MockFlutterPlatformView",
2003 flutterPlatformViewsController->OnMethodCall(
2005 methodCallWithMethodName:
@"create"
2006 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2013 while (touchInteceptorView != nil &&
2015 touchInteceptorView = touchInteceptorView.superview;
2017 XCTAssertNotNil(touchInteceptorView);
2020 UIGestureRecognizer* forwardGectureRecognizer = nil;
2021 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2022 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2023 forwardGectureRecognizer = gestureRecognizer;
2030 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2032 NSSet* touches1 = [[NSSet alloc] init];
2033 id event1 = OCMClassMock([
UIEvent class]);
2034 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2035 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2037 flutterPlatformViewsController->SetFlutterViewController(nil);
2040 NSSet* touches2 = [[NSSet alloc] init];
2041 id event2 = OCMClassMock([
UIEvent class]);
2042 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2043 OCMVerify([mockFlutterViewContoller touchesMoved:touches2 withEvent:event2]);
2045 NSSet* touches3 = [[NSSet alloc] init];
2046 id event3 = OCMClassMock([
UIEvent class]);
2047 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2048 OCMVerify([mockFlutterViewContoller touchesEnded:touches3 withEvent:event3]);
2051 NSSet* touches4 = [[NSSet alloc] init];
2052 id event4 = OCMClassMock([
UIEvent class]);
2053 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2054 OCMReject([mockFlutterViewContoller touchesBegan:touches4 withEvent:event4]);
2056 NSSet* touches5 = [[NSSet alloc] init];
2057 id event5 = OCMClassMock([
UIEvent class]);
2058 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2059 OCMReject([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2064 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2066 NSSet* touches1 = [[NSSet alloc] init];
2067 id event1 = OCMClassMock([
UIEvent class]);
2068 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2069 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2071 flutterPlatformViewsController->SetFlutterViewController(nil);
2074 NSSet* touches2 = [[NSSet alloc] init];
2075 id event2 = OCMClassMock([
UIEvent class]);
2076 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2077 OCMVerify([mockFlutterViewContoller touchesMoved:touches2 withEvent:event2]);
2079 NSSet* touches3 = [[NSSet alloc] init];
2080 id event3 = OCMClassMock([
UIEvent class]);
2081 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2082 OCMVerify([mockFlutterViewContoller forceTouchesCancelled:touches3]);
2085 NSSet* touches4 = [[NSSet alloc] init];
2086 id event4 = OCMClassMock([
UIEvent class]);
2087 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2088 OCMReject([mockFlutterViewContoller touchesBegan:touches4 withEvent:event4]);
2090 NSSet* touches5 = [[NSSet alloc] init];
2091 id event5 = OCMClassMock([
UIEvent class]);
2092 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2093 OCMReject([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2096 flutterPlatformViewsController->Reset();
2100 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2101 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2102 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2107 thread_task_runner);
2108 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2109 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2111 mock_delegate.settings_.enable_impeller
2114 flutterPlatformViewsController,
2117 std::make_shared<fml::SyncSwitch>());
2121 flutterPlatformViewsController->RegisterViewFactory(
2122 factory,
@"MockFlutterPlatformView",
2126 flutterPlatformViewsController->OnMethodCall(
2128 methodCallWithMethodName:
@"create"
2129 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2136 while (touchInteceptorView != nil &&
2138 touchInteceptorView = touchInteceptorView.superview;
2140 XCTAssertNotNil(touchInteceptorView);
2143 UIGestureRecognizer* forwardGectureRecognizer = nil;
2144 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2145 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2146 forwardGectureRecognizer = gestureRecognizer;
2152 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2155 NSSet* touches1 = [NSSet setWithObject:@1];
2156 id event1 = OCMClassMock([
UIEvent class]);
2157 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2158 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2161 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller2);
2165 NSSet* touches2 = [NSSet setWithObject:@1];
2166 id event2 = OCMClassMock([
UIEvent class]);
2167 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2168 OCMVerify([mockFlutterViewContoller touchesBegan:touches2 withEvent:event2]);
2169 OCMReject([mockFlutterViewContoller2 touchesBegan:touches2 withEvent:event2]);
2171 NSSet* touches3 = [NSSet setWithObject:@1];
2172 id event3 = OCMClassMock([
UIEvent class]);
2173 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
2174 OCMVerify([mockFlutterViewContoller touchesMoved:touches3 withEvent:event3]);
2175 OCMReject([mockFlutterViewContoller2 touchesMoved:touches3 withEvent:event3]);
2177 NSSet* touches4 = [NSSet setWithObject:@1];
2178 id event4 = OCMClassMock([
UIEvent class]);
2179 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
2180 OCMVerify([mockFlutterViewContoller touchesEnded:touches4 withEvent:event4]);
2181 OCMReject([mockFlutterViewContoller2 touchesEnded:touches4 withEvent:event4]);
2183 NSSet* touches5 = [NSSet setWithObject:@1];
2184 id event5 = OCMClassMock([
UIEvent class]);
2185 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2186 OCMVerify([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2187 OCMReject([mockFlutterViewContoller2 touchesEnded:touches5 withEvent:event5]);
2191 NSSet* touches6 = [NSSet setWithObject:@1];
2192 id event6 = OCMClassMock([
UIEvent class]);
2193 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
2194 OCMVerify([mockFlutterViewContoller2 touchesBegan:touches6 withEvent:event6]);
2195 OCMReject([mockFlutterViewContoller touchesBegan:touches6 withEvent:event6]);
2198 NSSet* touches7 = [NSSet setWithObject:@1];
2199 id event7 = OCMClassMock([
UIEvent class]);
2200 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
2201 OCMVerify([mockFlutterViewContoller2 touchesMoved:touches7 withEvent:event7]);
2202 OCMReject([mockFlutterViewContoller touchesMoved:touches7 withEvent:event7]);
2204 NSSet* touches8 = [NSSet setWithObject:@1];
2205 id event8 = OCMClassMock([
UIEvent class]);
2206 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
2207 OCMVerify([mockFlutterViewContoller2 touchesEnded:touches8 withEvent:event8]);
2208 OCMReject([mockFlutterViewContoller touchesEnded:touches8 withEvent:event8]);
2210 flutterPlatformViewsController->Reset();
2213- (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
2214 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2215 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2220 thread_task_runner);
2221 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2222 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2224 mock_delegate.settings_.enable_impeller
2227 flutterPlatformViewsController,
2230 std::make_shared<fml::SyncSwitch>());
2234 flutterPlatformViewsController->RegisterViewFactory(
2235 factory,
@"MockFlutterPlatformView",
2239 flutterPlatformViewsController->OnMethodCall(
2241 methodCallWithMethodName:
@"create"
2242 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2249 while (touchInteceptorView != nil &&
2251 touchInteceptorView = touchInteceptorView.superview;
2253 XCTAssertNotNil(touchInteceptorView);
2256 UIGestureRecognizer* forwardGectureRecognizer = nil;
2257 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2258 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2259 forwardGectureRecognizer = gestureRecognizer;
2265 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2267 NSSet* touches1 = [NSSet setWithObject:@1];
2268 id event1 = OCMClassMock([
UIEvent class]);
2269 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2271 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
2272 OCMVerify([mockFlutterViewContoller forceTouchesCancelled:touches1]);
2274 flutterPlatformViewsController->Reset();
2277- (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
2278 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2279 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2284 thread_task_runner);
2285 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2286 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2288 mock_delegate.settings_.enable_impeller
2291 flutterPlatformViewsController,
2294 std::make_shared<fml::SyncSwitch>());
2298 flutterPlatformViewsController->RegisterViewFactory(
2299 factory,
@"MockFlutterPlatformView",
2303 flutterPlatformViewsController->OnMethodCall(
2305 methodCallWithMethodName:
@"create"
2306 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2315 auto embeddedViewParams_1 =
2316 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2318 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams_1));
2319 flutterPlatformViewsController->CompositeEmbeddedView(2);
2321 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2322 nullptr, framebuffer_info,
2326 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(
mock_surface)));
2328 auto embeddedViewParams_2 =
2329 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2330 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams_2));
2331 flutterPlatformViewsController->CompositeEmbeddedView(2);
2332 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
2333 nullptr, framebuffer_info,
2336 XCTAssertTrue(flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr,
2337 std::move(mock_surface_submit_true)));
2341 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
2342 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2343 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2348 thread_task_runner);
2349 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2350 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2352 mock_delegate.settings_.enable_impeller
2355 flutterPlatformViewsController,
2358 std::make_shared<fml::SyncSwitch>());
2360 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2361 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2365 flutterPlatformViewsController->RegisterViewFactory(
2366 factory,
@"MockFlutterPlatformView",
2372 flutterPlatformViewsController->OnMethodCall(
2374 methodCallWithMethodName:
@"create"
2375 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2380 auto embeddedViewParams =
2381 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2382 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
2383 flutterPlatformViewsController->CompositeEmbeddedView(2);
2388 flutterPlatformViewsController->Reset();
2393- (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
2394 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2395 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2400 thread_task_runner);
2401 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2402 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2404 mock_delegate.settings_.enable_impeller
2407 flutterPlatformViewsController,
2410 std::make_shared<fml::SyncSwitch>());
2412 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2413 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2417 flutterPlatformViewsController->RegisterViewFactory(
2418 factory,
@"MockFlutterPlatformView",
2423 flutterPlatformViewsController->OnMethodCall(
2425 methodCallWithMethodName:
@"create"
2426 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2430 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2433 auto embeddedViewParams1 =
2434 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2435 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2436 flutterPlatformViewsController->CompositeEmbeddedView(0);
2437 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL);
2440 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2441 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 0UL);
2443 auto embeddedViewParams2 =
2444 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2445 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams2));
2446 flutterPlatformViewsController->CompositeEmbeddedView(0);
2447 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL);
2451 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
2452 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2453 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2458 thread_task_runner);
2459 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2460 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2462 mock_delegate.settings_.enable_impeller
2465 flutterPlatformViewsController,
2468 std::make_shared<fml::SyncSwitch>());
2470 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2471 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2475 flutterPlatformViewsController->RegisterViewFactory(
2476 factory,
@"MockFlutterPlatformView",
2480 flutterPlatformViewsController->OnMethodCall(
2482 methodCallWithMethodName:
@"create"
2483 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2488 flutterPlatformViewsController->OnMethodCall(
2490 methodCallWithMethodName:
@"create"
2491 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2495 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2498 auto embeddedViewParams1 =
2499 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2500 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2501 flutterPlatformViewsController->CompositeEmbeddedView(0);
2502 auto embeddedViewParams2 =
2503 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(500, 500), stack);
2504 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2505 flutterPlatformViewsController->CompositeEmbeddedView(1);
2511 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2512 std::move(mock_sk_surface), framebuffer_info,
2517 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(
mock_surface)));
2519 UIView* clippingView1 = view1.superview.superview;
2520 UIView* clippingView2 = view2.superview.superview;
2521 UIView* flutterView = clippingView1.superview;
2522 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2523 [flutterView.subviews indexOfObject:clippingView2],
2524 @"The first clipping view should be added before the second clipping view.");
2527 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2529 embeddedViewParams2 =
2530 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(500, 500), stack);
2531 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2532 flutterPlatformViewsController->CompositeEmbeddedView(1);
2533 embeddedViewParams1 =
2534 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2535 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2536 flutterPlatformViewsController->CompositeEmbeddedView(0);
2539 mock_surface = std::make_unique<flutter::SurfaceFrame>(
2540 std::move(mock_sk_surface), framebuffer_info,
2544 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(
mock_surface)));
2545 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
2546 [flutterView.subviews indexOfObject:clippingView2],
2547 @"The first clipping view should be added after the second clipping view.");
2551 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
2552 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2553 auto thread_task_runner = CreateNewThread(
"FlutterPlatformViewsTest");
2558 thread_task_runner);
2559 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2560 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2562 mock_delegate.settings_.enable_impeller
2565 flutterPlatformViewsController,
2568 std::make_shared<fml::SyncSwitch>());
2570 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2571 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2575 flutterPlatformViewsController->RegisterViewFactory(
2576 factory,
@"MockFlutterPlatformView",
2580 flutterPlatformViewsController->OnMethodCall(
2582 methodCallWithMethodName:
@"create"
2583 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2588 flutterPlatformViewsController->OnMethodCall(
2590 methodCallWithMethodName:
@"create"
2591 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2595 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2598 auto embeddedViewParams1 =
2599 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2600 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2601 flutterPlatformViewsController->CompositeEmbeddedView(0);
2602 auto embeddedViewParams2 =
2603 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(500, 500), stack);
2604 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2605 flutterPlatformViewsController->CompositeEmbeddedView(1);
2611 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2612 std::move(mock_sk_surface), framebuffer_info,
2617 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(
mock_surface)));
2619 UIView* clippingView1 = view1.superview.superview;
2620 UIView* clippingView2 = view2.superview.superview;
2621 UIView* flutterView = clippingView1.superview;
2622 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2623 [flutterView.subviews indexOfObject:clippingView2],
2624 @"The first clipping view should be added before the second clipping view.");
2627 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2629 embeddedViewParams1 =
2630 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2631 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2632 flutterPlatformViewsController->CompositeEmbeddedView(0);
2633 embeddedViewParams2 =
2634 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(500, 500), stack);
2635 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2636 flutterPlatformViewsController->CompositeEmbeddedView(1);
2639 mock_surface = std::make_unique<flutter::SurfaceFrame>(
2640 std::move(mock_sk_surface), framebuffer_info,
2644 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(
mock_surface)));
2645 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2646 [flutterView.subviews indexOfObject:clippingView2],
2647 @"The first clipping view should be added before the second clipping view.");
2650- (void)testThreadMergeAtEndFrame {
2651 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2652 auto thread_task_runner_platform = CreateNewThread(
"FlutterPlatformViewsTest1");
2653 auto thread_task_runner_other = CreateNewThread(
"FlutterPlatformViewsTest2");
2655 thread_task_runner_platform,
2656 thread_task_runner_other,
2657 thread_task_runner_other,
2658 thread_task_runner_other);
2659 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2660 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2662 mock_delegate.settings_.enable_impeller
2665 flutterPlatformViewsController,
2668 std::make_shared<fml::SyncSwitch>());
2670 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2671 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2675 flutterPlatformViewsController->RegisterViewFactory(
2676 factory,
@"MockFlutterPlatformView",
2678 XCTestExpectation* waitForPlatformView =
2679 [
self expectationWithDescription:@"wait for platform view to be created"];
2681 [waitForPlatformView fulfill];
2684 flutterPlatformViewsController->OnMethodCall(
2686 methodCallWithMethodName:
@"create"
2687 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2689 [
self waitForExpectations:@[ waitForPlatformView ] timeout:30];
2692 flutterPlatformViewsController->BeginFrame(
SkISize::Make(300, 300));
2695 auto embeddedViewParams =
2696 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix,
SkSize::Make(300, 300), stack);
2697 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
2700 fml::MakeRefCounted<fml::RasterThreadMerger>(thread_task_runner_platform->GetTaskQueueId(),
2701 thread_task_runner_other->GetTaskQueueId());
2702 XCTAssertEqual(flutterPlatformViewsController->PostPrerollAction(raster_thread_merger),
2704 XCTAssertFalse(raster_thread_merger->IsMerged());
2706 flutterPlatformViewsController->EndFrame(
true, raster_thread_merger);
2707 XCTAssertTrue(raster_thread_merger->IsMerged());
2715- (
int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
2716 unsigned char pixel[4] = {0};
2718 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
2721 CGContextRef context = CGBitmapContextCreate(
2722 pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
2723 CGContextTranslateCTM(context, -point.x, -point.y);
2724 [view.layer renderInContext:context];
2726 CGContextRelease(context);
2727 CGColorSpaceRelease(colorSpace);