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")));
82 dispatch_semantics_action_.
Set(
84 Dart_GetField(library,
tonic::ToDart(
"_dispatchSemanticsAction")));
95 auto [view_iterator, insertion_happened] =
96 metrics_.emplace(
view_id, view_metrics);
97 if (!insertion_happened) {
102 std::shared_ptr<tonic::DartState> dart_state = add_view_.
dart_state().lock();
110 tonic::ToDart(view_id),
111 tonic::ToDart(view_metrics.device_pixel_ratio),
112 tonic::ToDart(view_metrics.physical_width),
113 tonic::ToDart(view_metrics.physical_height),
114 tonic::ToDart(view_metrics.physical_padding_top),
115 tonic::ToDart(view_metrics.physical_padding_right),
116 tonic::ToDart(view_metrics.physical_padding_bottom),
117 tonic::ToDart(view_metrics.physical_padding_left),
118 tonic::ToDart(view_metrics.physical_view_inset_top),
119 tonic::ToDart(view_metrics.physical_view_inset_right),
120 tonic::ToDart(view_metrics.physical_view_inset_bottom),
121 tonic::ToDart(view_metrics.physical_view_inset_left),
122 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
123 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
124 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
125 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
126 tonic::ToDart(view_metrics.physical_touch_slop),
127 tonic::ToDart(view_metrics.physical_display_features_bounds),
128 tonic::ToDart(view_metrics.physical_display_features_type),
129 tonic::ToDart(view_metrics.physical_display_features_state),
130 tonic::ToDart(view_metrics.display_id),
131 tonic::ToDart(view_metrics.physical_min_width_constraint),
132 tonic::ToDart(view_metrics.physical_max_width_constraint),
133 tonic::ToDart(view_metrics.physical_min_height_constraint),
134 tonic::ToDart(view_metrics.physical_max_height_constraint),
135 tonic::ToDart(view_metrics.physical_display_corner_radius_top_left),
136 tonic::ToDart(view_metrics.physical_display_corner_radius_top_right),
138 view_metrics.physical_display_corner_radius_bottom_right),
140 view_metrics.physical_display_corner_radius_bottom_left),
147 FML_LOG(FATAL) <<
"The implicit view #" <<
view_id <<
" cannot be removed.";
150 size_t erased_elements = metrics_.erase(
view_id);
151 if (erased_elements == 0) {
156 std::shared_ptr<tonic::DartState> dart_state =
164 tonic::ToDart(view_id),
170 std::shared_ptr<tonic::DartState> dart_state =
177 send_view_focus_event_.
Get(), {
178 tonic::ToDart(event.view_id()),
179 tonic::ToDart(event.state()),
180 tonic::ToDart(event.direction()),
186 std::shared_ptr<tonic::DartState> dart_state =
194 tonic::ToDart(engine_id),
202 auto found_iter = metrics_.find(
view_id);
203 if (found_iter == metrics_.end()) {
207 found_iter->second = view_metrics;
209 std::shared_ptr<tonic::DartState> dart_state =
216 update_window_metrics_.
Get(),
218 tonic::ToDart(view_id),
219 tonic::ToDart(view_metrics.device_pixel_ratio),
220 tonic::ToDart(view_metrics.physical_width),
221 tonic::ToDart(view_metrics.physical_height),
222 tonic::ToDart(view_metrics.physical_padding_top),
223 tonic::ToDart(view_metrics.physical_padding_right),
224 tonic::ToDart(view_metrics.physical_padding_bottom),
225 tonic::ToDart(view_metrics.physical_padding_left),
226 tonic::ToDart(view_metrics.physical_view_inset_top),
227 tonic::ToDart(view_metrics.physical_view_inset_right),
228 tonic::ToDart(view_metrics.physical_view_inset_bottom),
229 tonic::ToDart(view_metrics.physical_view_inset_left),
230 tonic::ToDart(view_metrics.physical_system_gesture_inset_top),
231 tonic::ToDart(view_metrics.physical_system_gesture_inset_right),
232 tonic::ToDart(view_metrics.physical_system_gesture_inset_bottom),
233 tonic::ToDart(view_metrics.physical_system_gesture_inset_left),
234 tonic::ToDart(view_metrics.physical_touch_slop),
235 tonic::ToDart(view_metrics.physical_display_features_bounds),
236 tonic::ToDart(view_metrics.physical_display_features_type),
237 tonic::ToDart(view_metrics.physical_display_features_state),
238 tonic::ToDart(view_metrics.display_id),
239 tonic::ToDart(view_metrics.physical_min_width_constraint),
240 tonic::ToDart(view_metrics.physical_max_width_constraint),
241 tonic::ToDart(view_metrics.physical_min_height_constraint),
242 tonic::ToDart(view_metrics.physical_max_height_constraint),
243 tonic::ToDart(view_metrics.physical_display_corner_radius_top_left),
244 tonic::ToDart(view_metrics.physical_display_corner_radius_top_right),
246 view_metrics.physical_display_corner_radius_bottom_right),
248 view_metrics.physical_display_corner_radius_bottom_left),
254 const std::vector<DisplayData>&
displays) {
255 std::vector<DisplayId> ids;
256 std::vector<double> widths;
257 std::vector<double> heights;
258 std::vector<double> device_pixel_ratios;
259 std::vector<double> refresh_rates;
260 for (
const auto& display :
displays) {
261 ids.push_back(display.id);
262 widths.push_back(display.width);
263 heights.push_back(display.height);
264 device_pixel_ratios.push_back(display.pixel_ratio);
265 refresh_rates.push_back(display.refresh_rate);
267 std::shared_ptr<tonic::DartState> dart_state =
274 update_displays_.
Get(),
276 tonic::ToDart<std::vector<DisplayId>>(ids),
277 tonic::ToDart<std::vector<double>>(widths),
278 tonic::ToDart<std::vector<double>>(heights),
279 tonic::ToDart<std::vector<double>>(device_pixel_ratios),
280 tonic::ToDart<std::vector<double>>(refresh_rates),
285 const std::vector<std::string>& locales) {
286 std::shared_ptr<tonic::DartState> dart_state =
296 tonic::ToDart<std::vector<std::string>>(locales),
301 std::shared_ptr<tonic::DartState> dart_state =
302 update_user_settings_data_.
dart_state().lock();
310 tonic::StdStringToDart(data),
315 const std::string&
data) {
316 std::shared_ptr<tonic::DartState> dart_state =
317 update_initial_lifecycle_state_.
dart_state().lock();
323 update_initial_lifecycle_state_.
Get(), {
324 tonic::StdStringToDart(data),
329 std::shared_ptr<tonic::DartState> dart_state =
330 update_semantics_enabled_.
dart_state().lock();
338 {tonic::ToDart(enabled)}));
342 std::shared_ptr<tonic::DartState> dart_state =
343 update_accessibility_features_.
dart_state().lock();
350 update_accessibility_features_.
Get(), {tonic::ToDart(values)}));
354 std::unique_ptr<PlatformMessage>
message) {
355 std::shared_ptr<tonic::DartState> dart_state =
356 dispatch_platform_message_.
dart_state().lock();
359 <<
"Dropping platform message for lack of DartState on channel: "
364 Dart_Handle data_handle =
366 if (Dart_IsError(data_handle)) {
368 <<
"Dropping platform message because of a Dart error on channel: "
374 if (
auto response =
message->response()) {
375 response_id = next_response_id_++;
376 pending_responses_[response_id] = response;
381 {tonic::ToDart(message->channel()), data_handle,
382 tonic::ToDart(response_id)}));
387 std::shared_ptr<tonic::DartState> dart_state =
388 dispatch_pointer_data_packet_.
dart_state().lock();
394 const std::vector<uint8_t>&
buffer = packet.
data();
395 Dart_Handle data_handle =
397 if (Dart_IsError(data_handle)) {
408 std::shared_ptr<tonic::DartState> dart_state = hit_test_.
dart_state().lock();
410 return {.has_platform_view =
false};
415 hit_test_.
Get(), {tonic::ToDart(view_id), tonic::ToDart(offset.x),
416 tonic::ToDart(offset.y)});
418 return {.has_platform_view =
false};
421 Dart_Handle has_platform_view_handle =
422 Dart_GetField(dart_result,
tonic::ToDart(
"hasPlatformView"));
424 return {.has_platform_view =
false};
426 return {.has_platform_view =
434 std::shared_ptr<tonic::DartState> dart_state =
435 dispatch_semantics_action_.
dart_state().lock();
441 Dart_Handle args_handle =
442 (
args.GetSize() <= 0) ? Dart_Null() : ToByteData(
args);
444 if (Dart_IsError(args_handle)) {
449 dispatch_semantics_action_.
Get(),
450 {tonic::ToDart(view_id), tonic::ToDart(node_id),
451 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
455 uint64_t frame_number) {
456 std::shared_ptr<tonic::DartState> dart_state =
463 if (last_frame_number_ > frame_number) {
464 FML_LOG(ERROR) <<
"Frame number is out of order: " << frame_number <<
" < "
465 << last_frame_number_;
467 last_frame_number_ = frame_number;
472 if (last_microseconds_ > microseconds) {
476 <<
"Reported frame time is older than the last one; clamping. "
477 << microseconds <<
" < " << last_microseconds_
478 <<
" ~= " << last_microseconds_ - microseconds;
479 microseconds = last_microseconds_;
481 last_microseconds_ = microseconds;
485 Dart_NewInteger(microseconds),
486 Dart_NewInteger(frame_number),
495 std::shared_ptr<tonic::DartState> dart_state =
502 Dart_Handle data_handle =
503 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
505 Dart_TypedData_Type
type;
506 void*
data =
nullptr;
507 intptr_t num_acquired = 0;
509 Dart_TypedDataAcquireData(data_handle, &
type, &
data, &num_acquired)));
510 FML_DCHECK(num_acquired ==
static_cast<int>(timings.size()));
512 memcpy(
data, timings.data(),
sizeof(int64_t) * timings.size());
513 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
522 auto found = metrics_.find(
view_id);
523 if (found != metrics_.end()) {
524 return &found->second;
535 auto it = pending_responses_.find(response_id);
536 if (it == pending_responses_.end()) {
539 auto response = std::move(it->second);
540 pending_responses_.erase(it);
541 response->CompleteEmpty();
546 std::vector<uint8_t>
data) {
550 auto it = pending_responses_.find(response_id);
551 if (it == pending_responses_.end()) {
554 auto response = std::move(it->second);
555 pending_responses_.erase(it);
556 response->Complete(std::make_unique<fml::DataMapping>(std::move(
data)));
577Dart_Handle HandlePlatformMessage(
579 const std::string&
name,
580 Dart_Handle data_handle,
582 if (Dart_IsNull(data_handle)) {
584 std::make_unique<PlatformMessage>(
name, response));
587 const uint8_t* buffer =
static_cast<const uint8_t*
>(
data.data());
596 const std::string&
name,
598 Dart_Handle data_handle) {
603 "SendPlatformMessage only works on the root isolate, see "
604 "SendPortPlatformMessage.");
609 response = fml::MakeRefCounted<PlatformMessageResponseDart>(
614 return HandlePlatformMessage(dart_state,
name, data_handle, response);
618 const std::string&
name,
619 Dart_Handle identifier,
620 Dart_Handle send_port,
621 Dart_Handle data_handle) {
626 if (c_send_port == ILLEGAL_PORT) {
631 fml::MakeRefCounted<PlatformMessageResponseDartPort>(
635 return HandlePlatformMessage(dart_state,
name, data_handle, response);
652 if (Dart_IsNull(
data.dart_handle())) {
658 const uint8_t*
buffer =
static_cast<const uint8_t*
>(
data.data());
668 const std::string&
name) {
673Dart_PerformanceMode PlatformConfigurationNativeApi::current_performance_mode_ =
674 Dart_PerformanceMode_Default;
677 return current_performance_mode_;
682 current_performance_mode_ =
static_cast<Dart_PerformanceMode
>(
mode);
683 return Dart_SetPerformanceMode(current_performance_mode_);
694 if (!persistent_isolate_data) {
699 persistent_isolate_data->GetSize());
736 Dart_Handle supportedLocalesHandle) {
738 std::vector<std::string> supportedLocales =
740 supportedLocalesHandle);
742 std::vector<std::string> results =
766 int64_t root_isolate_token) {
769 auto platform_message_handler =
770 (*
static_cast<std::shared_ptr<PlatformMessageHandlerStorage>*
>(
771 Dart_CurrentIsolateGroupData()));
773 auto weak_platform_message_handler =
774 platform_message_handler->GetPlatformMessageHandler(root_isolate_token);
785 double unscaled_font_size,
786 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)
impeller::ShaderType type