Flutter iOS Embedder
platform_view_ios_test.mm
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #import <OCMock/OCMock.h>
6 #import <XCTest/XCTest.h>
7 
8 #import "flutter/fml/thread.h"
11 
13 
14 namespace flutter {
15 
16 namespace {
17 
18 class MockDelegate : public PlatformView::Delegate {
19  public:
20  void OnPlatformViewCreated(std::unique_ptr<Surface> surface) override {}
21  void OnPlatformViewDestroyed() override {}
22  void OnPlatformViewScheduleFrame() override {}
23  void OnPlatformViewAddView(int64_t view_id,
24  const ViewportMetrics& viewport_metrics,
25  AddViewCallback callback) override {}
26  void OnPlatformViewRemoveView(int64_t view_id, RemoveViewCallback callback) override {}
27  void OnPlatformViewSetNextFrameCallback(const fml::closure& closure) override {}
28  void OnPlatformViewSetViewportMetrics(int64_t view_id, const ViewportMetrics& metrics) override {}
29  const flutter::Settings& OnPlatformViewGetSettings() const override { return settings_; }
30  void OnPlatformViewDispatchPlatformMessage(std::unique_ptr<PlatformMessage> message) override {}
31  void OnPlatformViewDispatchPointerDataPacket(std::unique_ptr<PointerDataPacket> packet) override {
32  }
33  HitTestResponse OnPlatformViewHitTest(int64_t view_id, const flutter::PointData offset) override {
34  return {.has_platform_view = false};
35  }
36  void OnPlatformViewSendViewFocusEvent(const ViewFocusEvent& event) override {}
37  void OnPlatformViewDispatchSemanticsAction(int64_t view_id,
38  int32_t node_id,
39  SemanticsAction action,
40  fml::MallocMapping args) override {}
41  void OnPlatformViewSetSemanticsEnabled(bool enabled) override {}
42  void OnPlatformViewSetAccessibilityFeatures(int32_t flags) override {}
43  void OnPlatformViewRegisterTexture(std::shared_ptr<Texture> texture) override {}
44  void OnPlatformViewUnregisterTexture(int64_t texture_id) override {}
45  void OnPlatformViewMarkTextureFrameAvailable(int64_t texture_id) override {}
46 
47  void LoadDartDeferredLibrary(intptr_t loading_unit_id,
48  std::unique_ptr<const fml::Mapping> snapshot_data,
49  std::unique_ptr<const fml::Mapping> snapshot_instructions) override {
50  }
51  void LoadDartDeferredLibraryError(intptr_t loading_unit_id,
52  const std::string error_message,
53  bool transient) override {}
54  void UpdateAssetResolverByType(std::unique_ptr<flutter::AssetResolver> updated_asset_resolver,
55  flutter::AssetResolver::AssetResolverType type) override {}
56 
57  flutter::Settings settings_;
58 };
59 
60 } // namespace
61 } // namespace flutter
62 
63 @interface PlatformViewIOSTest : XCTestCase
64 @end
65 
66 @implementation PlatformViewIOSTest
67 
68 - (void)testSetSemanticsTreeEnabled {
69  flutter::MockDelegate mock_delegate;
70  auto thread = std::make_unique<fml::Thread>("PlatformViewIOSTest");
71  auto thread_task_runner = thread->GetTaskRunner();
72  flutter::TaskRunners runners(/*label=*/self.name.UTF8String,
73  /*platform=*/thread_task_runner,
74  /*raster=*/thread_task_runner,
75  /*ui=*/thread_task_runner,
76  /*io=*/thread_task_runner);
77  id messenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger));
78  id engine = OCMClassMock([FlutterEngine class]);
79 
80  id flutterViewController = OCMClassMock([FlutterViewController class]);
81 
82  OCMStub([flutterViewController isViewLoaded]).andReturn(NO);
83  OCMStub([flutterViewController engine]).andReturn(engine);
84  OCMStub([engine binaryMessenger]).andReturn(messenger);
85 
86  auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
87  /*delegate=*/mock_delegate,
88  /*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
89  /*platform_views_controller=*/nil,
90  /*task_runners=*/runners,
91  /*worker_task_runner=*/nil,
92  /*is_gpu_disabled_sync_switch=*/std::make_shared<fml::SyncSwitch>());
93  fml::AutoResetWaitableEvent latch;
94  thread_task_runner->PostTask([&] {
95  platform_view->SetOwnerViewController(flutterViewController);
96  XCTAssertFalse(platform_view->GetAccessibilityBridge());
97  platform_view->SetSemanticsTreeEnabled(true);
98  XCTAssertTrue(platform_view->GetAccessibilityBridge());
99  platform_view->SetSemanticsTreeEnabled(false);
100  XCTAssertFalse(platform_view->GetAccessibilityBridge());
101  latch.Signal();
102  });
103  latch.Wait();
104 
105  [engine stopMocking];
106 }
107 
108 - (void)testLocaleCanBeSetWithoutViewController {
109  flutter::MockDelegate mock_delegate;
110  auto thread = std::make_unique<fml::Thread>("PlatformViewIOSTest");
111  auto thread_task_runner = thread->GetTaskRunner();
112  flutter::TaskRunners runners(/*label=*/self.name.UTF8String,
113  /*platform=*/thread_task_runner,
114  /*raster=*/thread_task_runner,
115  /*ui=*/thread_task_runner,
116  /*io=*/thread_task_runner);
117  id messenger = OCMProtocolMock(@protocol(FlutterBinaryMessenger));
118  id engine = OCMClassMock([FlutterEngine class]);
119 
120  id flutterViewController = OCMClassMock([FlutterViewController class]);
121 
122  OCMStub([flutterViewController isViewLoaded]).andReturn(NO);
123  OCMStub([flutterViewController engine]).andReturn(engine);
124  OCMStub([engine binaryMessenger]).andReturn(messenger);
125 
126  auto platform_view = std::make_unique<flutter::PlatformViewIOS>(
127  /*delegate=*/mock_delegate,
128  /*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
129  /*platform_views_controller=*/nil,
130  /*task_runners=*/runners,
131  /*worker_task_runner=*/nil,
132  /*is_gpu_disabled_sync_switch=*/std::make_shared<fml::SyncSwitch>());
133  fml::AutoResetWaitableEvent latch;
134  thread_task_runner->PostTask([&] {
135  std::string locale = "en-US";
136  platform_view->SetApplicationLocale(locale);
137  platform_view->SetOwnerViewController(flutterViewController);
138  OCMVerify([flutterViewController setApplicationLocale:@"en-US"]);
139  latch.Signal();
140  });
141  latch.Wait();
142 
143  [engine stopMocking];
144 }
145 
146 @end
std::unique_ptr< flutter::PlatformViewIOS > platform_view
flutter::Settings settings_
int64_t texture_id