5 #import <OCMock/OCMock.h>
6 #import <UIKit/UIKit.h>
7 #import <XCTest/XCTest.h>
28 - (instancetype)init {
43 @property(nonatomic, strong) UIView* view;
44 @property(nonatomic, assign) BOOL viewCreated;
49 - (instancetype)init {
50 if (
self = [super init]) {
58 [
self checkViewCreatedOnce];
62 - (void)checkViewCreatedOnce {
66 self.viewCreated = YES;
72 : NSObject <FlutterPlatformViewFactory>
77 viewIdentifier:(int64_t)viewId
78 arguments:(
id _Nullable)args {
86 class FlutterPlatformViewsTestMockPlatformViewDelegate :
public PlatformView::Delegate {
88 void OnPlatformViewCreated(std::unique_ptr<Surface> surface)
override {}
89 void OnPlatformViewDestroyed()
override {}
90 void OnPlatformViewScheduleFrame()
override {}
91 void OnPlatformViewSetNextFrameCallback(
const fml::closure& closure)
override {}
92 void OnPlatformViewSetViewportMetrics(int64_t view_id,
const ViewportMetrics& metrics)
override {}
93 const flutter::Settings& OnPlatformViewGetSettings()
const override {
return settings_; }
94 void OnPlatformViewDispatchPlatformMessage(std::unique_ptr<PlatformMessage> message)
override {}
95 void OnPlatformViewDispatchPointerDataPacket(std::unique_ptr<PointerDataPacket> packet)
override {
97 void OnPlatformViewDispatchSemanticsAction(int32_t
id,
98 SemanticsAction action,
99 fml::MallocMapping args)
override {}
100 void OnPlatformViewSetSemanticsEnabled(
bool enabled)
override {}
101 void OnPlatformViewSetAccessibilityFeatures(int32_t flags)
override {}
102 void OnPlatformViewRegisterTexture(std::shared_ptr<Texture> texture)
override {}
103 void OnPlatformViewUnregisterTexture(int64_t
texture_id)
override {}
104 void OnPlatformViewMarkTextureFrameAvailable(int64_t
texture_id)
override {}
106 void LoadDartDeferredLibrary(intptr_t loading_unit_id,
107 std::unique_ptr<const fml::Mapping> snapshot_data,
108 std::unique_ptr<const fml::Mapping> snapshot_instructions)
override {
110 void LoadDartDeferredLibraryError(intptr_t loading_unit_id,
111 const std::string error_message,
112 bool transient)
override {}
113 void UpdateAssetResolverByType(std::unique_ptr<flutter::AssetResolver> updated_asset_resolver,
114 flutter::AssetResolver::AssetResolverType type)
override {}
123 fml::RefPtr<fml::TaskRunner>
CreateNewThread(
const std::string& name) {
124 auto thread = std::make_unique<fml::Thread>(name);
125 auto runner = thread->GetTaskRunner();
135 - (void)testFlutterViewOnlyCreateOnceInOneFrame {
136 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
138 flutter::TaskRunners runners(
self.name.UTF8String,
143 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
144 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
146 mock_delegate.settings_.enable_impeller
149 flutterPlatformViewsController,
152 std::make_shared<fml::SyncSwitch>());
156 flutterPlatformViewsController->RegisterViewFactory(
157 factory,
@"MockFlutterPlatformView",
161 flutterPlatformViewsController->OnMethodCall(
163 methodCallWithMethodName:
@"create"
164 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
166 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
167 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
169 flutter::MutatorsStack stack;
171 SkMatrix screenScaleMatrix =
172 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
173 stack.PushTransform(screenScaleMatrix);
175 SkMatrix translateMatrix = SkMatrix::Translate(100, 100);
176 stack.PushTransform(translateMatrix);
177 SkMatrix finalMatrix;
178 finalMatrix.setConcat(screenScaleMatrix, translateMatrix);
180 auto embeddedViewParams =
181 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
183 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
184 flutterPlatformViewsController->CompositeEmbeddedView(2);
186 flutterPlatformViewsController->GetPlatformViewRect(2);
190 flutterPlatformViewsController->Reset();
193 - (void)testCanCreatePlatformViewWithoutFlutterView {
194 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
196 flutter::TaskRunners runners(
self.name.UTF8String,
201 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
202 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
204 mock_delegate.settings_.enable_impeller
207 flutterPlatformViewsController,
210 std::make_shared<fml::SyncSwitch>());
214 flutterPlatformViewsController->RegisterViewFactory(
215 factory,
@"MockFlutterPlatformView",
219 flutterPlatformViewsController->OnMethodCall(
221 methodCallWithMethodName:
@"create"
222 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
228 - (void)testChildClippingViewHitTests {
231 UIView* childView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
232 [childClippingView addSubview:childView];
234 XCTAssertFalse([childClippingView pointInside:CGPointMake(50, 50) withEvent:nil]);
235 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 100) withEvent:nil]);
236 XCTAssertFalse([childClippingView pointInside:CGPointMake(100, 99) withEvent:nil]);
237 XCTAssertFalse([childClippingView pointInside:CGPointMake(201, 200) withEvent:nil]);
238 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 201) withEvent:nil]);
239 XCTAssertFalse([childClippingView pointInside:CGPointMake(99, 200) withEvent:nil]);
240 XCTAssertFalse([childClippingView pointInside:CGPointMake(200, 299) withEvent:nil]);
242 XCTAssertTrue([childClippingView pointInside:CGPointMake(150, 150) withEvent:nil]);
243 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 100) withEvent:nil]);
244 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 100) withEvent:nil]);
245 XCTAssertTrue([childClippingView pointInside:CGPointMake(100, 199) withEvent:nil]);
246 XCTAssertTrue([childClippingView pointInside:CGPointMake(199, 199) withEvent:nil]);
249 - (void)testReleasesBackdropFilterSubviewsOnChildClippingViewDealloc {
250 __weak NSMutableArray<UIVisualEffectView*>* weakBackdropFilterSubviews = nil;
254 XCTAssertNotNil(weakBackdropFilterSubviews);
257 XCTAssertNil(weakBackdropFilterSubviews);
260 - (void)testApplyBackdropFilter {
261 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
263 flutter::TaskRunners runners(
self.name.UTF8String,
268 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
269 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
271 mock_delegate.settings_.enable_impeller
274 flutterPlatformViewsController,
277 std::make_shared<fml::SyncSwitch>());
281 flutterPlatformViewsController->RegisterViewFactory(
282 factory,
@"MockFlutterPlatformView",
286 flutterPlatformViewsController->OnMethodCall(
288 methodCallWithMethodName:
@"create"
289 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
294 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
295 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
297 flutter::MutatorsStack stack;
299 CGFloat screenScale = [UIScreen mainScreen].scale;
300 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
301 stack.PushTransform(screenScaleMatrix);
303 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
304 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
306 auto embeddedViewParams =
307 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
309 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
310 flutterPlatformViewsController->CompositeEmbeddedView(2);
313 [mockFlutterView addSubview:childClippingView];
315 [mockFlutterView setNeedsLayout];
316 [mockFlutterView layoutIfNeeded];
319 NSUInteger numberOfExpectedVisualEffectView = 0;
320 for (UIView* subview in childClippingView.subviews) {
321 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
324 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
325 if ([
self validateOneVisualEffectView:subview
326 expectedFrame:CGRectMake(0, 0, 10, 10)
328 numberOfExpectedVisualEffectView++;
331 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
334 - (void)testApplyBackdropFilterWithCorrectFrame {
335 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
337 flutter::TaskRunners runners(
self.name.UTF8String,
342 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
343 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
345 mock_delegate.settings_.enable_impeller
348 flutterPlatformViewsController,
351 std::make_shared<fml::SyncSwitch>());
355 flutterPlatformViewsController->RegisterViewFactory(
356 factory,
@"MockFlutterPlatformView",
360 flutterPlatformViewsController->OnMethodCall(
362 methodCallWithMethodName:
@"create"
363 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
368 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
369 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
371 flutter::MutatorsStack stack;
373 CGFloat screenScale = [UIScreen mainScreen].scale;
374 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
375 stack.PushTransform(screenScaleMatrix);
377 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
378 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 8, screenScale * 8));
380 auto embeddedViewParams =
381 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(5, 10), stack);
383 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
384 flutterPlatformViewsController->CompositeEmbeddedView(2);
387 [mockFlutterView addSubview:childClippingView];
389 [mockFlutterView setNeedsLayout];
390 [mockFlutterView layoutIfNeeded];
393 NSUInteger numberOfExpectedVisualEffectView = 0;
394 for (UIView* subview in childClippingView.subviews) {
395 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
398 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
399 if ([
self validateOneVisualEffectView:subview
400 expectedFrame:CGRectMake(0, 0, 5, 8)
402 numberOfExpectedVisualEffectView++;
405 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
408 - (void)testApplyMultipleBackdropFilters {
409 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
411 flutter::TaskRunners runners(
self.name.UTF8String,
416 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
417 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
419 mock_delegate.settings_.enable_impeller
422 flutterPlatformViewsController,
425 std::make_shared<fml::SyncSwitch>());
429 flutterPlatformViewsController->RegisterViewFactory(
430 factory,
@"MockFlutterPlatformView",
434 flutterPlatformViewsController->OnMethodCall(
436 methodCallWithMethodName:
@"create"
437 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
442 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
443 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
445 flutter::MutatorsStack stack;
447 CGFloat screenScale = [UIScreen mainScreen].scale;
448 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
449 stack.PushTransform(screenScaleMatrix);
451 for (
int i = 0; i < 50; i++) {
452 auto filter = std::make_shared<flutter::DlBlurImageFilter>(i, 2, flutter::DlTileMode::kClamp);
453 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
456 auto embeddedViewParams =
457 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(20, 20), stack);
459 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
460 flutterPlatformViewsController->CompositeEmbeddedView(2);
463 [mockFlutterView addSubview:childClippingView];
465 [mockFlutterView setNeedsLayout];
466 [mockFlutterView layoutIfNeeded];
468 NSUInteger numberOfExpectedVisualEffectView = 0;
469 for (UIView* subview in childClippingView.subviews) {
470 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
473 XCTAssertLessThan(numberOfExpectedVisualEffectView, 50u);
474 if ([
self validateOneVisualEffectView:subview
475 expectedFrame:CGRectMake(0, 0, 10, 10)
476 inputRadius:(CGFloat)numberOfExpectedVisualEffectView]) {
477 numberOfExpectedVisualEffectView++;
480 XCTAssertEqual(numberOfExpectedVisualEffectView, (NSUInteger)numberOfExpectedVisualEffectView);
483 - (void)testAddBackdropFilters {
484 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
486 flutter::TaskRunners runners(
self.name.UTF8String,
491 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
492 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
494 mock_delegate.settings_.enable_impeller
497 flutterPlatformViewsController,
500 std::make_shared<fml::SyncSwitch>());
504 flutterPlatformViewsController->RegisterViewFactory(
505 factory,
@"MockFlutterPlatformView",
509 flutterPlatformViewsController->OnMethodCall(
511 methodCallWithMethodName:
@"create"
512 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
517 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
518 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
520 flutter::MutatorsStack stack;
522 CGFloat screenScale = [UIScreen mainScreen].scale;
523 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
524 stack.PushTransform(screenScaleMatrix);
526 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
527 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
529 auto embeddedViewParams =
530 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
532 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
533 flutterPlatformViewsController->CompositeEmbeddedView(2);
536 [mockFlutterView addSubview:childClippingView];
538 [mockFlutterView setNeedsLayout];
539 [mockFlutterView layoutIfNeeded];
541 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
542 for (UIView* subview in childClippingView.subviews) {
543 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
546 XCTAssertLessThan(originalVisualEffectViews.count, 1u);
547 if ([
self validateOneVisualEffectView:subview
548 expectedFrame:CGRectMake(0, 0, 10, 10)
549 inputRadius:(CGFloat)5]) {
550 [originalVisualEffectViews addObject:subview];
553 XCTAssertEqual(originalVisualEffectViews.count, 1u);
558 flutter::MutatorsStack stack2;
560 stack2.PushTransform(screenScaleMatrix);
562 for (
int i = 0; i < 2; i++) {
563 stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
566 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
567 SkSize::Make(10, 10), stack2);
569 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
570 flutterPlatformViewsController->CompositeEmbeddedView(2);
571 [mockFlutterView setNeedsLayout];
572 [mockFlutterView layoutIfNeeded];
574 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
575 for (UIView* subview in childClippingView.subviews) {
576 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
579 XCTAssertLessThan(newVisualEffectViews.count, 2u);
581 if ([
self validateOneVisualEffectView:subview
582 expectedFrame:CGRectMake(0, 0, 10, 10)
583 inputRadius:(CGFloat)5]) {
584 [newVisualEffectViews addObject:subview];
587 XCTAssertEqual(newVisualEffectViews.count, 2u);
588 for (NSUInteger i = 0; i < originalVisualEffectViews.count; i++) {
589 UIView* originalView = originalVisualEffectViews[i];
590 UIView* newView = newVisualEffectViews[i];
592 XCTAssertEqual(originalView, newView);
593 id mockOrignalView = OCMPartialMock(originalView);
594 OCMReject([mockOrignalView removeFromSuperview]);
598 - (void)testRemoveBackdropFilters {
599 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
601 flutter::TaskRunners runners(
self.name.UTF8String,
606 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
607 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
609 mock_delegate.settings_.enable_impeller
612 flutterPlatformViewsController,
615 std::make_shared<fml::SyncSwitch>());
619 flutterPlatformViewsController->RegisterViewFactory(
620 factory,
@"MockFlutterPlatformView",
624 flutterPlatformViewsController->OnMethodCall(
626 methodCallWithMethodName:
@"create"
627 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
632 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
633 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
635 flutter::MutatorsStack stack;
637 CGFloat screenScale = [UIScreen mainScreen].scale;
638 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
639 stack.PushTransform(screenScaleMatrix);
641 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
642 for (
int i = 0; i < 5; i++) {
643 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
646 auto embeddedViewParams =
647 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
649 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
650 flutterPlatformViewsController->CompositeEmbeddedView(2);
653 [mockFlutterView addSubview:childClippingView];
655 [mockFlutterView setNeedsLayout];
656 [mockFlutterView layoutIfNeeded];
658 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
659 for (UIView* subview in childClippingView.subviews) {
660 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
663 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
664 if ([
self validateOneVisualEffectView:subview
665 expectedFrame:CGRectMake(0, 0, 10, 10)
666 inputRadius:(CGFloat)5]) {
667 [originalVisualEffectViews addObject:subview];
673 flutter::MutatorsStack stack2;
675 stack2.PushTransform(screenScaleMatrix);
677 for (
int i = 0; i < 4; i++) {
678 stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
681 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
682 SkSize::Make(10, 10), stack2);
684 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
685 flutterPlatformViewsController->CompositeEmbeddedView(2);
686 [mockFlutterView setNeedsLayout];
687 [mockFlutterView layoutIfNeeded];
689 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
690 for (UIView* subview in childClippingView.subviews) {
691 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
694 XCTAssertLessThan(newVisualEffectViews.count, 4u);
695 if ([
self validateOneVisualEffectView:subview
696 expectedFrame:CGRectMake(0, 0, 10, 10)
697 inputRadius:(CGFloat)5]) {
698 [newVisualEffectViews addObject:subview];
701 XCTAssertEqual(newVisualEffectViews.count, 4u);
703 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
704 UIView* newView = newVisualEffectViews[i];
705 id mockNewView = OCMPartialMock(newView);
706 UIView* originalView = originalVisualEffectViews[i];
708 XCTAssertEqual(originalView, newView);
709 OCMReject([mockNewView removeFromSuperview]);
710 [mockNewView stopMocking];
715 for (
int i = 0; i < 5; i++) {
720 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
721 SkSize::Make(10, 10), stack2);
723 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
724 flutterPlatformViewsController->CompositeEmbeddedView(2);
725 [mockFlutterView setNeedsLayout];
726 [mockFlutterView layoutIfNeeded];
728 NSUInteger numberOfExpectedVisualEffectView = 0u;
729 for (UIView* subview in childClippingView.subviews) {
730 if ([subview isKindOfClass:[UIVisualEffectView
class]]) {
731 numberOfExpectedVisualEffectView++;
734 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
737 - (void)testEditBackdropFilters {
738 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
740 flutter::TaskRunners runners(
self.name.UTF8String,
745 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
746 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
748 mock_delegate.settings_.enable_impeller
751 flutterPlatformViewsController,
754 std::make_shared<fml::SyncSwitch>());
758 flutterPlatformViewsController->RegisterViewFactory(
759 factory,
@"MockFlutterPlatformView",
763 flutterPlatformViewsController->OnMethodCall(
765 methodCallWithMethodName:
@"create"
766 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
771 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
772 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
774 flutter::MutatorsStack stack;
776 CGFloat screenScale = [UIScreen mainScreen].scale;
777 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
778 stack.PushTransform(screenScaleMatrix);
780 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
781 for (
int i = 0; i < 5; i++) {
782 stack.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
785 auto embeddedViewParams =
786 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
788 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
789 flutterPlatformViewsController->CompositeEmbeddedView(2);
792 [mockFlutterView addSubview:childClippingView];
794 [mockFlutterView setNeedsLayout];
795 [mockFlutterView layoutIfNeeded];
797 NSMutableArray* originalVisualEffectViews = [[NSMutableArray alloc] init];
798 for (UIView* subview in childClippingView.subviews) {
799 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
802 XCTAssertLessThan(originalVisualEffectViews.count, 5u);
803 if ([
self validateOneVisualEffectView:subview
804 expectedFrame:CGRectMake(0, 0, 10, 10)
805 inputRadius:(CGFloat)5]) {
806 [originalVisualEffectViews addObject:subview];
812 flutter::MutatorsStack stack2;
814 stack2.PushTransform(screenScaleMatrix);
816 for (
int i = 0; i < 5; i++) {
819 std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
821 stack2.PushBackdropFilter(filter2,
822 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
826 stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
829 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
830 SkSize::Make(10, 10), stack2);
832 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
833 flutterPlatformViewsController->CompositeEmbeddedView(2);
834 [mockFlutterView setNeedsLayout];
835 [mockFlutterView layoutIfNeeded];
837 NSMutableArray* newVisualEffectViews = [[NSMutableArray alloc] init];
838 for (UIView* subview in childClippingView.subviews) {
839 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
842 XCTAssertLessThan(newVisualEffectViews.count, 5u);
843 CGFloat expectInputRadius = 5;
844 if (newVisualEffectViews.count == 3) {
845 expectInputRadius = 2;
847 if ([
self validateOneVisualEffectView:subview
848 expectedFrame:CGRectMake(0, 0, 10, 10)
849 inputRadius:(CGFloat)expectInputRadius]) {
850 [newVisualEffectViews addObject:subview];
853 XCTAssertEqual(newVisualEffectViews.count, 5u);
854 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
855 UIView* newView = newVisualEffectViews[i];
856 id mockNewView = OCMPartialMock(newView);
857 UIView* originalView = originalVisualEffectViews[i];
859 XCTAssertEqual(originalView, newView);
860 OCMReject([mockNewView removeFromSuperview]);
861 [mockNewView stopMocking];
863 [newVisualEffectViews removeAllObjects];
867 for (
int i = 0; i < 5; i++) {
871 for (
int i = 0; i < 5; i++) {
874 std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
875 stack2.PushBackdropFilter(filter2,
876 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
880 stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
883 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
884 SkSize::Make(10, 10), stack2);
886 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
887 flutterPlatformViewsController->CompositeEmbeddedView(2);
888 [mockFlutterView setNeedsLayout];
889 [mockFlutterView layoutIfNeeded];
891 for (UIView* subview in childClippingView.subviews) {
892 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
895 XCTAssertLessThan(newVisualEffectViews.count, 5u);
896 CGFloat expectInputRadius = 5;
897 if (newVisualEffectViews.count == 0) {
898 expectInputRadius = 2;
900 if ([
self validateOneVisualEffectView:subview
901 expectedFrame:CGRectMake(0, 0, 10, 10)
902 inputRadius:(CGFloat)expectInputRadius]) {
903 [newVisualEffectViews addObject:subview];
906 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
907 UIView* newView = newVisualEffectViews[i];
908 id mockNewView = OCMPartialMock(newView);
909 UIView* originalView = originalVisualEffectViews[i];
911 XCTAssertEqual(originalView, newView);
912 OCMReject([mockNewView removeFromSuperview]);
913 [mockNewView stopMocking];
915 [newVisualEffectViews removeAllObjects];
919 for (
int i = 0; i < 5; i++) {
923 for (
int i = 0; i < 5; i++) {
926 std::make_shared<flutter::DlBlurImageFilter>(2, 5, flutter::DlTileMode::kClamp);
927 stack2.PushBackdropFilter(filter2,
928 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
932 stack2.PushBackdropFilter(filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
935 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
936 SkSize::Make(10, 10), stack2);
938 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
939 flutterPlatformViewsController->CompositeEmbeddedView(2);
940 [mockFlutterView setNeedsLayout];
941 [mockFlutterView layoutIfNeeded];
943 for (UIView* subview in childClippingView.subviews) {
944 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
947 XCTAssertLessThan(newVisualEffectViews.count, 5u);
948 CGFloat expectInputRadius = 5;
949 if (newVisualEffectViews.count == 4) {
950 expectInputRadius = 2;
952 if ([
self validateOneVisualEffectView:subview
953 expectedFrame:CGRectMake(0, 0, 10, 10)
954 inputRadius:(CGFloat)expectInputRadius]) {
955 [newVisualEffectViews addObject:subview];
958 XCTAssertEqual(newVisualEffectViews.count, 5u);
960 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
961 UIView* newView = newVisualEffectViews[i];
962 id mockNewView = OCMPartialMock(newView);
963 UIView* originalView = originalVisualEffectViews[i];
965 XCTAssertEqual(originalView, newView);
966 OCMReject([mockNewView removeFromSuperview]);
967 [mockNewView stopMocking];
969 [newVisualEffectViews removeAllObjects];
973 for (
int i = 0; i < 5; i++) {
977 for (
int i = 0; i < 5; i++) {
978 auto filter2 = std::make_shared<flutter::DlBlurImageFilter>(i, 2, flutter::DlTileMode::kClamp);
980 stack2.PushBackdropFilter(filter2, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
983 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
984 SkSize::Make(10, 10), stack2);
986 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
987 flutterPlatformViewsController->CompositeEmbeddedView(2);
988 [mockFlutterView setNeedsLayout];
989 [mockFlutterView layoutIfNeeded];
991 for (UIView* subview in childClippingView.subviews) {
992 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
995 XCTAssertLessThan(newVisualEffectViews.count, 5u);
996 if ([
self validateOneVisualEffectView:subview
997 expectedFrame:CGRectMake(0, 0, 10, 10)
998 inputRadius:(CGFloat)newVisualEffectViews.count]) {
999 [newVisualEffectViews addObject:subview];
1002 XCTAssertEqual(newVisualEffectViews.count, 5u);
1004 for (NSUInteger i = 0; i < newVisualEffectViews.count; i++) {
1005 UIView* newView = newVisualEffectViews[i];
1006 id mockNewView = OCMPartialMock(newView);
1007 UIView* originalView = originalVisualEffectViews[i];
1009 XCTAssertEqual(originalView, newView);
1010 OCMReject([mockNewView removeFromSuperview]);
1011 [mockNewView stopMocking];
1013 [newVisualEffectViews removeAllObjects];
1016 - (void)testApplyBackdropFilterNotDlBlurImageFilter {
1017 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1018 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1019 flutter::TaskRunners runners(
self.name.UTF8String,
1023 thread_task_runner);
1024 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1025 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1027 mock_delegate.settings_.enable_impeller
1030 flutterPlatformViewsController,
1033 std::make_shared<fml::SyncSwitch>());
1037 flutterPlatformViewsController->RegisterViewFactory(
1038 factory,
@"MockFlutterPlatformView",
1042 flutterPlatformViewsController->OnMethodCall(
1044 methodCallWithMethodName:
@"create"
1045 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1050 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1051 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1053 flutter::MutatorsStack stack;
1055 CGFloat screenScale = [UIScreen mainScreen].scale;
1056 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
1057 stack.PushTransform(screenScaleMatrix);
1059 auto dilateFilter = std::make_shared<flutter::DlDilateImageFilter>(5, 2);
1060 stack.PushBackdropFilter(dilateFilter, SkRect::MakeEmpty());
1062 auto embeddedViewParams =
1063 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1065 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1066 flutterPlatformViewsController->CompositeEmbeddedView(2);
1070 [mockFlutterView addSubview:childClippingView];
1072 [mockFlutterView setNeedsLayout];
1073 [mockFlutterView layoutIfNeeded];
1075 NSUInteger numberOfExpectedVisualEffectView = 0;
1076 for (UIView* subview in childClippingView.subviews) {
1077 if ([subview isKindOfClass:[UIVisualEffectView
class]]) {
1078 numberOfExpectedVisualEffectView++;
1081 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1085 flutter::MutatorsStack stack2;
1087 stack2.PushTransform(screenScaleMatrix);
1089 auto blurFilter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
1091 for (
int i = 0; i < 5; i++) {
1093 stack2.PushBackdropFilter(dilateFilter,
1094 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1098 stack2.PushBackdropFilter(blurFilter,
1099 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1102 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1103 SkSize::Make(10, 10), stack2);
1105 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1106 flutterPlatformViewsController->CompositeEmbeddedView(2);
1107 [mockFlutterView setNeedsLayout];
1108 [mockFlutterView layoutIfNeeded];
1110 numberOfExpectedVisualEffectView = 0;
1111 for (UIView* subview in childClippingView.subviews) {
1112 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1115 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1116 if ([
self validateOneVisualEffectView:subview
1117 expectedFrame:CGRectMake(0, 0, 10, 10)
1118 inputRadius:(CGFloat)5]) {
1119 numberOfExpectedVisualEffectView++;
1122 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1126 for (
int i = 0; i < 5; i++) {
1130 for (
int i = 0; i < 5; i++) {
1132 stack2.PushBackdropFilter(dilateFilter,
1133 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1137 stack2.PushBackdropFilter(blurFilter,
1138 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1141 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1142 SkSize::Make(10, 10), stack2);
1144 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1145 flutterPlatformViewsController->CompositeEmbeddedView(2);
1146 [mockFlutterView setNeedsLayout];
1147 [mockFlutterView layoutIfNeeded];
1149 numberOfExpectedVisualEffectView = 0;
1150 for (UIView* subview in childClippingView.subviews) {
1151 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1154 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1155 if ([
self validateOneVisualEffectView:subview
1156 expectedFrame:CGRectMake(0, 0, 10, 10)
1157 inputRadius:(CGFloat)5]) {
1158 numberOfExpectedVisualEffectView++;
1161 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1165 for (
int i = 0; i < 5; i++) {
1169 for (
int i = 0; i < 5; i++) {
1171 stack2.PushBackdropFilter(dilateFilter,
1172 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1176 stack2.PushBackdropFilter(blurFilter,
1177 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1180 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1181 SkSize::Make(10, 10), stack2);
1183 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1184 flutterPlatformViewsController->CompositeEmbeddedView(2);
1185 [mockFlutterView setNeedsLayout];
1186 [mockFlutterView layoutIfNeeded];
1188 numberOfExpectedVisualEffectView = 0;
1189 for (UIView* subview in childClippingView.subviews) {
1190 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1193 XCTAssertLessThan(numberOfExpectedVisualEffectView, 4u);
1194 if ([
self validateOneVisualEffectView:subview
1195 expectedFrame:CGRectMake(0, 0, 10, 10)
1196 inputRadius:(CGFloat)5]) {
1197 numberOfExpectedVisualEffectView++;
1200 XCTAssertEqual(numberOfExpectedVisualEffectView, 4u);
1204 for (
int i = 0; i < 5; i++) {
1208 for (
int i = 0; i < 5; i++) {
1209 stack2.PushBackdropFilter(dilateFilter,
1210 SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1213 embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix,
1214 SkSize::Make(10, 10), stack2);
1216 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1217 flutterPlatformViewsController->CompositeEmbeddedView(2);
1218 [mockFlutterView setNeedsLayout];
1219 [mockFlutterView layoutIfNeeded];
1221 numberOfExpectedVisualEffectView = 0;
1222 for (UIView* subview in childClippingView.subviews) {
1223 if ([subview isKindOfClass:[UIVisualEffectView
class]]) {
1224 numberOfExpectedVisualEffectView++;
1227 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1230 - (void)testApplyBackdropFilterCorrectAPI {
1235 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1236 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1240 visualEffectView:visualEffectView];
1241 XCTAssertNotNil(platformViewFilter);
1244 - (void)testApplyBackdropFilterAPIChangedInvalidUIVisualEffectView {
1246 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc] init];
1250 visualEffectView:visualEffectView];
1251 XCTAssertNil(platformViewFilter);
1254 - (void)testApplyBackdropFilterAPIChangedNoGaussianBlurFilter {
1256 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1257 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1258 NSArray* subviews = editedUIVisualEffectView.subviews;
1259 for (UIView* view in subviews) {
1260 if ([NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
1261 for (CIFilter* filter in view.layer.filters) {
1262 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1263 [filter setValue:@"notGaussianBlur" forKey:@"name"];
1273 visualEffectView:editedUIVisualEffectView];
1274 XCTAssertNil(platformViewFilter);
1277 - (void)testApplyBackdropFilterAPIChangedInvalidInputRadius {
1279 UIVisualEffectView* editedUIVisualEffectView = [[UIVisualEffectView alloc]
1280 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1281 NSArray* subviews = editedUIVisualEffectView.subviews;
1282 for (UIView* view in subviews) {
1283 if ([NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
1284 for (CIFilter* filter in view.layer.filters) {
1285 if ([[filter valueForKey:
@"name"] isEqual:
@"gaussianBlur"]) {
1286 [filter setValue:@"invalidInputRadius" forKey:@"inputRadius"];
1297 visualEffectView:editedUIVisualEffectView];
1298 XCTAssertNil(platformViewFilter);
1301 - (void)testBackdropFilterVisualEffectSubviewBackgroundColor {
1302 UIVisualEffectView* visualEffectView = [[UIVisualEffectView alloc]
1303 initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleLight]];
1307 visualEffectView:visualEffectView];
1308 CGColorRef visualEffectSubviewBackgroundColor = nil;
1309 for (UIView* view in [platformViewFilter backdropFilterView].subviews) {
1310 if ([NSStringFromClass([view
class]) hasSuffix:
@"VisualEffectSubview"]) {
1311 visualEffectSubviewBackgroundColor = view.layer.backgroundColor;
1315 CGColorEqualToColor(visualEffectSubviewBackgroundColor, UIColor.clearColor.CGColor));
1318 - (void)testCompositePlatformView {
1319 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1320 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1321 flutter::TaskRunners runners(
self.name.UTF8String,
1325 thread_task_runner);
1326 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1327 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1329 mock_delegate.settings_.enable_impeller
1332 flutterPlatformViewsController,
1335 std::make_shared<fml::SyncSwitch>());
1339 flutterPlatformViewsController->RegisterViewFactory(
1340 factory,
@"MockFlutterPlatformView",
1344 flutterPlatformViewsController->OnMethodCall(
1346 methodCallWithMethodName:
@"create"
1347 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1352 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1353 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1355 flutter::MutatorsStack stack;
1357 SkMatrix screenScaleMatrix =
1358 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1359 stack.PushTransform(screenScaleMatrix);
1361 SkMatrix translateMatrix = SkMatrix::Translate(100, 100);
1362 stack.PushTransform(translateMatrix);
1363 SkMatrix finalMatrix;
1364 finalMatrix.setConcat(screenScaleMatrix, translateMatrix);
1366 auto embeddedViewParams =
1367 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
1369 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1370 flutterPlatformViewsController->CompositeEmbeddedView(2);
1371 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1372 toView:mockFlutterView];
1373 XCTAssertTrue(CGRectEqualToRect(platformViewRectInFlutterView, CGRectMake(100, 100, 300, 300)));
1376 - (void)testBackdropFilterCorrectlyPushedAndReset {
1377 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1378 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1379 flutter::TaskRunners runners(
self.name.UTF8String,
1383 thread_task_runner);
1384 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1385 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1387 mock_delegate.settings_.enable_impeller
1390 flutterPlatformViewsController,
1393 std::make_shared<fml::SyncSwitch>());
1397 flutterPlatformViewsController->RegisterViewFactory(
1398 factory,
@"MockFlutterPlatformView",
1402 flutterPlatformViewsController->OnMethodCall(
1404 methodCallWithMethodName:
@"create"
1405 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1410 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1411 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1413 flutter::MutatorsStack stack;
1415 CGFloat screenScale = [UIScreen mainScreen].scale;
1416 SkMatrix screenScaleMatrix = SkMatrix::Scale(screenScale, screenScale);
1417 stack.PushTransform(screenScaleMatrix);
1419 auto embeddedViewParams =
1420 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1422 flutterPlatformViewsController->BeginFrame(SkISize::Make(0, 0));
1423 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1424 flutterPlatformViewsController->PushVisitedPlatformView(2);
1425 auto filter = std::make_shared<flutter::DlBlurImageFilter>(5, 2, flutter::DlTileMode::kClamp);
1426 flutterPlatformViewsController->PushFilterToVisitedPlatformViews(
1427 filter, SkRect::MakeXYWH(0, 0, screenScale * 10, screenScale * 10));
1428 flutterPlatformViewsController->CompositeEmbeddedView(2);
1431 [mockFlutterView addSubview:childClippingView];
1433 [mockFlutterView setNeedsLayout];
1434 [mockFlutterView layoutIfNeeded];
1437 NSUInteger numberOfExpectedVisualEffectView = 0;
1438 for (UIView* subview in childClippingView.subviews) {
1439 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1442 XCTAssertLessThan(numberOfExpectedVisualEffectView, 1u);
1443 if ([
self validateOneVisualEffectView:subview
1444 expectedFrame:CGRectMake(0, 0, 10, 10)
1446 numberOfExpectedVisualEffectView++;
1449 XCTAssertEqual(numberOfExpectedVisualEffectView, 1u);
1452 auto embeddedViewParams2 =
1453 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1454 flutterPlatformViewsController->BeginFrame(SkISize::Make(0, 0));
1455 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams2));
1456 flutterPlatformViewsController->CompositeEmbeddedView(2);
1459 [mockFlutterView setNeedsLayout];
1460 [mockFlutterView layoutIfNeeded];
1462 numberOfExpectedVisualEffectView = 0;
1463 for (UIView* subview in childClippingView.subviews) {
1464 if (![subview isKindOfClass:[UIVisualEffectView
class]]) {
1467 numberOfExpectedVisualEffectView++;
1469 XCTAssertEqual(numberOfExpectedVisualEffectView, 0u);
1472 - (void)testChildClippingViewShouldBeTheBoundingRectOfPlatformView {
1473 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1474 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1475 flutter::TaskRunners runners(
self.name.UTF8String,
1479 thread_task_runner);
1480 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1481 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1483 mock_delegate.settings_.enable_impeller
1486 flutterPlatformViewsController,
1489 std::make_shared<fml::SyncSwitch>());
1493 flutterPlatformViewsController->RegisterViewFactory(
1494 factory,
@"MockFlutterPlatformView",
1498 flutterPlatformViewsController->OnMethodCall(
1500 methodCallWithMethodName:
@"create"
1501 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1506 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
1507 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1509 flutter::MutatorsStack stack;
1511 SkMatrix screenScaleMatrix =
1512 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1513 stack.PushTransform(screenScaleMatrix);
1515 SkMatrix rotateMatrix;
1516 rotateMatrix.setRotate(10);
1517 stack.PushTransform(rotateMatrix);
1518 SkMatrix finalMatrix;
1519 finalMatrix.setConcat(screenScaleMatrix, rotateMatrix);
1521 auto embeddedViewParams =
1522 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
1524 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1525 flutterPlatformViewsController->CompositeEmbeddedView(2);
1526 CGRect platformViewRectInFlutterView = [gMockPlatformView convertRect:gMockPlatformView.bounds
1527 toView:mockFlutterView];
1533 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.x - childClippingView.frame.origin.x),
1535 XCTAssertLessThan(fabs(platformViewRectInFlutterView.origin.y - childClippingView.frame.origin.y),
1538 fabs(platformViewRectInFlutterView.size.width - childClippingView.frame.size.width),
1541 fabs(platformViewRectInFlutterView.size.height - childClippingView.frame.size.height),
1545 - (void)testClipsDoNotInterceptWithPlatformViewShouldNotAddMaskView {
1546 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1547 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1548 flutter::TaskRunners runners(
self.name.UTF8String,
1552 thread_task_runner);
1553 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1554 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1556 mock_delegate.settings_.enable_impeller
1559 flutterPlatformViewsController,
1562 std::make_shared<fml::SyncSwitch>());
1566 flutterPlatformViewsController->RegisterViewFactory(
1567 factory,
@"MockFlutterPlatformView",
1571 flutterPlatformViewsController->OnMethodCall(
1573 methodCallWithMethodName:
@"create"
1574 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1579 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1580 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1582 flutter::MutatorsStack stack;
1584 SkMatrix screenScaleMatrix =
1585 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1586 stack.PushTransform(screenScaleMatrix);
1587 SkMatrix translateMatrix = SkMatrix::Translate(5, 5);
1589 stack.PushTransform(translateMatrix);
1591 SkRect rect = SkRect::MakeXYWH(0, 0, 25, 25);
1592 stack.PushClipRect(rect);
1595 SkRect rect_for_rrect = SkRect::MakeXYWH(-1, -1, 25, 25);
1596 SkRRect rrect = SkRRect::MakeRectXY(rect_for_rrect, 1, 1);
1597 stack.PushClipRRect(rrect);
1599 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1600 SkMatrix::Concat(screenScaleMatrix, translateMatrix), SkSize::Make(5, 5), stack);
1602 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1603 flutterPlatformViewsController->CompositeEmbeddedView(2);
1607 [mockFlutterView addSubview:childClippingView];
1609 [mockFlutterView setNeedsLayout];
1610 [mockFlutterView layoutIfNeeded];
1611 XCTAssertNil(childClippingView.maskView);
1614 - (void)testClipRRectOnlyHasCornersInterceptWithPlatformViewShouldAddMaskView {
1615 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1616 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1617 flutter::TaskRunners runners(
self.name.UTF8String,
1621 thread_task_runner);
1622 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1623 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1625 mock_delegate.settings_.enable_impeller
1628 flutterPlatformViewsController,
1631 std::make_shared<fml::SyncSwitch>());
1635 flutterPlatformViewsController->RegisterViewFactory(
1636 factory,
@"MockFlutterPlatformView",
1640 flutterPlatformViewsController->OnMethodCall(
1642 methodCallWithMethodName:
@"create"
1643 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1648 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
1649 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1651 flutter::MutatorsStack stack;
1653 SkMatrix screenScaleMatrix =
1654 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1655 stack.PushTransform(screenScaleMatrix);
1656 SkMatrix translateMatrix = SkMatrix::Translate(5, 5);
1658 stack.PushTransform(translateMatrix);
1662 SkRect rect_for_rrect = SkRect::MakeXYWH(0, 0, 10, 10);
1663 SkRRect rrect = SkRRect::MakeRectXY(rect_for_rrect, 1, 1);
1664 stack.PushClipRRect(rrect);
1666 auto embeddedViewParams = std::make_unique<flutter::EmbeddedViewParams>(
1667 SkMatrix::Concat(screenScaleMatrix, translateMatrix), SkSize::Make(5, 5), stack);
1669 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1670 flutterPlatformViewsController->CompositeEmbeddedView(2);
1674 [mockFlutterView addSubview:childClippingView];
1676 [mockFlutterView setNeedsLayout];
1677 [mockFlutterView layoutIfNeeded];
1679 XCTAssertNotNil(childClippingView.maskView);
1682 - (void)testClipRect {
1683 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1684 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1685 flutter::TaskRunners runners(
self.name.UTF8String,
1689 thread_task_runner);
1690 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1691 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1693 mock_delegate.settings_.enable_impeller
1696 flutterPlatformViewsController,
1699 std::make_shared<fml::SyncSwitch>());
1703 flutterPlatformViewsController->RegisterViewFactory(
1704 factory,
@"MockFlutterPlatformView",
1708 flutterPlatformViewsController->OnMethodCall(
1710 methodCallWithMethodName:
@"create"
1711 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1716 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1717 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1719 flutter::MutatorsStack stack;
1721 SkMatrix screenScaleMatrix =
1722 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1723 stack.PushTransform(screenScaleMatrix);
1725 SkRect rect = SkRect::MakeXYWH(2, 2, 3, 3);
1726 stack.PushClipRect(rect);
1728 auto embeddedViewParams =
1729 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1731 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1732 flutterPlatformViewsController->CompositeEmbeddedView(2);
1736 [mockFlutterView addSubview:childClippingView];
1738 [mockFlutterView setNeedsLayout];
1739 [mockFlutterView layoutIfNeeded];
1741 for (
int i = 0; i < 10; i++) {
1742 for (
int j = 0; j < 10; j++) {
1743 CGPoint point = CGPointMake(i, j);
1744 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:mockFlutterView];
1747 CGRect insideClipping = CGRectMake(3, 3, 1, 1);
1748 if (CGRectContainsPoint(insideClipping, point)) {
1749 XCTAssertEqual(alpha, 255);
1751 XCTAssertLessThan(alpha, 255);
1757 - (void)testClipRRect {
1758 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1759 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1760 flutter::TaskRunners runners(
self.name.UTF8String,
1764 thread_task_runner);
1765 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1766 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1768 mock_delegate.settings_.enable_impeller
1771 flutterPlatformViewsController,
1774 std::make_shared<fml::SyncSwitch>());
1778 flutterPlatformViewsController->RegisterViewFactory(
1779 factory,
@"MockFlutterPlatformView",
1783 flutterPlatformViewsController->OnMethodCall(
1785 methodCallWithMethodName:
@"create"
1786 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1791 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1792 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1794 flutter::MutatorsStack stack;
1796 SkMatrix screenScaleMatrix =
1797 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1798 stack.PushTransform(screenScaleMatrix);
1800 SkRRect rrect = SkRRect::MakeRectXY(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1);
1801 stack.PushClipRRect(rrect);
1803 auto embeddedViewParams =
1804 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1806 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1807 flutterPlatformViewsController->CompositeEmbeddedView(2);
1811 [mockFlutterView addSubview:childClippingView];
1813 [mockFlutterView setNeedsLayout];
1814 [mockFlutterView layoutIfNeeded];
1816 for (
int i = 0; i < 10; i++) {
1817 for (
int j = 0; j < 10; j++) {
1818 CGPoint point = CGPointMake(i, j);
1819 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:mockFlutterView];
1822 CGRect insideClipping = CGRectMake(3, 3, 4, 4);
1823 if (CGRectContainsPoint(insideClipping, point)) {
1824 XCTAssertEqual(alpha, 255);
1826 XCTAssertLessThan(alpha, 255);
1832 - (void)testClipPath {
1833 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1834 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1835 flutter::TaskRunners runners(
self.name.UTF8String,
1839 thread_task_runner);
1840 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1841 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1843 mock_delegate.settings_.enable_impeller
1846 flutterPlatformViewsController,
1849 std::make_shared<fml::SyncSwitch>());
1853 flutterPlatformViewsController->RegisterViewFactory(
1854 factory,
@"MockFlutterPlatformView",
1858 flutterPlatformViewsController->OnMethodCall(
1860 methodCallWithMethodName:
@"create"
1861 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1866 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
1867 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
1869 flutter::MutatorsStack stack;
1871 SkMatrix screenScaleMatrix =
1872 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
1873 stack.PushTransform(screenScaleMatrix);
1876 path.addRoundRect(SkRect::MakeXYWH(2, 2, 6, 6), 1, 1);
1877 stack.PushClipPath(path);
1879 auto embeddedViewParams =
1880 std::make_unique<flutter::EmbeddedViewParams>(screenScaleMatrix, SkSize::Make(10, 10), stack);
1882 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
1883 flutterPlatformViewsController->CompositeEmbeddedView(2);
1887 [mockFlutterView addSubview:childClippingView];
1889 [mockFlutterView setNeedsLayout];
1890 [mockFlutterView layoutIfNeeded];
1892 for (
int i = 0; i < 10; i++) {
1893 for (
int j = 0; j < 10; j++) {
1894 CGPoint point = CGPointMake(i, j);
1895 int alpha = [
self alphaOfPoint:CGPointMake(i, j) onView:mockFlutterView];
1898 CGRect insideClipping = CGRectMake(3, 3, 4, 4);
1899 if (CGRectContainsPoint(insideClipping, point)) {
1900 XCTAssertEqual(alpha, 255);
1902 XCTAssertLessThan(alpha, 255);
1908 - (void)testSetFlutterViewControllerAfterCreateCanStillDispatchTouchEvents {
1909 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1910 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1911 flutter::TaskRunners runners(
self.name.UTF8String,
1915 thread_task_runner);
1916 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1917 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1919 mock_delegate.settings_.enable_impeller
1922 flutterPlatformViewsController,
1925 std::make_shared<fml::SyncSwitch>());
1929 flutterPlatformViewsController->RegisterViewFactory(
1930 factory,
@"MockFlutterPlatformView",
1934 flutterPlatformViewsController->OnMethodCall(
1936 methodCallWithMethodName:
@"create"
1937 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
1944 while (touchInteceptorView != nil &&
1946 touchInteceptorView = touchInteceptorView.superview;
1948 XCTAssertNotNil(touchInteceptorView);
1951 UIGestureRecognizer* forwardGectureRecognizer = nil;
1952 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
1953 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
1954 forwardGectureRecognizer = gestureRecognizer;
1960 NSSet* touches1 = [[NSSet alloc] init];
1961 id event1 = OCMClassMock([UIEvent
class]);
1963 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
1964 OCMReject([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
1967 NSSet* touches2 = [[NSSet alloc] init];
1968 id event2 = OCMClassMock([UIEvent
class]);
1969 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
1970 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
1971 OCMVerify([mockFlutterViewContoller touchesBegan:touches2 withEvent:event2]);
1974 - (void)testSetFlutterViewControllerInTheMiddleOfTouchEventShouldStillAllowGesturesToBeHandled {
1975 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
1976 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
1977 flutter::TaskRunners runners(
self.name.UTF8String,
1981 thread_task_runner);
1982 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
1983 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
1985 mock_delegate.settings_.enable_impeller
1988 flutterPlatformViewsController,
1991 std::make_shared<fml::SyncSwitch>());
1995 flutterPlatformViewsController->RegisterViewFactory(
1996 factory,
@"MockFlutterPlatformView",
2000 flutterPlatformViewsController->OnMethodCall(
2002 methodCallWithMethodName:
@"create"
2003 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2010 while (touchInteceptorView != nil &&
2012 touchInteceptorView = touchInteceptorView.superview;
2014 XCTAssertNotNil(touchInteceptorView);
2017 UIGestureRecognizer* forwardGectureRecognizer = nil;
2018 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2019 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2020 forwardGectureRecognizer = gestureRecognizer;
2027 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2029 NSSet* touches1 = [[NSSet alloc] init];
2030 id event1 = OCMClassMock([UIEvent
class]);
2031 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2032 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2034 flutterPlatformViewsController->SetFlutterViewController(nil);
2037 NSSet* touches2 = [[NSSet alloc] init];
2038 id event2 = OCMClassMock([UIEvent
class]);
2039 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2040 OCMVerify([mockFlutterViewContoller touchesMoved:touches2 withEvent:event2]);
2042 NSSet* touches3 = [[NSSet alloc] init];
2043 id event3 = OCMClassMock([UIEvent
class]);
2044 [forwardGectureRecognizer touchesEnded:touches3 withEvent:event3];
2045 OCMVerify([mockFlutterViewContoller touchesEnded:touches3 withEvent:event3]);
2048 NSSet* touches4 = [[NSSet alloc] init];
2049 id event4 = OCMClassMock([UIEvent
class]);
2050 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2051 OCMReject([mockFlutterViewContoller touchesBegan:touches4 withEvent:event4]);
2053 NSSet* touches5 = [[NSSet alloc] init];
2054 id event5 = OCMClassMock([UIEvent
class]);
2055 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2056 OCMReject([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2061 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2063 NSSet* touches1 = [[NSSet alloc] init];
2064 id event1 = OCMClassMock([UIEvent
class]);
2065 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2066 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2068 flutterPlatformViewsController->SetFlutterViewController(nil);
2071 NSSet* touches2 = [[NSSet alloc] init];
2072 id event2 = OCMClassMock([UIEvent
class]);
2073 [forwardGectureRecognizer touchesMoved:touches2 withEvent:event2];
2074 OCMVerify([mockFlutterViewContoller touchesMoved:touches2 withEvent:event2]);
2076 NSSet* touches3 = [[NSSet alloc] init];
2077 id event3 = OCMClassMock([UIEvent
class]);
2078 [forwardGectureRecognizer touchesCancelled:touches3 withEvent:event3];
2079 OCMVerify([mockFlutterViewContoller forceTouchesCancelled:touches3]);
2082 NSSet* touches4 = [[NSSet alloc] init];
2083 id event4 = OCMClassMock([UIEvent
class]);
2084 [forwardGectureRecognizer touchesBegan:touches4 withEvent:event4];
2085 OCMReject([mockFlutterViewContoller touchesBegan:touches4 withEvent:event4]);
2087 NSSet* touches5 = [[NSSet alloc] init];
2088 id event5 = OCMClassMock([UIEvent
class]);
2089 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2090 OCMReject([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2093 flutterPlatformViewsController->Reset();
2097 testSetFlutterViewControllerInTheMiddleOfTouchEventAllowsTheNewControllerToHandleSecondTouchSequence {
2098 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2099 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2100 flutter::TaskRunners runners(
self.name.UTF8String,
2104 thread_task_runner);
2105 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2106 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2108 mock_delegate.settings_.enable_impeller
2111 flutterPlatformViewsController,
2114 std::make_shared<fml::SyncSwitch>());
2118 flutterPlatformViewsController->RegisterViewFactory(
2119 factory,
@"MockFlutterPlatformView",
2123 flutterPlatformViewsController->OnMethodCall(
2125 methodCallWithMethodName:
@"create"
2126 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2133 while (touchInteceptorView != nil &&
2135 touchInteceptorView = touchInteceptorView.superview;
2137 XCTAssertNotNil(touchInteceptorView);
2140 UIGestureRecognizer* forwardGectureRecognizer = nil;
2141 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2142 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2143 forwardGectureRecognizer = gestureRecognizer;
2149 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2152 NSSet* touches1 = [NSSet setWithObject:@1];
2153 id event1 = OCMClassMock([UIEvent
class]);
2154 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2155 OCMVerify([mockFlutterViewContoller touchesBegan:touches1 withEvent:event1]);
2157 UIViewController* mockFlutterViewContoller2 = OCMClassMock([UIViewController
class]);
2158 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller2);
2162 NSSet* touches2 = [NSSet setWithObject:@1];
2163 id event2 = OCMClassMock([UIEvent
class]);
2164 [forwardGectureRecognizer touchesBegan:touches2 withEvent:event2];
2165 OCMVerify([mockFlutterViewContoller touchesBegan:touches2 withEvent:event2]);
2166 OCMReject([mockFlutterViewContoller2 touchesBegan:touches2 withEvent:event2]);
2168 NSSet* touches3 = [NSSet setWithObject:@1];
2169 id event3 = OCMClassMock([UIEvent
class]);
2170 [forwardGectureRecognizer touchesMoved:touches3 withEvent:event3];
2171 OCMVerify([mockFlutterViewContoller touchesMoved:touches3 withEvent:event3]);
2172 OCMReject([mockFlutterViewContoller2 touchesMoved:touches3 withEvent:event3]);
2174 NSSet* touches4 = [NSSet setWithObject:@1];
2175 id event4 = OCMClassMock([UIEvent
class]);
2176 [forwardGectureRecognizer touchesEnded:touches4 withEvent:event4];
2177 OCMVerify([mockFlutterViewContoller touchesEnded:touches4 withEvent:event4]);
2178 OCMReject([mockFlutterViewContoller2 touchesEnded:touches4 withEvent:event4]);
2180 NSSet* touches5 = [NSSet setWithObject:@1];
2181 id event5 = OCMClassMock([UIEvent
class]);
2182 [forwardGectureRecognizer touchesEnded:touches5 withEvent:event5];
2183 OCMVerify([mockFlutterViewContoller touchesEnded:touches5 withEvent:event5]);
2184 OCMReject([mockFlutterViewContoller2 touchesEnded:touches5 withEvent:event5]);
2188 NSSet* touches6 = [NSSet setWithObject:@1];
2189 id event6 = OCMClassMock([UIEvent
class]);
2190 [forwardGectureRecognizer touchesBegan:touches6 withEvent:event6];
2191 OCMVerify([mockFlutterViewContoller2 touchesBegan:touches6 withEvent:event6]);
2192 OCMReject([mockFlutterViewContoller touchesBegan:touches6 withEvent:event6]);
2195 NSSet* touches7 = [NSSet setWithObject:@1];
2196 id event7 = OCMClassMock([UIEvent
class]);
2197 [forwardGectureRecognizer touchesMoved:touches7 withEvent:event7];
2198 OCMVerify([mockFlutterViewContoller2 touchesMoved:touches7 withEvent:event7]);
2199 OCMReject([mockFlutterViewContoller touchesMoved:touches7 withEvent:event7]);
2201 NSSet* touches8 = [NSSet setWithObject:@1];
2202 id event8 = OCMClassMock([UIEvent
class]);
2203 [forwardGectureRecognizer touchesEnded:touches8 withEvent:event8];
2204 OCMVerify([mockFlutterViewContoller2 touchesEnded:touches8 withEvent:event8]);
2205 OCMReject([mockFlutterViewContoller touchesEnded:touches8 withEvent:event8]);
2207 flutterPlatformViewsController->Reset();
2210 - (void)testFlutterPlatformViewTouchesCancelledEventAreForcedToBeCancelled {
2211 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2212 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2213 flutter::TaskRunners runners(
self.name.UTF8String,
2217 thread_task_runner);
2218 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2219 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2221 mock_delegate.settings_.enable_impeller
2224 flutterPlatformViewsController,
2227 std::make_shared<fml::SyncSwitch>());
2231 flutterPlatformViewsController->RegisterViewFactory(
2232 factory,
@"MockFlutterPlatformView",
2236 flutterPlatformViewsController->OnMethodCall(
2238 methodCallWithMethodName:
@"create"
2239 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2246 while (touchInteceptorView != nil &&
2248 touchInteceptorView = touchInteceptorView.superview;
2250 XCTAssertNotNil(touchInteceptorView);
2253 UIGestureRecognizer* forwardGectureRecognizer = nil;
2254 for (UIGestureRecognizer* gestureRecognizer in touchInteceptorView.gestureRecognizers) {
2255 if ([gestureRecognizer isKindOfClass:NSClassFromString(
@"ForwardingGestureRecognizer")]) {
2256 forwardGectureRecognizer = gestureRecognizer;
2262 flutterPlatformViewsController->SetFlutterViewController(mockFlutterViewContoller);
2264 NSSet* touches1 = [NSSet setWithObject:@1];
2265 id event1 = OCMClassMock([UIEvent
class]);
2266 [forwardGectureRecognizer touchesBegan:touches1 withEvent:event1];
2268 [forwardGectureRecognizer touchesCancelled:touches1 withEvent:event1];
2269 OCMVerify([mockFlutterViewContoller forceTouchesCancelled:touches1]);
2271 flutterPlatformViewsController->Reset();
2274 - (void)testFlutterPlatformViewControllerSubmitFrameWithoutFlutterViewNotCrashing {
2275 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2276 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2277 flutter::TaskRunners runners(
self.name.UTF8String,
2281 thread_task_runner);
2282 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2283 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2285 mock_delegate.settings_.enable_impeller
2288 flutterPlatformViewsController,
2291 std::make_shared<fml::SyncSwitch>());
2295 flutterPlatformViewsController->RegisterViewFactory(
2296 factory,
@"MockFlutterPlatformView",
2300 flutterPlatformViewsController->OnMethodCall(
2302 methodCallWithMethodName:
@"create"
2303 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2309 flutter::MutatorsStack stack;
2310 SkMatrix finalMatrix;
2312 auto embeddedViewParams_1 =
2313 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2315 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams_1));
2316 flutterPlatformViewsController->CompositeEmbeddedView(2);
2317 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
2318 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2319 nullptr, framebuffer_info,
2320 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return false; },
2321 SkISize::Make(800, 600));
2323 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
2325 auto embeddedViewParams_2 =
2326 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2327 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams_2));
2328 flutterPlatformViewsController->CompositeEmbeddedView(2);
2329 auto mock_surface_submit_true = std::make_unique<flutter::SurfaceFrame>(
2330 nullptr, framebuffer_info,
2331 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
2332 SkISize::Make(800, 600));
2333 XCTAssertTrue(flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr,
2334 std::move(mock_surface_submit_true)));
2338 testFlutterPlatformViewControllerResetDeallocsPlatformViewWhenRootViewsNotBindedToFlutterView {
2339 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2340 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2341 flutter::TaskRunners runners(
self.name.UTF8String,
2345 thread_task_runner);
2346 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2347 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2349 mock_delegate.settings_.enable_impeller
2352 flutterPlatformViewsController,
2355 std::make_shared<fml::SyncSwitch>());
2357 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2358 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2362 flutterPlatformViewsController->RegisterViewFactory(
2363 factory,
@"MockFlutterPlatformView",
2369 flutterPlatformViewsController->OnMethodCall(
2371 methodCallWithMethodName:
@"create"
2372 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2375 flutter::MutatorsStack stack;
2376 SkMatrix finalMatrix;
2377 auto embeddedViewParams =
2378 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2379 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
2380 flutterPlatformViewsController->CompositeEmbeddedView(2);
2385 flutterPlatformViewsController->Reset();
2390 - (void)testFlutterPlatformViewControllerBeginFrameShouldResetCompisitionOrder {
2391 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2392 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2393 flutter::TaskRunners runners(
self.name.UTF8String,
2397 thread_task_runner);
2398 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2399 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2401 mock_delegate.settings_.enable_impeller
2404 flutterPlatformViewsController,
2407 std::make_shared<fml::SyncSwitch>());
2409 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2410 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2414 flutterPlatformViewsController->RegisterViewFactory(
2415 factory,
@"MockFlutterPlatformView",
2420 flutterPlatformViewsController->OnMethodCall(
2422 methodCallWithMethodName:
@"create"
2423 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2427 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2428 flutter::MutatorsStack stack;
2429 SkMatrix finalMatrix;
2430 auto embeddedViewParams1 =
2431 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2432 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2433 flutterPlatformViewsController->CompositeEmbeddedView(0);
2434 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL);
2437 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2438 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 0UL);
2440 auto embeddedViewParams2 =
2441 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2442 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams2));
2443 flutterPlatformViewsController->CompositeEmbeddedView(0);
2444 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL);
2448 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithDifferentViewHierarchy {
2449 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2450 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2451 flutter::TaskRunners runners(
self.name.UTF8String,
2455 thread_task_runner);
2456 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2457 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2459 mock_delegate.settings_.enable_impeller
2462 flutterPlatformViewsController,
2465 std::make_shared<fml::SyncSwitch>());
2467 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2468 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2472 flutterPlatformViewsController->RegisterViewFactory(
2473 factory,
@"MockFlutterPlatformView",
2477 flutterPlatformViewsController->OnMethodCall(
2479 methodCallWithMethodName:
@"create"
2480 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2485 flutterPlatformViewsController->OnMethodCall(
2487 methodCallWithMethodName:
@"create"
2488 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2492 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2493 flutter::MutatorsStack stack;
2494 SkMatrix finalMatrix;
2495 auto embeddedViewParams1 =
2496 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2497 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2498 flutterPlatformViewsController->CompositeEmbeddedView(0);
2499 auto embeddedViewParams2 =
2500 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(500, 500), stack);
2501 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2502 flutterPlatformViewsController->CompositeEmbeddedView(1);
2505 const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
2506 sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
2507 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
2508 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2509 std::move(mock_sk_surface), framebuffer_info,
2510 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
2511 SkISize::Make(800, 600));
2514 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
2516 UIView* clippingView1 = view1.superview.superview;
2517 UIView* clippingView2 = view2.superview.superview;
2518 UIView* flutterView = clippingView1.superview;
2519 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2520 [flutterView.subviews indexOfObject:clippingView2],
2521 @"The first clipping view should be added before the second clipping view.");
2524 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2526 embeddedViewParams2 =
2527 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(500, 500), stack);
2528 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2529 flutterPlatformViewsController->CompositeEmbeddedView(1);
2530 embeddedViewParams1 =
2531 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2532 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2533 flutterPlatformViewsController->CompositeEmbeddedView(0);
2535 mock_sk_surface = SkSurfaces::Raster(image_info);
2536 mock_surface = std::make_unique<flutter::SurfaceFrame>(
2537 std::move(mock_sk_surface), framebuffer_info,
2538 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
2539 SkISize::Make(800, 600));
2541 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
2542 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] >
2543 [flutterView.subviews indexOfObject:clippingView2],
2544 @"The first clipping view should be added after the second clipping view.");
2548 testFlutterPlatformViewControllerSubmitFrameShouldOrderSubviewsCorrectlyWithSameViewHierarchy {
2549 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2550 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2551 flutter::TaskRunners runners(
self.name.UTF8String,
2555 thread_task_runner);
2556 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2557 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2559 mock_delegate.settings_.enable_impeller
2562 flutterPlatformViewsController,
2565 std::make_shared<fml::SyncSwitch>());
2567 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2568 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2572 flutterPlatformViewsController->RegisterViewFactory(
2573 factory,
@"MockFlutterPlatformView",
2577 flutterPlatformViewsController->OnMethodCall(
2579 methodCallWithMethodName:
@"create"
2580 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
2585 flutterPlatformViewsController->OnMethodCall(
2587 methodCallWithMethodName:
@"create"
2588 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2592 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2593 flutter::MutatorsStack stack;
2594 SkMatrix finalMatrix;
2595 auto embeddedViewParams1 =
2596 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2597 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2598 flutterPlatformViewsController->CompositeEmbeddedView(0);
2599 auto embeddedViewParams2 =
2600 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(500, 500), stack);
2601 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2602 flutterPlatformViewsController->CompositeEmbeddedView(1);
2605 const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
2606 sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
2607 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
2608 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
2609 std::move(mock_sk_surface), framebuffer_info,
2610 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
2611 SkISize::Make(800, 600));
2614 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
2616 UIView* clippingView1 = view1.superview.superview;
2617 UIView* clippingView2 = view2.superview.superview;
2618 UIView* flutterView = clippingView1.superview;
2619 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2620 [flutterView.subviews indexOfObject:clippingView2],
2621 @"The first clipping view should be added before the second clipping view.");
2624 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2626 embeddedViewParams1 =
2627 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2628 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams1));
2629 flutterPlatformViewsController->CompositeEmbeddedView(0);
2630 embeddedViewParams2 =
2631 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(500, 500), stack);
2632 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams2));
2633 flutterPlatformViewsController->CompositeEmbeddedView(1);
2635 mock_sk_surface = SkSurfaces::Raster(image_info);
2636 mock_surface = std::make_unique<flutter::SurfaceFrame>(
2637 std::move(mock_sk_surface), framebuffer_info,
2638 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
2639 SkISize::Make(800, 600));
2641 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
2642 XCTAssertTrue([flutterView.subviews indexOfObject:clippingView1] <
2643 [flutterView.subviews indexOfObject:clippingView2],
2644 @"The first clipping view should be added before the second clipping view.");
2647 - (void)testThreadMergeAtEndFrame {
2648 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2649 auto thread_task_runner_platform =
CreateNewThread(
"FlutterPlatformViewsTest1");
2650 auto thread_task_runner_other =
CreateNewThread(
"FlutterPlatformViewsTest2");
2651 flutter::TaskRunners runners(
self.name.UTF8String,
2652 thread_task_runner_platform,
2653 thread_task_runner_other,
2654 thread_task_runner_other,
2655 thread_task_runner_other);
2656 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2657 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2659 mock_delegate.settings_.enable_impeller
2662 flutterPlatformViewsController,
2665 std::make_shared<fml::SyncSwitch>());
2667 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
2668 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2672 flutterPlatformViewsController->RegisterViewFactory(
2673 factory,
@"MockFlutterPlatformView",
2675 XCTestExpectation* waitForPlatformView =
2676 [
self expectationWithDescription:@"wait for platform view to be created"];
2678 [waitForPlatformView fulfill];
2681 flutterPlatformViewsController->OnMethodCall(
2683 methodCallWithMethodName:
@"create"
2684 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2686 [
self waitForExpectations:@[ waitForPlatformView ] timeout:30];
2689 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
2690 SkMatrix finalMatrix;
2691 flutter::MutatorsStack stack;
2692 auto embeddedViewParams =
2693 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
2694 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
2696 fml::RefPtr<fml::RasterThreadMerger> raster_thread_merger =
2697 fml::MakeRefCounted<fml::RasterThreadMerger>(thread_task_runner_platform->GetTaskQueueId(),
2698 thread_task_runner_other->GetTaskQueueId());
2699 XCTAssertEqual(flutterPlatformViewsController->PostPrerollAction(raster_thread_merger),
2700 flutter::PostPrerollResult::kSkipAndRetryFrame);
2701 XCTAssertFalse(raster_thread_merger->IsMerged());
2703 flutterPlatformViewsController->EndFrame(
true, raster_thread_merger);
2704 XCTAssertTrue(raster_thread_merger->IsMerged());
2708 while (raster_thread_merger->DecrementLease() != fml::RasterThreadStatus::kUnmergedNow) {
2712 - (int)alphaOfPoint:(CGPoint)point onView:(UIView*)view {
2713 unsigned char pixel[4] = {0};
2715 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
2718 CGContextRef context = CGBitmapContextCreate(
2719 pixel, 1, 1, 8, 4, colorSpace, kCGBitmapAlphaInfoMask & kCGImageAlphaPremultipliedLast);
2720 CGContextTranslateCTM(context, -point.x, -point.y);
2721 [view.layer renderInContext:context];
2723 CGContextRelease(context);
2724 CGColorSpaceRelease(colorSpace);
2729 - (void)testHasFirstResponderInViewHierarchySubtree_viewItselfBecomesFirstResponder {
2731 UIWindow* window = [[UIWindow alloc] init];
2732 UITextField* textField = [[UITextField alloc] init];
2733 [window addSubview:textField];
2735 [textField becomeFirstResponder];
2736 XCTAssertTrue(textField.isFirstResponder);
2737 XCTAssertTrue(textField.flt_hasFirstResponderInViewHierarchySubtree);
2738 [textField resignFirstResponder];
2739 XCTAssertFalse(textField.isFirstResponder);
2740 XCTAssertFalse(textField.flt_hasFirstResponderInViewHierarchySubtree);
2743 - (void)testHasFirstResponderInViewHierarchySubtree_descendantViewBecomesFirstResponder {
2745 UIWindow* window = [[UIWindow alloc] init];
2746 UIView* view = [[UIView alloc] init];
2747 UIView* childView = [[UIView alloc] init];
2748 UITextField* textField = [[UITextField alloc] init];
2749 [window addSubview:view];
2750 [view addSubview:childView];
2751 [childView addSubview:textField];
2753 [textField becomeFirstResponder];
2754 XCTAssertTrue(textField.isFirstResponder);
2755 XCTAssertTrue(view.flt_hasFirstResponderInViewHierarchySubtree);
2756 [textField resignFirstResponder];
2757 XCTAssertFalse(textField.isFirstResponder);
2758 XCTAssertFalse(view.flt_hasFirstResponderInViewHierarchySubtree);
2761 - (void)testFlutterClippingMaskViewPoolReuseViewsAfterRecycle {
2767 CGRect newRect = CGRectMake(0, 0, 10, 10);
2771 NSSet* set1 = [NSSet setWithObjects:view1, view2, nil];
2772 NSSet* set2 = [NSSet setWithObjects:view3, view4, nil];
2773 XCTAssertEqualObjects(set1, set2);
2774 XCTAssertTrue(CGRectEqualToRect(view3.frame, newRect));
2775 XCTAssertTrue(CGRectEqualToRect(view4.frame, newRect));
2778 - (void)testFlutterClippingMaskViewPoolAllocsNewMaskViewsAfterReachingCapacity {
2783 XCTAssertNotEqual(view1, view3);
2784 XCTAssertNotEqual(view2, view3);
2787 - (void)testMaskViewsReleasedWhenPoolIsReleased {
2788 __weak UIView* weakView;
2793 XCTAssertNotNil(weakView);
2795 XCTAssertNil(weakView);
2798 - (void)testClipMaskViewIsReused {
2799 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2800 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2801 flutter::TaskRunners runners(
self.name.UTF8String,
2805 thread_task_runner);
2806 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2807 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2809 mock_delegate.settings_.enable_impeller
2812 flutterPlatformViewsController,
2815 std::make_shared<fml::SyncSwitch>());
2819 flutterPlatformViewsController->RegisterViewFactory(
2820 factory,
@"MockFlutterPlatformView",
2824 flutterPlatformViewsController->OnMethodCall(
2826 methodCallWithMethodName:
@"create"
2827 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2831 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2832 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2834 flutter::MutatorsStack stack1;
2836 SkMatrix screenScaleMatrix =
2837 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
2838 stack1.PushTransform(screenScaleMatrix);
2840 SkRect rect = SkRect::MakeXYWH(2, 2, 3, 3);
2841 stack1.PushClipRect(rect);
2843 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
2844 screenScaleMatrix, SkSize::Make(10, 10), stack1);
2846 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1));
2847 flutterPlatformViewsController->CompositeEmbeddedView(1);
2849 UIView* maskView1 = childClippingView1.maskView;
2850 XCTAssertNotNil(maskView1);
2853 flutterPlatformViewsController->BeginFrame(SkISize::Make(100, 100));
2854 flutter::MutatorsStack stack2;
2855 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
2856 screenScaleMatrix, SkSize::Make(10, 10), stack2);
2857 auto embeddedViewParams3 = std::make_unique<flutter::EmbeddedViewParams>(
2858 screenScaleMatrix, SkSize::Make(10, 10), stack2);
2859 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams3));
2860 flutterPlatformViewsController->CompositeEmbeddedView(1);
2864 flutterPlatformViewsController->OnMethodCall(
2866 methodCallWithMethodName:
@"create"
2867 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2870 auto embeddedViewParams4 = std::make_unique<flutter::EmbeddedViewParams>(
2871 screenScaleMatrix, SkSize::Make(10, 10), stack1);
2872 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams4));
2873 flutterPlatformViewsController->CompositeEmbeddedView(2);
2876 UIView* maskView2 = childClippingView2.maskView;
2877 XCTAssertEqual(maskView1, maskView2);
2878 XCTAssertNotNil(childClippingView2.maskView);
2879 XCTAssertNil(childClippingView1.maskView);
2882 - (void)testDifferentClipMaskViewIsUsedForEachView {
2883 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2884 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2885 flutter::TaskRunners runners(
self.name.UTF8String,
2889 thread_task_runner);
2890 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2891 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2893 mock_delegate.settings_.enable_impeller
2896 flutterPlatformViewsController,
2899 std::make_shared<fml::SyncSwitch>());
2903 flutterPlatformViewsController->RegisterViewFactory(
2904 factory,
@"MockFlutterPlatformView",
2909 flutterPlatformViewsController->OnMethodCall(
2911 methodCallWithMethodName:
@"create"
2912 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
2917 flutterPlatformViewsController->OnMethodCall(
2919 methodCallWithMethodName:
@"create"
2920 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
2925 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
2926 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
2928 flutter::MutatorsStack stack1;
2930 SkMatrix screenScaleMatrix =
2931 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
2932 stack1.PushTransform(screenScaleMatrix);
2934 SkRect rect = SkRect::MakeXYWH(2, 2, 3, 3);
2935 stack1.PushClipRect(rect);
2937 auto embeddedViewParams1 = std::make_unique<flutter::EmbeddedViewParams>(
2938 screenScaleMatrix, SkSize::Make(10, 10), stack1);
2940 flutter::MutatorsStack stack2;
2941 stack2.PushClipRect(rect);
2942 auto embeddedViewParams2 = std::make_unique<flutter::EmbeddedViewParams>(
2943 screenScaleMatrix, SkSize::Make(10, 10), stack2);
2945 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1));
2946 flutterPlatformViewsController->CompositeEmbeddedView(1);
2947 UIView* childClippingView1 = view1.superview.superview;
2949 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams2));
2950 flutterPlatformViewsController->CompositeEmbeddedView(2);
2951 UIView* childClippingView2 = view2.superview.superview;
2952 UIView* maskView1 = childClippingView1.maskView;
2953 UIView* maskView2 = childClippingView2.maskView;
2954 XCTAssertNotEqual(maskView1, maskView2);
2962 - (BOOL)validateOneVisualEffectView:(UIView*)visualEffectView
2963 expectedFrame:(CGRect)frame
2964 inputRadius:(CGFloat)inputRadius {
2965 XCTAssertTrue(CGRectEqualToRect(visualEffectView.frame, frame));
2966 for (UIView* view in visualEffectView.subviews) {
2967 if (![NSStringFromClass([view
class]) hasSuffix:
@"BackdropView"]) {
2970 XCTAssertEqual(view.layer.filters.count, 1u);
2971 NSObject* filter = view.layer.filters.firstObject;
2973 XCTAssertEqualObjects([filter valueForKey:
@"name"],
@"gaussianBlur");
2975 NSObject* inputRadiusInFilter = [filter valueForKey:@"inputRadius"];
2976 XCTAssertTrue([inputRadiusInFilter isKindOfClass:[NSNumber
class]] &&
2984 - (void)testDisposingViewInCompositionOrderDoNotCrash {
2985 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
2986 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
2987 flutter::TaskRunners runners(
self.name.UTF8String,
2991 thread_task_runner);
2992 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
2993 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
2995 mock_delegate.settings_.enable_impeller
2998 flutterPlatformViewsController,
3001 std::make_shared<fml::SyncSwitch>());
3003 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3004 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
3008 flutterPlatformViewsController->RegisterViewFactory(
3009 factory,
@"MockFlutterPlatformView",
3014 flutterPlatformViewsController->OnMethodCall(
3016 methodCallWithMethodName:
@"create"
3017 arguments:@{
@"id" : @0,
@"viewType" :
@"MockFlutterPlatformView"}],
3019 flutterPlatformViewsController->OnMethodCall(
3021 methodCallWithMethodName:
@"create"
3022 arguments:@{
@"id" : @1,
@"viewType" :
@"MockFlutterPlatformView"}],
3028 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
3029 flutter::MutatorsStack stack;
3030 SkMatrix finalMatrix;
3031 auto embeddedViewParams0 =
3032 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
3033 flutterPlatformViewsController->PrerollCompositeEmbeddedView(0, std::move(embeddedViewParams0));
3034 flutterPlatformViewsController->CompositeEmbeddedView(0);
3036 auto embeddedViewParams1 =
3037 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
3038 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1));
3039 flutterPlatformViewsController->CompositeEmbeddedView(1);
3040 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 2UL);
3042 XCTestExpectation* expectation = [
self expectationWithDescription:@"dispose call ended."];
3044 [expectation fulfill];
3047 flutterPlatformViewsController->OnMethodCall(
3048 [
FlutterMethodCall methodCallWithMethodName:
@"dispose" arguments:@0], disposeResult);
3049 [
self waitForExpectationsWithTimeout:30 handler:nil];
3051 const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
3052 sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
3053 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3054 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3055 std::move(mock_sk_surface), framebuffer_info,
3056 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3057 SkISize::Make(800, 600));
3059 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
3062 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 2UL);
3063 XCTAssertNotNil(flutterPlatformViewsController->GetPlatformViewByID(0));
3064 XCTAssertNotNil(flutterPlatformViewsController->GetPlatformViewByID(1));
3070 flutterPlatformViewsController->BeginFrame(SkISize::Make(300, 300));
3071 flutter::MutatorsStack stack;
3072 SkMatrix finalMatrix;
3073 auto embeddedViewParams1 =
3074 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
3075 flutterPlatformViewsController->PrerollCompositeEmbeddedView(1, std::move(embeddedViewParams1));
3076 flutterPlatformViewsController->CompositeEmbeddedView(1);
3078 const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
3079 sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
3080 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3081 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3082 std::move(mock_sk_surface), framebuffer_info,
3083 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3084 SkISize::Make(800, 600));
3086 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface)));
3089 XCTAssertEqual(flutterPlatformViewsController->EmbeddedViewCount(), 1UL);
3090 XCTAssertNil(flutterPlatformViewsController->GetPlatformViewByID(0));
3091 XCTAssertNotNil(flutterPlatformViewsController->GetPlatformViewByID(1));
3094 - (void)testOnlyPlatformViewsAreRemovedWhenReset {
3095 flutter::FlutterPlatformViewsTestMockPlatformViewDelegate mock_delegate;
3096 auto thread_task_runner =
CreateNewThread(
"FlutterPlatformViewsTest");
3097 flutter::TaskRunners runners(
self.name.UTF8String,
3101 thread_task_runner);
3102 auto flutterPlatformViewsController = std::make_shared<flutter::FlutterPlatformViewsController>();
3103 auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
3105 mock_delegate.settings_.enable_impeller
3108 flutterPlatformViewsController,
3111 std::make_shared<fml::SyncSwitch>());
3115 flutterPlatformViewsController->RegisterViewFactory(
3116 factory,
@"MockFlutterPlatformView",
3120 flutterPlatformViewsController->OnMethodCall(
3122 methodCallWithMethodName:
@"create"
3123 arguments:@{
@"id" : @2,
@"viewType" :
@"MockFlutterPlatformView"}],
3125 UIView* mockFlutterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
3126 flutterPlatformViewsController->SetFlutterView(mockFlutterView);
3128 flutter::MutatorsStack stack;
3130 SkMatrix screenScaleMatrix =
3131 SkMatrix::Scale([UIScreen mainScreen].scale, [UIScreen mainScreen].scale);
3132 stack.PushTransform(screenScaleMatrix);
3134 SkMatrix translateMatrix = SkMatrix::Translate(100, 100);
3135 stack.PushTransform(translateMatrix);
3136 SkMatrix finalMatrix;
3137 finalMatrix.setConcat(screenScaleMatrix, translateMatrix);
3139 auto embeddedViewParams =
3140 std::make_unique<flutter::EmbeddedViewParams>(finalMatrix, SkSize::Make(300, 300), stack);
3142 flutterPlatformViewsController->PrerollCompositeEmbeddedView(2, std::move(embeddedViewParams));
3143 flutterPlatformViewsController->CompositeEmbeddedView(2);
3146 const SkImageInfo image_info = SkImageInfo::MakeN32Premul(1000, 1000);
3147 sk_sp<SkSurface> mock_sk_surface = SkSurfaces::Raster(image_info);
3148 flutter::SurfaceFrame::FramebufferInfo framebuffer_info;
3149 auto mock_surface = std::make_unique<flutter::SurfaceFrame>(
3150 std::move(mock_sk_surface), framebuffer_info,
3151 [](
const flutter::SurfaceFrame& surface_frame, flutter::DlCanvas* canvas) {
return true; },
3152 SkISize::Make(800, 600));
3154 flutterPlatformViewsController->SubmitFrame(
nullptr,
nullptr, std::move(mock_surface));
3156 UIView* someView = [[UIView alloc] init];
3157 [mockFlutterView addSubview:someView];
3159 flutterPlatformViewsController->Reset();
3160 XCTAssertEqual(mockFlutterView.subviews.count, 1u);
3161 XCTAssertEqual(mockFlutterView.subviews.firstObject, someView);
3164 - (void)testFlutterTouchInterceptingViewLinksToAccessibilityContainer {
3166 NSObject* container = [[NSObject alloc] init];
3168 XCTAssertEqualObjects([touchInteceptorView accessibilityContainer], container);