Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit d36a55d

Browse files
committed
Rebase
1 parent 099a70e commit d36a55d

37 files changed

+506
-161
lines changed

common/settings.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,10 @@ struct Settings {
224224
// must be available to the application.
225225
bool enable_vulkan_validation = false;
226226

227+
// Enable the implicit view, so that the shell should create a view with
228+
// kFlutterImplicitViewId without the platform calling FlutterEngineAddView.
229+
bool enable_implicit_view = true;
230+
227231
// Data set by platform-specific embedders for use in font initialization.
228232
uint32_t font_initialization_data = 0;
229233

lib/ui/dart_ui.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,6 @@ typedef CanvasPath Path;
9696
V(IsolateNameServerNatives::RemovePortNameMapping, 1) \
9797
V(NativeStringAttribute::initLocaleStringAttribute, 4) \
9898
V(NativeStringAttribute::initSpellOutStringAttribute, 3) \
99-
V(PlatformConfigurationNativeApi::ImplicitViewEnabled, 0) \
10099
V(PlatformConfigurationNativeApi::DefaultRouteName, 0) \
101100
V(PlatformConfigurationNativeApi::ScheduleFrame, 0) \
102101
V(PlatformConfigurationNativeApi::Render, 1) \
@@ -381,6 +380,14 @@ void DartUI::InitForIsolate(const Settings& settings) {
381380
Dart_PropagateError(result);
382381
}
383382
}
383+
384+
if (settings.enable_implicit_view) {
385+
result =
386+
Dart_SetField(dart_ui, ToDart("_implicitViewEnabled"), Dart_True());
387+
if (Dart_IsError(result)) {
388+
Dart_PropagateError(result);
389+
}
390+
}
384391
}
385392

386393
} // namespace flutter

lib/ui/hooks.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,20 @@
44

55
part of dart.ui;
66

7+
@pragma('vm:entry-point')
8+
void _addView(
9+
int id,
10+
) {
11+
PlatformDispatcher.instance._addView(id);
12+
}
13+
14+
@pragma('vm:entry-point')
15+
void _removeView(
16+
int id,
17+
) {
18+
PlatformDispatcher.instance._removeView(id);
19+
}
20+
721
@pragma('vm:entry-point')
822
void _updateDisplays(
923
List<int> ids,

lib/ui/natives.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,7 @@ _ScheduleImmediateClosure _getScheduleMicrotaskClosure() => _scheduleMicrotask;
135135
// rendering.
136136
@pragma('vm:entry-point')
137137
bool _impellerEnabled = false;
138+
139+
// Used internally to indicate whether the platform uses the implicit view.
140+
@pragma('vm:entry-point')
141+
bool _implicitViewEnabled = false;

lib/ui/platform_dispatcher.dart

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ typedef ErrorCallback = bool Function(Object exception, StackTrace stackTrace);
6666
// A gesture setting value that indicates it has not been set by the engine.
6767
const double _kUnsetGestureSetting = -1.0;
6868

69+
const int _kImplicitViewId = 0;
70+
6971
// A message channel to receive KeyData from the platform.
7072
//
7173
// See embedder.cc::kFlutterKeyDataChannel for more information.
@@ -116,6 +118,9 @@ class PlatformDispatcher {
116118
/// these. Use [instance] to access the singleton.
117119
PlatformDispatcher._() {
118120
_setNeedsReportTimings = _nativeSetNeedsReportTimings;
121+
if (_implicitViewEnabled) {
122+
_doAddView(_kImplicitViewId);
123+
}
119124
}
120125

121126
/// The [PlatformDispatcher] singleton.
@@ -213,10 +218,9 @@ class PlatformDispatcher {
213218
/// * [View.of], for accessing the current view.
214219
/// * [PlatformDispatcher.views] for a list of all [FlutterView]s provided
215220
/// by the platform.
216-
FlutterView? get implicitView => _implicitViewEnabled() ? _views[0] : null;
217-
218-
@Native<Handle Function()>(symbol: 'PlatformConfigurationNativeApi::ImplicitViewEnabled')
219-
external static bool _implicitViewEnabled();
221+
FlutterView? get implicitView {
222+
return _views[_kImplicitViewId];
223+
}
220224

221225
/// A callback that is invoked whenever the [ViewConfiguration] of any of the
222226
/// [views] changes.
@@ -244,6 +248,28 @@ class PlatformDispatcher {
244248
_onMetricsChangedZone = Zone.current;
245249
}
246250

251+
FlutterView _createView(int id) {
252+
return FlutterView._(id, this);
253+
}
254+
255+
void _addView(int id) {
256+
assert(id != _kImplicitViewId, 'The implicit view #$id can not be added.');
257+
_doAddView(id);
258+
}
259+
260+
void _doAddView(int id) {
261+
assert(!_views.containsKey(id), 'View ID $id already exists.');
262+
_views[id] = _createView(id);
263+
_viewConfigurations[id] = const _ViewConfiguration();
264+
}
265+
266+
void _removeView(int id) {
267+
assert(id != _kImplicitViewId, 'The implicit view #$id can not be removed.');
268+
assert(_views.containsKey(id), 'View ID $id does not exist.');
269+
_views.remove(id);
270+
_viewConfigurations.remove(id);
271+
}
272+
247273
// Called from the engine, via hooks.dart.
248274
//
249275
// Updates the available displays.
@@ -283,9 +309,7 @@ class PlatformDispatcher {
283309
) {
284310
final _ViewConfiguration previousConfiguration =
285311
_viewConfigurations[id] ?? const _ViewConfiguration();
286-
if (!_views.containsKey(id)) {
287-
_views[id] = FlutterView._(id, this);
288-
}
312+
_views.putIfAbsent(id, () => _createView(id));
289313
_viewConfigurations[id] = previousConfiguration.copyWith(
290314
view: _views[id],
291315
devicePixelRatio: devicePixelRatio,

lib/ui/window/platform_configuration.cc

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
namespace flutter {
2323
namespace {
2424

25-
constexpr int kImplicitViewId = 0;
25+
static constexpr int64_t kFlutterImplicitViewId = 0ll;
2626

2727
Dart_Handle ToByteData(const fml::Mapping& buffer) {
2828
return tonic::DartByteData::Create(buffer.GetMapping(), buffer.GetSize());
@@ -34,7 +34,11 @@ PlatformConfigurationClient::~PlatformConfigurationClient() {}
3434

3535
PlatformConfiguration::PlatformConfiguration(
3636
PlatformConfigurationClient* client)
37-
: client_(client) {}
37+
: client_(client) {
38+
if (client_->ImplicitViewEnabled()) {
39+
DoAddView(kFlutterImplicitViewId);
40+
}
41+
}
3842

3943
PlatformConfiguration::~PlatformConfiguration() {}
4044

@@ -43,6 +47,10 @@ void PlatformConfiguration::DidCreateIsolate() {
4347

4448
on_error_.Set(tonic::DartState::Current(),
4549
Dart_GetField(library, tonic::ToDart("_onError")));
50+
add_view_.Set(tonic::DartState::Current(),
51+
Dart_GetField(library, tonic::ToDart("_addView")));
52+
remove_view_.Set(tonic::DartState::Current(),
53+
Dart_GetField(library, tonic::ToDart("_removeView")));
4654
update_displays_.Set(
4755
tonic::DartState::Current(),
4856
Dart_GetField(library, tonic::ToDart("_updateDisplays")));
@@ -76,12 +84,46 @@ void PlatformConfiguration::DidCreateIsolate() {
7684
report_timings_.Set(tonic::DartState::Current(),
7785
Dart_GetField(library, tonic::ToDart("_reportTimings")));
7886

79-
// TODO(loicsharma): This should only be created if the embedder enables the
80-
// implicit view.
81-
// See: https://github.com/flutter/flutter/issues/120306
82-
windows_.emplace(kImplicitViewId,
83-
std::make_unique<Window>(
84-
kImplicitViewId, ViewportMetrics{1.0, 0.0, 0.0, -1, 0}));
87+
library_.Set(tonic::DartState::Current(),
88+
Dart_LookupLibrary(tonic::ToDart("dart:ui")));
89+
}
90+
91+
void PlatformConfiguration::AddView(int64_t view_id) {
92+
FML_DCHECK(view_id != kFlutterImplicitViewId);
93+
DoAddView(view_id);
94+
}
95+
96+
void PlatformConfiguration::DoAddView(int64_t view_id) {
97+
windows_.emplace(
98+
view_id, std::make_unique<Window>(library_, view_id,
99+
ViewportMetrics{1.0, 0.0, 0.0, -1, 0}));
100+
if (view_id == kFlutterImplicitViewId) {
101+
return;
102+
}
103+
std::shared_ptr<tonic::DartState> dart_state = add_view_.dart_state().lock();
104+
if (!dart_state) {
105+
return;
106+
}
107+
tonic::DartState::Scope scope(dart_state);
108+
tonic::CheckAndHandleError(
109+
tonic::DartInvoke(add_view_.Get(), {
110+
tonic::ToDart(view_id),
111+
}));
112+
}
113+
114+
void PlatformConfiguration::RemoveView(int64_t view_id) {
115+
FML_DCHECK(view_id != kFlutterImplicitViewId);
116+
windows_.erase(view_id);
117+
std::shared_ptr<tonic::DartState> dart_state =
118+
remove_view_.dart_state().lock();
119+
if (!dart_state) {
120+
return;
121+
}
122+
tonic::DartState::Scope scope(dart_state);
123+
tonic::CheckAndHandleError(
124+
tonic::DartInvoke(remove_view_.Get(), {
125+
tonic::ToDart(view_id),
126+
}));
85127
}
86128

87129
void PlatformConfiguration::UpdateDisplays(
@@ -492,16 +534,6 @@ Dart_Handle PlatformConfigurationNativeApi::ComputePlatformResolvedLocale(
492534
return tonic::DartConverter<std::vector<std::string>>::ToDart(results);
493535
}
494536

495-
Dart_Handle PlatformConfigurationNativeApi::ImplicitViewEnabled() {
496-
UIDartState::ThrowIfUIOperationsProhibited();
497-
bool enabled = UIDartState::Current()
498-
->platform_configuration()
499-
->client()
500-
->ImplicitViewEnabled();
501-
502-
return Dart_NewBoolean(enabled);
503-
}
504-
505537
std::string PlatformConfigurationNativeApi::DefaultRouteName() {
506538
UIDartState::ThrowIfUIOperationsProhibited();
507539
return UIDartState::Current()

lib/ui/window/platform_configuration.h

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,10 @@ class PlatformConfiguration final {
268268
///
269269
void DidCreateIsolate();
270270

271+
void AddView(int64_t view_id);
272+
273+
void RemoveView(int64_t view_id);
274+
271275
//----------------------------------------------------------------------------
272276
/// @brief Update the specified display data in the framework.
273277
///
@@ -415,7 +419,14 @@ class PlatformConfiguration final {
415419
///
416420
/// @return a pointer to the Window.
417421
///
418-
Window* get_window(int window_id) { return windows_[window_id].get(); }
422+
Window* get_window(int window_id) {
423+
auto found = windows_.find(window_id);
424+
if (found != windows_.end()) {
425+
return found->second.get();
426+
} else {
427+
return nullptr;
428+
}
429+
}
419430

420431
//----------------------------------------------------------------------------
421432
/// @brief Responds to a previous platform message to the engine from the
@@ -442,6 +453,8 @@ class PlatformConfiguration final {
442453
private:
443454
PlatformConfigurationClient* client_;
444455
tonic::DartPersistentValue on_error_;
456+
tonic::DartPersistentValue add_view_;
457+
tonic::DartPersistentValue remove_view_;
445458
tonic::DartPersistentValue update_displays_;
446459
tonic::DartPersistentValue update_locales_;
447460
tonic::DartPersistentValue update_user_settings_data_;
@@ -455,12 +468,20 @@ class PlatformConfiguration final {
455468
tonic::DartPersistentValue draw_frame_;
456469
tonic::DartPersistentValue report_timings_;
457470

471+
tonic::DartPersistentValue library_;
472+
473+
// All *actual* views that the app has.
474+
//
475+
// This means that, if implicit view is enabled but the implicit view is
476+
// currently closed, `windows_` will not have an entry for ID 0.
458477
std::unordered_map<int64_t, std::unique_ptr<Window>> windows_;
459478

460479
// ID starts at 1 because an ID of 0 indicates that no response is expected.
461480
int next_response_id_ = 1;
462481
std::unordered_map<int, fml::RefPtr<PlatformMessageResponse>>
463482
pending_responses_;
483+
484+
void DoAddView(int64_t view_id);
464485
};
465486

466487
//----------------------------------------------------------------------------
@@ -489,8 +510,6 @@ class PlatformMessageHandlerStorage {
489510
//----------------------------------------------------------------------------
490511
class PlatformConfigurationNativeApi {
491512
public:
492-
static Dart_Handle ImplicitViewEnabled();
493-
494513
static std::string DefaultRouteName();
495514

496515
static void ScheduleFrame();

lib/ui/window/window.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@
1313

1414
namespace flutter {
1515

16-
Window::Window(int64_t window_id, ViewportMetrics metrics)
17-
: window_id_(window_id), viewport_metrics_(std::move(metrics)) {
18-
library_.Set(tonic::DartState::Current(),
19-
Dart_LookupLibrary(tonic::ToDart("dart:ui")));
20-
}
16+
Window::Window(tonic::DartPersistentValue& library,
17+
int64_t window_id,
18+
ViewportMetrics metrics)
19+
: library_(library),
20+
window_id_(window_id),
21+
viewport_metrics_(std::move(metrics)) {}
2122

2223
Window::~Window() {}
2324

lib/ui/window/window.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
namespace flutter {
2121
class Window final {
2222
public:
23-
Window(int64_t window_id, ViewportMetrics metrics);
23+
Window(tonic::DartPersistentValue& library,
24+
int64_t window_id,
25+
ViewportMetrics metrics);
2426

2527
~Window();
2628

@@ -31,7 +33,7 @@ class Window final {
3133
void UpdateWindowMetrics(const ViewportMetrics& metrics);
3234

3335
private:
34-
tonic::DartPersistentValue library_;
36+
tonic::DartPersistentValue& library_;
3537
int64_t window_id_;
3638
ViewportMetrics viewport_metrics_;
3739
};

0 commit comments

Comments
 (0)