Flutter Engine
 
Loading...
Searching...
No Matches
platform_configuration.cc
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
6
7#include <cstring>
8
22
23namespace flutter {
24namespace {
25
26Dart_Handle ToByteData(const fml::Mapping& buffer) {
27 return tonic::DartByteData::Create(buffer.GetMapping(), buffer.GetSize());
28}
29
30} // namespace
31
33
37
39
41 Dart_Handle library = Dart_LookupLibrary(tonic::ToDart("dart:ui"));
42
44 Dart_GetField(library, tonic::ToDart("_onError")));
46 Dart_GetField(library, tonic::ToDart("_addView")));
47 remove_view_.Set(tonic::DartState::Current(),
48 Dart_GetField(library, tonic::ToDart("_removeView")));
49 send_view_focus_event_.Set(
51 Dart_GetField(library, tonic::ToDart("_sendViewFocusEvent")));
52 set_engine_id_.Set(tonic::DartState::Current(),
53 Dart_GetField(library, tonic::ToDart("_setEngineId")));
54 update_window_metrics_.Set(
56 Dart_GetField(library, tonic::ToDart("_updateWindowMetrics")));
57 update_displays_.Set(
59 Dart_GetField(library, tonic::ToDart("_updateDisplays")));
60 update_locales_.Set(tonic::DartState::Current(),
61 Dart_GetField(library, tonic::ToDart("_updateLocales")));
62 update_user_settings_data_.Set(
64 Dart_GetField(library, tonic::ToDart("_updateUserSettingsData")));
65 update_initial_lifecycle_state_.Set(
67 Dart_GetField(library, tonic::ToDart("_updateInitialLifecycleState")));
68 update_semantics_enabled_.Set(
70 Dart_GetField(library, tonic::ToDart("_updateSemanticsEnabled")));
71 update_accessibility_features_.Set(
73 Dart_GetField(library, tonic::ToDart("_updateAccessibilityFeatures")));
74 dispatch_platform_message_.Set(
76 Dart_GetField(library, tonic::ToDart("_dispatchPlatformMessage")));
77 dispatch_pointer_data_packet_.Set(
79 Dart_GetField(library, tonic::ToDart("_dispatchPointerDataPacket")));
80 dispatch_semantics_action_.Set(
82 Dart_GetField(library, tonic::ToDart("_dispatchSemanticsAction")));
83 begin_frame_.Set(tonic::DartState::Current(),
84 Dart_GetField(library, tonic::ToDart("_beginFrame")));
85 draw_frame_.Set(tonic::DartState::Current(),
86 Dart_GetField(library, tonic::ToDart("_drawFrame")));
87 report_timings_.Set(tonic::DartState::Current(),
88 Dart_GetField(library, tonic::ToDart("_reportTimings")));
89}
90
92 const ViewportMetrics& view_metrics) {
93 auto [view_iterator, insertion_happened] =
94 metrics_.emplace(view_id, view_metrics);
95 if (!insertion_happened) {
96 FML_LOG(ERROR) << "View #" << view_id << " already exists.";
97 return false;
98 }
99
100 std::shared_ptr<tonic::DartState> dart_state = add_view_.dart_state().lock();
101 if (!dart_state) {
102 return false;
103 }
104 tonic::DartState::Scope scope(dart_state);
106 add_view_.Get(),
107 {
108 tonic::ToDart(view_id),
109 tonic::ToDart(view_metrics.device_pixel_ratio),
110 tonic::ToDart(view_metrics.physical_width),
111 tonic::ToDart(view_metrics.physical_height),
112 tonic::ToDart(view_metrics.physical_padding_top),
113 tonic::ToDart(view_metrics.physical_padding_right),
114 tonic::ToDart(view_metrics.physical_padding_bottom),
115 tonic::ToDart(view_metrics.physical_padding_left),
116 tonic::ToDart(view_metrics.physical_view_inset_top),
117 tonic::ToDart(view_metrics.physical_view_inset_right),
118 tonic::ToDart(view_metrics.physical_view_inset_bottom),
119 tonic::ToDart(view_metrics.physical_view_inset_left),
120 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
121 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
122 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
123 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
124 tonic::ToDart(view_metrics.physical_touch_slop),
125 tonic::ToDart(view_metrics.physical_display_features_bounds),
126 tonic::ToDart(view_metrics.physical_display_features_type),
127 tonic::ToDart(view_metrics.physical_display_features_state),
128 tonic::ToDart(view_metrics.display_id),
129 tonic::ToDart(view_metrics.physical_min_width_constraint),
130 tonic::ToDart(view_metrics.physical_max_width_constraint),
131 tonic::ToDart(view_metrics.physical_min_height_constraint),
132 tonic::ToDart(view_metrics.physical_max_height_constraint),
133 }));
134 return true;
135}
136
139 FML_LOG(FATAL) << "The implicit view #" << view_id << " cannot be removed.";
140 return false;
141 }
142 size_t erased_elements = metrics_.erase(view_id);
143 if (erased_elements == 0) {
144 FML_LOG(ERROR) << "View #" << view_id << " doesn't exist.";
145 return false;
146 }
147
148 std::shared_ptr<tonic::DartState> dart_state =
149 remove_view_.dart_state().lock();
150 if (!dart_state) {
151 return false;
152 }
153 tonic::DartState::Scope scope(dart_state);
155 tonic::DartInvoke(remove_view_.Get(), {
156 tonic::ToDart(view_id),
157 }));
158 return true;
159}
160
162 std::shared_ptr<tonic::DartState> dart_state =
163 remove_view_.dart_state().lock();
164 if (!dart_state) {
165 return false;
166 }
167 tonic::DartState::Scope scope(dart_state);
169 send_view_focus_event_.Get(), {
170 tonic::ToDart(event.view_id()),
171 tonic::ToDart(event.state()),
172 tonic::ToDart(event.direction()),
173 }));
174 return true;
175}
176
177bool PlatformConfiguration::SetEngineId(int64_t engine_id) {
178 std::shared_ptr<tonic::DartState> dart_state =
179 set_engine_id_.dart_state().lock();
180 if (!dart_state) {
181 return false;
182 }
183 tonic::DartState::Scope scope(dart_state);
185 tonic::DartInvoke(set_engine_id_.Get(), {
186 tonic::ToDart(engine_id),
187 }));
188 return true;
189}
190
192 int64_t view_id,
193 const ViewportMetrics& view_metrics) {
194 auto found_iter = metrics_.find(view_id);
195 if (found_iter == metrics_.end()) {
196 return false;
197 }
198
199 found_iter->second = view_metrics;
200
201 std::shared_ptr<tonic::DartState> dart_state =
202 update_window_metrics_.dart_state().lock();
203 if (!dart_state) {
204 return false;
205 }
206 tonic::DartState::Scope scope(dart_state);
208 update_window_metrics_.Get(),
209 {
210 tonic::ToDart(view_id),
211 tonic::ToDart(view_metrics.device_pixel_ratio),
212 tonic::ToDart(view_metrics.physical_width),
213 tonic::ToDart(view_metrics.physical_height),
214 tonic::ToDart(view_metrics.physical_padding_top),
215 tonic::ToDart(view_metrics.physical_padding_right),
216 tonic::ToDart(view_metrics.physical_padding_bottom),
217 tonic::ToDart(view_metrics.physical_padding_left),
218 tonic::ToDart(view_metrics.physical_view_inset_top),
219 tonic::ToDart(view_metrics.physical_view_inset_right),
220 tonic::ToDart(view_metrics.physical_view_inset_bottom),
221 tonic::ToDart(view_metrics.physical_view_inset_left),
222 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
223 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
224 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
225 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
226 tonic::ToDart(view_metrics.physical_touch_slop),
227 tonic::ToDart(view_metrics.physical_display_features_bounds),
228 tonic::ToDart(view_metrics.physical_display_features_type),
229 tonic::ToDart(view_metrics.physical_display_features_state),
230 tonic::ToDart(view_metrics.display_id),
231 tonic::ToDart(view_metrics.physical_min_width_constraint),
232 tonic::ToDart(view_metrics.physical_max_width_constraint),
233 tonic::ToDart(view_metrics.physical_min_height_constraint),
234 tonic::ToDart(view_metrics.physical_max_height_constraint),
235 }));
236 return true;
237}
238
240 const std::vector<DisplayData>& displays) {
241 std::vector<DisplayId> ids;
242 std::vector<double> widths;
243 std::vector<double> heights;
244 std::vector<double> device_pixel_ratios;
245 std::vector<double> refresh_rates;
246 for (const auto& display : displays) {
247 ids.push_back(display.id);
248 widths.push_back(display.width);
249 heights.push_back(display.height);
250 device_pixel_ratios.push_back(display.pixel_ratio);
251 refresh_rates.push_back(display.refresh_rate);
252 }
253 std::shared_ptr<tonic::DartState> dart_state =
254 update_displays_.dart_state().lock();
255 if (!dart_state) {
256 return;
257 }
258 tonic::DartState::Scope scope(dart_state);
260 update_displays_.Get(),
261 {
262 tonic::ToDart<std::vector<DisplayId>>(ids),
263 tonic::ToDart<std::vector<double>>(widths),
264 tonic::ToDart<std::vector<double>>(heights),
265 tonic::ToDart<std::vector<double>>(device_pixel_ratios),
266 tonic::ToDart<std::vector<double>>(refresh_rates),
267 }));
268}
269
271 const std::vector<std::string>& locales) {
272 std::shared_ptr<tonic::DartState> dart_state =
273 update_locales_.dart_state().lock();
274 if (!dart_state) {
275 return;
276 }
277
278 tonic::DartState::Scope scope(dart_state);
280 tonic::DartInvoke(update_locales_.Get(),
281 {
282 tonic::ToDart<std::vector<std::string>>(locales),
283 }));
284}
285
287 std::shared_ptr<tonic::DartState> dart_state =
288 update_user_settings_data_.dart_state().lock();
289 if (!dart_state) {
290 return;
291 }
292 tonic::DartState::Scope scope(dart_state);
293
294 tonic::CheckAndHandleError(tonic::DartInvoke(update_user_settings_data_.Get(),
295 {
296 tonic::StdStringToDart(data),
297 }));
298}
299
301 const std::string& data) {
302 std::shared_ptr<tonic::DartState> dart_state =
303 update_initial_lifecycle_state_.dart_state().lock();
304 if (!dart_state) {
305 return;
306 }
307 tonic::DartState::Scope scope(dart_state);
309 update_initial_lifecycle_state_.Get(), {
310 tonic::StdStringToDart(data),
311 }));
312}
313
315 std::shared_ptr<tonic::DartState> dart_state =
316 update_semantics_enabled_.dart_state().lock();
317 if (!dart_state) {
318 return;
319 }
320 tonic::DartState::Scope scope(dart_state);
322
323 tonic::CheckAndHandleError(tonic::DartInvoke(update_semantics_enabled_.Get(),
324 {tonic::ToDart(enabled)}));
325}
326
328 std::shared_ptr<tonic::DartState> dart_state =
329 update_accessibility_features_.dart_state().lock();
330 if (!dart_state) {
331 return;
332 }
333 tonic::DartState::Scope scope(dart_state);
334
336 update_accessibility_features_.Get(), {tonic::ToDart(values)}));
337}
338
340 std::unique_ptr<PlatformMessage> message) {
341 std::shared_ptr<tonic::DartState> dart_state =
342 dispatch_platform_message_.dart_state().lock();
343 if (!dart_state) {
344 FML_DLOG(WARNING)
345 << "Dropping platform message for lack of DartState on channel: "
346 << message->channel();
347 return;
348 }
349 tonic::DartState::Scope scope(dart_state);
350 Dart_Handle data_handle =
351 (message->hasData()) ? ToByteData(message->data()) : Dart_Null();
352 if (Dart_IsError(data_handle)) {
353 FML_DLOG(WARNING)
354 << "Dropping platform message because of a Dart error on channel: "
355 << message->channel();
356 return;
357 }
358
359 int response_id = 0;
360 if (auto response = message->response()) {
361 response_id = next_response_id_++;
362 pending_responses_[response_id] = response;
363 }
364
366 tonic::DartInvoke(dispatch_platform_message_.Get(),
367 {tonic::ToDart(message->channel()), data_handle,
368 tonic::ToDart(response_id)}));
369}
370
372 const PointerDataPacket& packet) {
373 std::shared_ptr<tonic::DartState> dart_state =
374 dispatch_pointer_data_packet_.dart_state().lock();
375 if (!dart_state) {
376 return;
377 }
378 tonic::DartState::Scope scope(dart_state);
379
380 const std::vector<uint8_t>& buffer = packet.data();
381 Dart_Handle data_handle =
383 if (Dart_IsError(data_handle)) {
384 return;
385 }
386
388 tonic::DartInvoke(dispatch_pointer_data_packet_.Get(), {data_handle}));
389}
390
392 int32_t node_id,
395 std::shared_ptr<tonic::DartState> dart_state =
396 dispatch_semantics_action_.dart_state().lock();
397 if (!dart_state) {
398 return;
399 }
400 tonic::DartState::Scope scope(dart_state);
401
402 Dart_Handle args_handle =
403 (args.GetSize() <= 0) ? Dart_Null() : ToByteData(args);
404
405 if (Dart_IsError(args_handle)) {
406 return;
407 }
408
410 dispatch_semantics_action_.Get(),
411 {tonic::ToDart(view_id), tonic::ToDart(node_id),
412 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
413}
414
416 uint64_t frame_number) {
417 std::shared_ptr<tonic::DartState> dart_state =
418 begin_frame_.dart_state().lock();
419 if (!dart_state) {
420 return;
421 }
422 tonic::DartState::Scope scope(dart_state);
423
424 if (last_frame_number_ > frame_number) {
425 FML_LOG(ERROR) << "Frame number is out of order: " << frame_number << " < "
426 << last_frame_number_;
427 }
428 last_frame_number_ = frame_number;
429
430 // frameTime is not a delta; its the timestamp of the presentation.
431 // This is just a type conversion.
432 int64_t microseconds = frameTime.ToEpochDelta().ToMicroseconds();
433 if (last_microseconds_ > microseconds) {
434 // Do not allow time traveling frametimes
435 // github.com/flutter/flutter/issues/106277
436 FML_LOG(ERROR)
437 << "Reported frame time is older than the last one; clamping. "
438 << microseconds << " < " << last_microseconds_
439 << " ~= " << last_microseconds_ - microseconds;
440 microseconds = last_microseconds_;
441 }
442 last_microseconds_ = microseconds;
443
445 tonic::DartInvoke(begin_frame_.Get(), {
446 Dart_NewInteger(microseconds),
447 Dart_NewInteger(frame_number),
448 }));
449
451
453}
454
455void PlatformConfiguration::ReportTimings(std::vector<int64_t> timings) {
456 std::shared_ptr<tonic::DartState> dart_state =
457 report_timings_.dart_state().lock();
458 if (!dart_state) {
459 return;
460 }
461 tonic::DartState::Scope scope(dart_state);
462
463 Dart_Handle data_handle =
464 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
465
466 Dart_TypedData_Type type;
467 void* data = nullptr;
468 intptr_t num_acquired = 0;
469 FML_CHECK(!Dart_IsError(
470 Dart_TypedDataAcquireData(data_handle, &type, &data, &num_acquired)));
471 FML_DCHECK(num_acquired == static_cast<int>(timings.size()));
472
473 memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
474 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
475
477 tonic::DartInvoke(report_timings_.Get(), {
478 data_handle,
479 }));
480}
481
483 auto found = metrics_.find(view_id);
484 if (found != metrics_.end()) {
485 return &found->second;
486 } else {
487 return nullptr;
488 }
489}
490
492 int response_id) {
493 if (!response_id) {
494 return;
495 }
496 auto it = pending_responses_.find(response_id);
497 if (it == pending_responses_.end()) {
498 return;
499 }
500 auto response = std::move(it->second);
501 pending_responses_.erase(it);
502 response->CompleteEmpty();
503}
504
506 int response_id,
507 std::vector<uint8_t> data) {
508 if (!response_id) {
509 return;
510 }
511 auto it = pending_responses_.find(response_id);
512 if (it == pending_responses_.end()) {
513 return;
514 }
515 auto response = std::move(it->second);
516 pending_responses_.erase(it);
517 response->Complete(std::make_unique<fml::DataMapping>(std::move(data)));
518}
519
528
536
537namespace {
538Dart_Handle HandlePlatformMessage(
539 UIDartState* dart_state,
540 const std::string& name,
541 Dart_Handle data_handle,
542 const fml::RefPtr<PlatformMessageResponse>& response) {
543 if (Dart_IsNull(data_handle)) {
544 return dart_state->HandlePlatformMessage(
545 std::make_unique<PlatformMessage>(name, response));
546 } else {
547 tonic::DartByteData data(data_handle);
548 const uint8_t* buffer = static_cast<const uint8_t*>(data.data());
549 return dart_state->HandlePlatformMessage(std::make_unique<PlatformMessage>(
550 name, fml::MallocMapping::Copy(buffer, data.length_in_bytes()),
551 response));
552 }
553}
554} // namespace
555
557 const std::string& name,
558 Dart_Handle callback,
559 Dart_Handle data_handle) {
560 UIDartState* dart_state = UIDartState::Current();
561
562 if (!dart_state->platform_configuration()) {
563 return tonic::ToDart(
564 "SendPlatformMessage only works on the root isolate, see "
565 "SendPortPlatformMessage.");
566 }
567
569 if (!Dart_IsNull(callback)) {
570 response = fml::MakeRefCounted<PlatformMessageResponseDart>(
572 dart_state->GetTaskRunners().GetUITaskRunner(), name);
573 }
574
575 return HandlePlatformMessage(dart_state, name, data_handle, response);
576}
577
579 const std::string& name,
580 Dart_Handle identifier,
581 Dart_Handle send_port,
582 Dart_Handle data_handle) {
583 // This can be executed on any isolate.
584 UIDartState* dart_state = UIDartState::Current();
585
586 int64_t c_send_port = tonic::DartConverter<int64_t>::FromDart(send_port);
587 if (c_send_port == ILLEGAL_PORT) {
588 return tonic::ToDart("Invalid port specified");
589 }
590
592 fml::MakeRefCounted<PlatformMessageResponseDartPort>(
593 c_send_port, tonic::DartConverter<int64_t>::FromDart(identifier),
594 name);
595
596 return HandlePlatformMessage(dart_state, name, data_handle, response);
597}
598
600 int64_t state,
601 int64_t direction) {
603 static_cast<ViewFocusState>(state),
604 static_cast<ViewFocusDirection>(direction)};
605 UIDartState* dart_state = UIDartState::Current();
607 request);
608}
609
611 int response_id,
612 const tonic::DartByteData& data) {
613 if (Dart_IsNull(data.dart_handle())) {
617 } else {
618 // TODO(engine): Avoid this copy.
619 const uint8_t* buffer = static_cast<const uint8_t*>(data.data());
623 response_id,
624 std::vector<uint8_t>(buffer, buffer + data.length_in_bytes()));
625 }
626}
627
633
634Dart_PerformanceMode PlatformConfigurationNativeApi::current_performance_mode_ =
635 Dart_PerformanceMode_Default;
636
638 return current_performance_mode_;
639}
640
643 current_performance_mode_ = static_cast<Dart_PerformanceMode>(mode);
644 return Dart_SetPerformanceMode(current_performance_mode_);
645}
646
649
650 auto persistent_isolate_data = UIDartState::Current()
652 ->client()
654
655 if (!persistent_isolate_data) {
656 return Dart_Null();
657 }
658
659 return tonic::DartByteData::Create(persistent_isolate_data->GetMapping(),
660 persistent_isolate_data->GetSize());
661}
662
667
672
679
687
695
697 Dart_Handle supportedLocalesHandle) {
699 std::vector<std::string> supportedLocales =
701 supportedLocalesHandle);
702
703 std::vector<std::string> results =
706 ->client()
707 ->ComputePlatformResolvedLocale(supportedLocales);
708
709 return tonic::DartConverter<std::vector<std::string>>::ToDart(results);
710}
711
719
721 UIDartState* dart_state = UIDartState::Current();
722 FML_DCHECK(dart_state);
723 return dart_state->GetRootIsolateToken();
724}
725
727 int64_t root_isolate_token) {
728 UIDartState* dart_state = UIDartState::Current();
729 FML_DCHECK(dart_state && !dart_state->IsRootIsolate());
730 auto platform_message_handler =
731 (*static_cast<std::shared_ptr<PlatformMessageHandlerStorage>*>(
732 Dart_CurrentIsolateGroupData()));
733 FML_DCHECK(platform_message_handler);
734 auto weak_platform_message_handler =
735 platform_message_handler->GetPlatformMessageHandler(root_isolate_token);
736 dart_state->SetPlatformMessageHandler(weak_platform_message_handler);
737}
738
740 bool listening) {
742 name, listening);
743}
744
746 double unscaled_font_size,
747 int configuration_id) {
749 return UIDartState::Current()
751 ->client()
752 ->GetScaledFontSize(unscaled_font_size, configuration_id);
753}
754} // namespace flutter
GLenum type
A client interface that the RuntimeController uses to define handlers for PlatformConfiguration reque...
virtual void RequestViewFocusChange(const ViewFocusChangeRequest &request)=0
Notifies the client that the Flutter view focus state has changed and the platform view should be upd...
virtual std::shared_ptr< const fml::Mapping > GetPersistentIsolateData()=0
The embedder can specify data that the isolate can request synchronously on launch....
virtual void EndWarmUpFrame()=0
Called when a warm up frame has ended.
virtual void SetApplicationLocale(std::string locale)=0
Framework sets the application locale.
virtual void SetNeedsReportTimings(bool value)=0
Notifies this client that the application has an opinion about whether its frame timings need to be r...
virtual void SetSemanticsTreeEnabled(bool enabled)=0
Notifies whether Framework starts generating semantics tree.
virtual std::string DefaultRouteName()=0
The route or path that the embedder requested when the application was launched.
virtual void ScheduleFrame()=0
Requests that, at the next appropriate opportunity, a new frame be scheduled for rendering.
virtual double GetScaledFontSize(double unscaled_font_size, int configuration_id) const =0
Synchronously invokes platform-specific APIs to apply the system text scaling on the given unscaled f...
virtual std::unique_ptr< std::vector< std::string > > ComputePlatformResolvedLocale(const std::vector< std::string > &supported_locale_data)=0
Directly invokes platform-specific APIs to compute the locale the platform would have natively resolv...
virtual void UpdateSemantics(int64_t viewId, SemanticsUpdate *update)=0
Receives an updated semantics tree from the Framework.
virtual void Render(int64_t view_id, Scene *scene, double width, double height)=0
Updates the client's rendering on the GPU with the newly provided Scene.
virtual void SendChannelUpdate(std::string name, bool listening)=0
Invoked when a listener is registered on a platform channel.
void UpdateAccessibilityFeatures(int32_t flags)
Forward the preference of accessibility features that must be enabled in the semantics tree to the fr...
bool SetEngineId(int64_t engine_id)
Sets the opaque identifier of the engine.
void DidCreateIsolate()
Called by the RuntimeController once it has created the root isolate, so that the PlatformController ...
void DispatchPointerDataPacket(const PointerDataPacket &packet)
Notifies the PlatformConfiguration that the client has sent it pointer events. This call originates i...
void CompletePlatformMessageResponse(int response_id, std::vector< uint8_t > data)
Responds to a previous platform message to the engine from the framework.
void DispatchSemanticsAction(int64_t view_id, int32_t node_id, SemanticsAction action, fml::MallocMapping args)
Notifies the framework that the embedder encountered an accessibility related action on the specified...
void DispatchPlatformMessage(std::unique_ptr< PlatformMessage > message)
Notifies the PlatformConfiguration that the client has sent it a message. This call originates in the...
bool SendFocusEvent(const ViewFocusEvent &event)
Notify the isolate that the focus state of a native view has changed.
PlatformConfiguration(PlatformConfigurationClient *client)
Creates a new PlatformConfiguration, typically created by the RuntimeController.
void UpdateSemanticsEnabled(bool enabled)
Notifies the PlatformConfiguration that the embedder has expressed an opinion about whether the acces...
void ReportTimings(std::vector< int64_t > timings)
Dart code cannot fully measure the time it takes for a specific frame to be rendered....
bool AddView(int64_t view_id, const ViewportMetrics &view_metrics)
Notify the framework that a new view is available.
void UpdateInitialLifecycleState(const std::string &data)
Updates the lifecycle state data in the framework.
void UpdateDisplays(const std::vector< DisplayData > &displays)
Update the specified display data in the framework.
void UpdateLocales(const std::vector< std::string > &locales)
Update the specified locale data in the framework.
bool RemoveView(int64_t view_id)
Notify the framework that a view is no longer available.
void BeginFrame(fml::TimePoint frame_time, uint64_t frame_number)
Notifies the framework that it is time to begin working on a new frame previously scheduled via a cal...
void CompletePlatformMessageEmptyResponse(int response_id)
Responds to a previous platform message to the engine from the framework with an empty response.
const ViewportMetrics * GetMetrics(int view_id)
Retrieves the viewport metrics with the given ID managed by the PlatformConfiguration.
bool UpdateViewMetrics(int64_t view_id, const ViewportMetrics &metrics)
Update the view metrics for the specified view.
PlatformConfigurationClient * client() const
Access to the platform configuration client (which typically is implemented by the RuntimeController)...
void UpdateUserSettingsData(const std::string &data)
Update the user settings data in the framework.
static void UpdateSemantics(int64_t viewId, SemanticsUpdate *update)
static void SendChannelUpdate(const std::string &name, bool listening)
static void Render(int64_t view_id, Scene *scene, double width, double height)
static Dart_Handle SendPortPlatformMessage(const std::string &name, Dart_Handle identifier, Dart_Handle send_port, Dart_Handle data_handle)
static void SetApplicationLocale(std::string locale)
static double GetScaledFontSize(double unscaled_font_size, int configuration_id)
static void RequestViewFocusChange(int64_t view_id, int64_t state, int64_t direction)
static int RequestDartPerformanceMode(int mode)
Requests the Dart VM to adjusts the GC heuristics based on the requested performance_mode....
static Dart_PerformanceMode GetDartPerformanceMode()
Returns the current performance mode of the Dart VM. Defaults to Dart_PerformanceMode_Default if no p...
static Dart_Handle ComputePlatformResolvedLocale(Dart_Handle supportedLocalesHandle)
static void RegisterBackgroundIsolate(int64_t root_isolate_token)
static Dart_Handle SendPlatformMessage(const std::string &name, Dart_Handle callback, Dart_Handle data_handle)
static void RespondToPlatformMessage(int response_id, const tonic::DartByteData &data)
static void SetIsolateDebugName(const std::string &name)
const std::vector< uint8_t > & data() const
fml::RefPtr< fml::TaskRunner > GetUITaskRunner() const
PlatformConfiguration * platform_configuration() const
bool IsRootIsolate() const
const TaskRunners & GetTaskRunners() const
void SetDebugName(const std::string &name)
int64_t GetRootIsolateToken() const
void SetPlatformMessageHandler(std::weak_ptr< PlatformMessageHandler > handler)
static UIDartState * Current()
static void ThrowIfUIOperationsProhibited()
Dart_Handle HandlePlatformMessage(std::unique_ptr< PlatformMessage > message)
A Mapping like NonOwnedMapping, but uses Free as its release proc.
Definition mapping.h:144
static MallocMapping Copy(const T *begin, const T *end)
Definition mapping.h:162
constexpr int64_t ToMicroseconds() const
Definition time_delta.h:62
constexpr TimeDelta ToEpochDelta() const
Definition time_point.h:52
static Dart_Handle Create(const void *data, size_t length)
void Set(DartState *dart_state, Dart_Handle value)
const std::weak_ptr< DartState > & dart_state() const
static DartState * Current()
Definition dart_state.cc:56
int32_t value
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS GBytes * message
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
#define FML_DLOG(severity)
Definition logging.h:121
#define FML_LOG(severity)
Definition logging.h:101
#define FML_CHECK(condition)
Definition logging.h:104
#define FML_DCHECK(condition)
Definition logging.h:122
constexpr int64_t kFlutterImplicitViewId
Definition constants.h:35
DEF_SWITCHES_START aot vmservice shared library name
Definition switch_defs.h:27
ViewFocusDirection
Definition view_focus.h:22
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36
it will be possible to load the file into Perfetto s trace viewer use test Running tests that layout and measure text will not yield consistent results across various platforms Enabling this option will make font resolution default to the Ahem test font on all disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir Path to the cache directory This is different from the persistent_cache_path in embedder which is used for Skia shader cache icu native lib Path to the library file that exports the ICU data vm service The hostname IP address on which the Dart VM Service should be served If not defaults to or::depending on whether ipv6 is specified disable vm Disable the Dart VM Service The Dart VM Service is never available in release mode Bind to the IPv6 localhost address for the Dart VM Service Ignored if vm service host is set profile Make the profiler discard new samples once the profiler sample buffer is full When this flag is not the profiler sample buffer is used as a ring buffer
Definition switch_defs.h:98
Dart_Handle ToDart(const T &object)
Dart_Handle DartInvoke(Dart_Handle closure, std::initializer_list< Dart_Handle > args)
Dart_Handle DartInvokeVoid(Dart_Handle closure)
bool CheckAndHandleError(Dart_Handle handle)
Definition dart_error.cc:33
std::vector< FlutterEngineDisplay > * displays
int32_t height
int32_t width