Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
FlutterEnginePlatformViewTest.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#include <memory>
6#define FML_USED_ON_EMBEDDER
7
8#import <OCMock/OCMock.h>
9#import <XCTest/XCTest.h>
10
11#include "flutter/fml/message_loop.h"
12#import "flutter/shell/platform/darwin/common/framework/Headers/FlutterMacros.h"
13#import "flutter/shell/platform/darwin/ios/framework/Source/FlutterEngine_Internal.h"
14#import "flutter/shell/platform/darwin/ios/platform_view_ios.h"
15
17
18namespace flutter {
19namespace {
20
21class FakeDelegate : public PlatformView::Delegate {
22 public:
23 void OnPlatformViewCreated(std::unique_ptr<Surface> surface) override {}
24 void OnPlatformViewDestroyed() override {}
25 void OnPlatformViewScheduleFrame() override {}
26 void OnPlatformViewAddView(int64_t view_id,
27 const ViewportMetrics& viewport_metrics,
28 AddViewCallback callback) override {}
29 void OnPlatformViewRemoveView(int64_t view_id, RemoveViewCallback callback) override {}
30 void OnPlatformViewSetNextFrameCallback(const fml::closure& closure) override {}
31 void OnPlatformViewSetViewportMetrics(int64_t view_id, const ViewportMetrics& metrics) override {}
32 const flutter::Settings& OnPlatformViewGetSettings() const override { return settings_; }
33 void OnPlatformViewDispatchPlatformMessage(std::unique_ptr<PlatformMessage> message) override {}
34 void OnPlatformViewDispatchPointerDataPacket(std::unique_ptr<PointerDataPacket> packet) override {
35 }
36 void OnPlatformViewDispatchSemanticsAction(int32_t id,
38 fml::MallocMapping args) override {}
39 void OnPlatformViewSetSemanticsEnabled(bool enabled) override {}
40 void OnPlatformViewSetAccessibilityFeatures(int32_t flags) override {}
41 void OnPlatformViewRegisterTexture(std::shared_ptr<Texture> texture) override {}
42 void OnPlatformViewUnregisterTexture(int64_t texture_id) override {}
43 void OnPlatformViewMarkTextureFrameAvailable(int64_t texture_id) override {}
44
45 void LoadDartDeferredLibrary(intptr_t loading_unit_id,
46 std::unique_ptr<const fml::Mapping> snapshot_data,
47 std::unique_ptr<const fml::Mapping> snapshot_instructions) override {
48 }
49 void LoadDartDeferredLibraryError(intptr_t loading_unit_id,
50 const std::string error_message,
51 bool transient) override {}
52 void UpdateAssetResolverByType(std::unique_ptr<AssetResolver> updated_asset_resolver,
54
56};
57
58} // namespace
59} // namespace flutter
60
61@interface FlutterEnginePlatformViewTest : XCTestCase
62@end
63
65std::unique_ptr<flutter::PlatformViewIOS> platform_view;
66std::unique_ptr<fml::WeakPtrFactory<flutter::PlatformView>> weak_factory;
67flutter::FakeDelegate fake_delegate;
68
69- (void)setUp {
71 auto thread_task_runner = fml::MessageLoop::GetCurrent().GetTaskRunner();
72 auto sync_switch = std::make_shared<fml::SyncSwitch>();
73 flutter::TaskRunners runners(/*label=*/self.name.UTF8String,
74 /*platform=*/thread_task_runner,
75 /*raster=*/thread_task_runner,
76 /*ui=*/thread_task_runner,
77 /*io=*/thread_task_runner);
78 platform_view = std::make_unique<flutter::PlatformViewIOS>(
79 /*delegate=*/fake_delegate,
80 /*rendering_api=*/fake_delegate.settings_.enable_impeller
83 /*platform_views_controller=*/nil,
84 /*task_runners=*/runners,
85 /*worker_task_runner=*/nil,
86 /*is_gpu_disabled_sync_switch=*/sync_switch);
87 weak_factory = std::make_unique<fml::WeakPtrFactory<flutter::PlatformView>>(platform_view.get());
88}
89
90- (void)tearDown {
91 weak_factory.reset();
92 platform_view.reset();
93}
94
95- (fml::WeakPtr<flutter::PlatformView>)platformViewReplacement {
96 return weak_factory->GetWeakPtr();
97}
98
99- (void)testMsaaSampleCount {
100 if (fake_delegate.settings_.enable_impeller) {
101 // Default should be 4 for Impeller.
102 XCTAssertEqual(platform_view->GetIosContext()->GetMsaaSampleCount(), MsaaSampleCount::kFour);
103 } else {
104 // Default should be 1 for Skia.
105 XCTAssertEqual(platform_view->GetIosContext()->GetMsaaSampleCount(), MsaaSampleCount::kNone);
106 }
107
108 // Verify the platform view creates a new context with updated msaa_samples.
109 // Need to use Metal, since this is ignored for Software/GL.
110 fake_delegate.settings_.msaa_samples = 4;
111
112 auto thread_task_runner = fml::MessageLoop::GetCurrent().GetTaskRunner();
113 auto sync_switch = std::make_shared<fml::SyncSwitch>();
114 flutter::TaskRunners runners(/*label=*/self.name.UTF8String,
115 /*platform=*/thread_task_runner,
116 /*raster=*/thread_task_runner,
117 /*ui=*/thread_task_runner,
118 /*io=*/thread_task_runner);
119 auto msaa_4x_platform_view = std::make_unique<flutter::PlatformViewIOS>(
120 /*delegate=*/fake_delegate,
121 /*rendering_api=*/flutter::IOSRenderingAPI::kMetal,
122 /*platform_views_controller=*/nil,
123 /*task_runners=*/runners,
124 /*worker_task_runner=*/nil,
125 /*is_gpu_disabled_sync_switch=*/sync_switch);
126
127 XCTAssertEqual(msaa_4x_platform_view->GetIosContext()->GetMsaaSampleCount(),
129}
130
132 FlutterEngine* engine = [[FlutterEngine alloc] initWithName:@"tester"];
133 XCTAssertNotNil(engine);
134 id mockEngine = OCMPartialMock(engine);
135 OCMStub([mockEngine notifyLowMemory]);
136 OCMStub([mockEngine iosPlatformView]).andReturn(platform_view.get());
137
138 [engine setViewController:nil];
139 OCMVerify([mockEngine notifyLowMemory]);
140 OCMReject([mockEngine notifyLowMemory]);
141
142 XCTNSNotificationExpectation* memoryExpectation = [[XCTNSNotificationExpectation alloc]
143 initWithName:UIApplicationDidReceiveMemoryWarningNotification];
144 [[NSNotificationCenter defaultCenter]
145 postNotificationName:UIApplicationDidReceiveMemoryWarningNotification
146 object:nil];
147 [self waitForExpectations:@[ memoryExpectation ] timeout:5.0];
148 OCMVerify([mockEngine notifyLowMemory]);
149 OCMReject([mockEngine notifyLowMemory]);
150
151 XCTNSNotificationExpectation* backgroundExpectation = [[XCTNSNotificationExpectation alloc]
152 initWithName:UIApplicationDidEnterBackgroundNotification];
153 [[NSNotificationCenter defaultCenter]
154 postNotificationName:UIApplicationDidEnterBackgroundNotification
155 object:nil];
156 [self waitForExpectations:@[ backgroundExpectation ] timeout:5.0];
157
158 OCMVerify([mockEngine notifyLowMemory]);
159}
160
161@end
flutter::FakeDelegate fake_delegate
std::unique_ptr< flutter::PlatformViewIOS > platform_view
std::unique_ptr< fml::WeakPtrFactory< flutter::PlatformView > > weak_factory
AssetResolverType
Identifies the type of AssetResolver an instance is.
A Mapping like NonOwnedMapping, but uses Free as its release proc.
Definition mapping.h:144
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
Settings settings_
FlutterEngine engine
Definition main.cc:68
VkSurfaceKHR surface
Definition main.cc:49
FlutterSemanticsFlag flags
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
void setViewController:(FlutterViewController *viewController)
Win32Message message
FlTexture * texture
static void LoadDartDeferredLibrary(JNIEnv *env, jobject obj, jlong shell_holder, jint jLoadingUnitId, jobjectArray jSearchPaths)
std::function< void()> closure
Definition closure.h:14
int64_t texture_id