41 Dart_Handle library = Dart_LookupLibrary(
tonic::ToDart(
"dart:ui"));
49 send_view_focus_event_.
Set(
51 Dart_GetField(library,
tonic::ToDart(
"_sendViewFocusEvent")));
54 update_window_metrics_.
Set(
56 Dart_GetField(library,
tonic::ToDart(
"_updateWindowMetrics")));
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")));
93 auto [view_iterator, insertion_happened] =
94 metrics_.emplace(
view_id, view_metrics);
95 if (!insertion_happened) {
100 std::shared_ptr<tonic::DartState> dart_state = add_view_.
dart_state().lock();
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 tonic::ToDart(view_metrics.physical_display_corner_radius_top_left),
134 tonic::ToDart(view_metrics.physical_display_corner_radius_top_right),
136 view_metrics.physical_display_corner_radius_bottom_right),
138 view_metrics.physical_display_corner_radius_bottom_left),
145 FML_LOG(FATAL) <<
"The implicit view #" <<
view_id <<
" cannot be removed.";
148 size_t erased_elements = metrics_.erase(
view_id);
149 if (erased_elements == 0) {
154 std::shared_ptr<tonic::DartState> dart_state =
162 tonic::ToDart(view_id),
168 std::shared_ptr<tonic::DartState> dart_state =
175 send_view_focus_event_.
Get(), {
176 tonic::ToDart(event.view_id()),
177 tonic::ToDart(event.state()),
178 tonic::ToDart(event.direction()),
184 std::shared_ptr<tonic::DartState> dart_state =
192 tonic::ToDart(engine_id),
200 auto found_iter = metrics_.find(
view_id);
201 if (found_iter == metrics_.end()) {
205 found_iter->second = view_metrics;
207 std::shared_ptr<tonic::DartState> dart_state =
214 update_window_metrics_.
Get(),
216 tonic::ToDart(view_id),
217 tonic::ToDart(view_metrics.device_pixel_ratio),
218 tonic::ToDart(view_metrics.physical_width),
219 tonic::ToDart(view_metrics.physical_height),
220 tonic::ToDart(view_metrics.physical_padding_top),
221 tonic::ToDart(view_metrics.physical_padding_right),
222 tonic::ToDart(view_metrics.physical_padding_bottom),
223 tonic::ToDart(view_metrics.physical_padding_left),
224 tonic::ToDart(view_metrics.physical_view_inset_top),
225 tonic::ToDart(view_metrics.physical_view_inset_right),
226 tonic::ToDart(view_metrics.physical_view_inset_bottom),
227 tonic::ToDart(view_metrics.physical_view_inset_left),
228 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
229 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
230 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
231 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
232 tonic::ToDart(view_metrics.physical_touch_slop),
233 tonic::ToDart(view_metrics.physical_display_features_bounds),
234 tonic::ToDart(view_metrics.physical_display_features_type),
235 tonic::ToDart(view_metrics.physical_display_features_state),
236 tonic::ToDart(view_metrics.display_id),
237 tonic::ToDart(view_metrics.physical_min_width_constraint),
238 tonic::ToDart(view_metrics.physical_max_width_constraint),
239 tonic::ToDart(view_metrics.physical_min_height_constraint),
240 tonic::ToDart(view_metrics.physical_max_height_constraint),
241 tonic::ToDart(view_metrics.physical_display_corner_radius_top_left),
242 tonic::ToDart(view_metrics.physical_display_corner_radius_top_right),
244 view_metrics.physical_display_corner_radius_bottom_right),
246 view_metrics.physical_display_corner_radius_bottom_left),
252 const std::vector<DisplayData>&
displays) {
253 std::vector<DisplayId> ids;
254 std::vector<double> widths;
255 std::vector<double> heights;
256 std::vector<double> device_pixel_ratios;
257 std::vector<double> refresh_rates;
258 for (
const auto& display :
displays) {
259 ids.push_back(display.id);
260 widths.push_back(display.width);
261 heights.push_back(display.height);
262 device_pixel_ratios.push_back(display.pixel_ratio);
263 refresh_rates.push_back(display.refresh_rate);
265 std::shared_ptr<tonic::DartState> dart_state =
272 update_displays_.
Get(),
274 tonic::ToDart<std::vector<DisplayId>>(ids),
275 tonic::ToDart<std::vector<double>>(widths),
276 tonic::ToDart<std::vector<double>>(heights),
277 tonic::ToDart<std::vector<double>>(device_pixel_ratios),
278 tonic::ToDart<std::vector<double>>(refresh_rates),
283 const std::vector<std::string>& locales) {
284 std::shared_ptr<tonic::DartState> dart_state =
294 tonic::ToDart<std::vector<std::string>>(locales),
299 std::shared_ptr<tonic::DartState> dart_state =
300 update_user_settings_data_.
dart_state().lock();
308 tonic::StdStringToDart(data),
313 const std::string&
data) {
314 std::shared_ptr<tonic::DartState> dart_state =
315 update_initial_lifecycle_state_.
dart_state().lock();
321 update_initial_lifecycle_state_.
Get(), {
322 tonic::StdStringToDart(data),
327 std::shared_ptr<tonic::DartState> dart_state =
328 update_semantics_enabled_.
dart_state().lock();
336 {tonic::ToDart(enabled)}));
340 std::shared_ptr<tonic::DartState> dart_state =
341 update_accessibility_features_.
dart_state().lock();
348 update_accessibility_features_.
Get(), {tonic::ToDart(values)}));
352 std::unique_ptr<PlatformMessage>
message) {
353 std::shared_ptr<tonic::DartState> dart_state =
354 dispatch_platform_message_.
dart_state().lock();
357 <<
"Dropping platform message for lack of DartState on channel: "
362 Dart_Handle data_handle =
364 if (Dart_IsError(data_handle)) {
366 <<
"Dropping platform message because of a Dart error on channel: "
372 if (
auto response =
message->response()) {
373 response_id = next_response_id_++;
374 pending_responses_[response_id] = response;
379 {tonic::ToDart(message->channel()), data_handle,
380 tonic::ToDart(response_id)}));
385 std::shared_ptr<tonic::DartState> dart_state =
386 dispatch_pointer_data_packet_.
dart_state().lock();
392 const std::vector<uint8_t>&
buffer = packet.
data();
393 Dart_Handle data_handle =
395 if (Dart_IsError(data_handle)) {
407 std::shared_ptr<tonic::DartState> dart_state =
408 dispatch_semantics_action_.
dart_state().lock();
414 Dart_Handle args_handle =
415 (
args.GetSize() <= 0) ? Dart_Null() : ToByteData(
args);
417 if (Dart_IsError(args_handle)) {
422 dispatch_semantics_action_.
Get(),
423 {tonic::ToDart(view_id), tonic::ToDart(node_id),
424 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
428 uint64_t frame_number) {
429 std::shared_ptr<tonic::DartState> dart_state =
436 if (last_frame_number_ > frame_number) {
437 FML_LOG(ERROR) <<
"Frame number is out of order: " << frame_number <<
" < "
438 << last_frame_number_;
440 last_frame_number_ = frame_number;
445 if (last_microseconds_ > microseconds) {
449 <<
"Reported frame time is older than the last one; clamping. "
450 << microseconds <<
" < " << last_microseconds_
451 <<
" ~= " << last_microseconds_ - microseconds;
452 microseconds = last_microseconds_;
454 last_microseconds_ = microseconds;
458 Dart_NewInteger(microseconds),
459 Dart_NewInteger(frame_number),
468 std::shared_ptr<tonic::DartState> dart_state =
475 Dart_Handle data_handle =
476 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
478 Dart_TypedData_Type
type;
479 void*
data =
nullptr;
480 intptr_t num_acquired = 0;
482 Dart_TypedDataAcquireData(data_handle, &
type, &
data, &num_acquired)));
483 FML_DCHECK(num_acquired ==
static_cast<int>(timings.size()));
485 memcpy(
data, timings.data(),
sizeof(int64_t) * timings.size());
486 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
495 auto found = metrics_.find(
view_id);
496 if (found != metrics_.end()) {
497 return &found->second;
508 auto it = pending_responses_.find(response_id);
509 if (it == pending_responses_.end()) {
512 auto response = std::move(it->second);
513 pending_responses_.erase(it);
514 response->CompleteEmpty();
519 std::vector<uint8_t>
data) {
523 auto it = pending_responses_.find(response_id);
524 if (it == pending_responses_.end()) {
527 auto response = std::move(it->second);
528 pending_responses_.erase(it);
529 response->Complete(std::make_unique<fml::DataMapping>(std::move(
data)));
550Dart_Handle HandlePlatformMessage(
552 const std::string&
name,
553 Dart_Handle data_handle,
555 if (Dart_IsNull(data_handle)) {
557 std::make_unique<PlatformMessage>(
name, response));
560 const uint8_t* buffer =
static_cast<const uint8_t*
>(
data.data());
569 const std::string&
name,
571 Dart_Handle data_handle) {
576 "SendPlatformMessage only works on the root isolate, see "
577 "SendPortPlatformMessage.");
582 response = fml::MakeRefCounted<PlatformMessageResponseDart>(
587 return HandlePlatformMessage(dart_state,
name, data_handle, response);
591 const std::string&
name,
592 Dart_Handle identifier,
593 Dart_Handle send_port,
594 Dart_Handle data_handle) {
599 if (c_send_port == ILLEGAL_PORT) {
604 fml::MakeRefCounted<PlatformMessageResponseDartPort>(
608 return HandlePlatformMessage(dart_state,
name, data_handle, response);
625 if (Dart_IsNull(
data.dart_handle())) {
631 const uint8_t*
buffer =
static_cast<const uint8_t*
>(
data.data());
641 const std::string&
name) {
646Dart_PerformanceMode PlatformConfigurationNativeApi::current_performance_mode_ =
647 Dart_PerformanceMode_Default;
650 return current_performance_mode_;
655 current_performance_mode_ =
static_cast<Dart_PerformanceMode
>(
mode);
656 return Dart_SetPerformanceMode(current_performance_mode_);
667 if (!persistent_isolate_data) {
672 persistent_isolate_data->GetSize());
709 Dart_Handle supportedLocalesHandle) {
711 std::vector<std::string> supportedLocales =
713 supportedLocalesHandle);
715 std::vector<std::string> results =
739 int64_t root_isolate_token) {
742 auto platform_message_handler =
743 (*
static_cast<std::shared_ptr<PlatformMessageHandlerStorage>*
>(
744 Dart_CurrentIsolateGroupData()));
746 auto weak_platform_message_handler =
747 platform_message_handler->GetPlatformMessageHandler(root_isolate_token);
758 double unscaled_font_size,
759 int configuration_id) {
const std::vector< uint8_t > & data() const
fml::RefPtr< fml::TaskRunner > GetUITaskRunner() const
PlatformConfiguration * platform_configuration() const
bool IsRootIsolate() const
void FlushMicrotasksNow()
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.
static MallocMapping Copy(const T *begin, const T *end)
constexpr int64_t ToMicroseconds() const
constexpr TimeDelta ToEpochDelta() const
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()
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
#define FML_DLOG(severity)
#define FML_LOG(severity)
#define FML_CHECK(condition)
#define FML_DCHECK(condition)
constexpr int64_t kFlutterImplicitViewId
DEF_SWITCHES_START aot vmservice shared library name
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
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
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)