Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
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")));
81 Dart_GetField(library, tonic::ToDart("_hitTest")));
82 dispatch_semantics_action_.Set(
84 Dart_GetField(library, tonic::ToDart("_dispatchSemanticsAction")));
85 begin_frame_.Set(tonic::DartState::Current(),
86 Dart_GetField(library, tonic::ToDart("_beginFrame")));
87 draw_frame_.Set(tonic::DartState::Current(),
88 Dart_GetField(library, tonic::ToDart("_drawFrame")));
89 report_timings_.Set(tonic::DartState::Current(),
90 Dart_GetField(library, tonic::ToDart("_reportTimings")));
91}
92
94 const ViewportMetrics& view_metrics) {
95 auto [view_iterator, insertion_happened] =
96 metrics_.emplace(view_id, view_metrics);
97 if (!insertion_happened) {
98 FML_LOG(ERROR) << "View #" << view_id << " already exists.";
99 return false;
100 }
101
102 std::shared_ptr<tonic::DartState> dart_state = add_view_.dart_state().lock();
103 if (!dart_state) {
104 return false;
105 }
106 tonic::DartState::Scope scope(dart_state);
108 add_view_.Get(),
109 {
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),
137 tonic::ToDart(
138 view_metrics.physical_display_corner_radius_bottom_right),
139 tonic::ToDart(
140 view_metrics.physical_display_corner_radius_bottom_left),
141 }));
142 return true;
143}
144
147 FML_LOG(FATAL) << "The implicit view #" << view_id << " cannot be removed.";
148 return false;
149 }
150 size_t erased_elements = metrics_.erase(view_id);
151 if (erased_elements == 0) {
152 FML_LOG(ERROR) << "View #" << view_id << " doesn't exist.";
153 return false;
154 }
155
156 std::shared_ptr<tonic::DartState> dart_state =
157 remove_view_.dart_state().lock();
158 if (!dart_state) {
159 return false;
160 }
161 tonic::DartState::Scope scope(dart_state);
163 tonic::DartInvoke(remove_view_.Get(), {
164 tonic::ToDart(view_id),
165 }));
166 return true;
167}
168
170 std::shared_ptr<tonic::DartState> dart_state =
171 remove_view_.dart_state().lock();
172 if (!dart_state) {
173 return false;
174 }
175 tonic::DartState::Scope scope(dart_state);
177 send_view_focus_event_.Get(), {
178 tonic::ToDart(event.view_id()),
179 tonic::ToDart(event.state()),
180 tonic::ToDart(event.direction()),
181 }));
182 return true;
183}
184
185bool PlatformConfiguration::SetEngineId(int64_t engine_id) {
186 std::shared_ptr<tonic::DartState> dart_state =
187 set_engine_id_.dart_state().lock();
188 if (!dart_state) {
189 return false;
190 }
191 tonic::DartState::Scope scope(dart_state);
193 tonic::DartInvoke(set_engine_id_.Get(), {
194 tonic::ToDart(engine_id),
195 }));
196 return true;
197}
198
200 int64_t view_id,
201 const ViewportMetrics& view_metrics) {
202 auto found_iter = metrics_.find(view_id);
203 if (found_iter == metrics_.end()) {
204 return false;
205 }
206
207 found_iter->second = view_metrics;
208
209 std::shared_ptr<tonic::DartState> dart_state =
210 update_window_metrics_.dart_state().lock();
211 if (!dart_state) {
212 return false;
213 }
214 tonic::DartState::Scope scope(dart_state);
216 update_window_metrics_.Get(),
217 {
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),
245 tonic::ToDart(
246 view_metrics.physical_display_corner_radius_bottom_right),
247 tonic::ToDart(
248 view_metrics.physical_display_corner_radius_bottom_left),
249 }));
250 return true;
251}
252
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);
266 }
267 std::shared_ptr<tonic::DartState> dart_state =
268 update_displays_.dart_state().lock();
269 if (!dart_state) {
270 return;
271 }
272 tonic::DartState::Scope scope(dart_state);
274 update_displays_.Get(),
275 {
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),
281 }));
282}
283
285 const std::vector<std::string>& locales) {
286 std::shared_ptr<tonic::DartState> dart_state =
287 update_locales_.dart_state().lock();
288 if (!dart_state) {
289 return;
290 }
291
292 tonic::DartState::Scope scope(dart_state);
294 tonic::DartInvoke(update_locales_.Get(),
295 {
296 tonic::ToDart<std::vector<std::string>>(locales),
297 }));
298}
299
301 std::shared_ptr<tonic::DartState> dart_state =
302 update_user_settings_data_.dart_state().lock();
303 if (!dart_state) {
304 return;
305 }
306 tonic::DartState::Scope scope(dart_state);
307
308 tonic::CheckAndHandleError(tonic::DartInvoke(update_user_settings_data_.Get(),
309 {
310 tonic::StdStringToDart(data),
311 }));
312}
313
315 const std::string& data) {
316 std::shared_ptr<tonic::DartState> dart_state =
317 update_initial_lifecycle_state_.dart_state().lock();
318 if (!dart_state) {
319 return;
320 }
321 tonic::DartState::Scope scope(dart_state);
323 update_initial_lifecycle_state_.Get(), {
324 tonic::StdStringToDart(data),
325 }));
326}
327
329 std::shared_ptr<tonic::DartState> dart_state =
330 update_semantics_enabled_.dart_state().lock();
331 if (!dart_state) {
332 return;
333 }
334 tonic::DartState::Scope scope(dart_state);
336
337 tonic::CheckAndHandleError(tonic::DartInvoke(update_semantics_enabled_.Get(),
338 {tonic::ToDart(enabled)}));
339}
340
342 std::shared_ptr<tonic::DartState> dart_state =
343 update_accessibility_features_.dart_state().lock();
344 if (!dart_state) {
345 return;
346 }
347 tonic::DartState::Scope scope(dart_state);
348
350 update_accessibility_features_.Get(), {tonic::ToDart(values)}));
351}
352
354 std::unique_ptr<PlatformMessage> message) {
355 std::shared_ptr<tonic::DartState> dart_state =
356 dispatch_platform_message_.dart_state().lock();
357 if (!dart_state) {
358 FML_DLOG(WARNING)
359 << "Dropping platform message for lack of DartState on channel: "
360 << message->channel();
361 return;
362 }
363 tonic::DartState::Scope scope(dart_state);
364 Dart_Handle data_handle =
365 (message->hasData()) ? ToByteData(message->data()) : Dart_Null();
366 if (Dart_IsError(data_handle)) {
367 FML_DLOG(WARNING)
368 << "Dropping platform message because of a Dart error on channel: "
369 << message->channel();
370 return;
371 }
372
373 int response_id = 0;
374 if (auto response = message->response()) {
375 response_id = next_response_id_++;
376 pending_responses_[response_id] = response;
377 }
378
380 tonic::DartInvoke(dispatch_platform_message_.Get(),
381 {tonic::ToDart(message->channel()), data_handle,
382 tonic::ToDart(response_id)}));
383}
384
386 const PointerDataPacket& packet) {
387 std::shared_ptr<tonic::DartState> dart_state =
388 dispatch_pointer_data_packet_.dart_state().lock();
389 if (!dart_state) {
390 return;
391 }
392 tonic::DartState::Scope scope(dart_state);
393
394 const std::vector<uint8_t>& buffer = packet.data();
395 Dart_Handle data_handle =
397 if (Dart_IsError(data_handle)) {
398 return;
399 }
400
402 tonic::DartInvoke(dispatch_pointer_data_packet_.Get(), {data_handle}));
403}
404
406 int64_t view_id,
407 const flutter::PointData offset) {
408 std::shared_ptr<tonic::DartState> dart_state = hit_test_.dart_state().lock();
409 if (!dart_state) {
410 return {.has_platform_view = false};
411 }
412 tonic::DartState::Scope scope(dart_state);
413
414 Dart_Handle dart_result = tonic::DartInvoke(
415 hit_test_.Get(), {tonic::ToDart(view_id), tonic::ToDart(offset.x),
416 tonic::ToDart(offset.y)});
417 if (tonic::CheckAndHandleError(dart_result)) {
418 return {.has_platform_view = false};
419 }
420
421 Dart_Handle has_platform_view_handle =
422 Dart_GetField(dart_result, tonic::ToDart("hasPlatformView"));
423 if (tonic::CheckAndHandleError(has_platform_view_handle)) {
424 return {.has_platform_view = false};
425 }
426 return {.has_platform_view =
427 tonic::DartConverter<bool>::FromDart(has_platform_view_handle)};
428}
429
431 int32_t node_id,
434 std::shared_ptr<tonic::DartState> dart_state =
435 dispatch_semantics_action_.dart_state().lock();
436 if (!dart_state) {
437 return;
438 }
439 tonic::DartState::Scope scope(dart_state);
440
441 Dart_Handle args_handle =
442 (args.GetSize() <= 0) ? Dart_Null() : ToByteData(args);
443
444 if (Dart_IsError(args_handle)) {
445 return;
446 }
447
449 dispatch_semantics_action_.Get(),
450 {tonic::ToDart(view_id), tonic::ToDart(node_id),
451 tonic::ToDart(static_cast<int32_t>(action)), args_handle}));
452}
453
455 uint64_t frame_number) {
456 std::shared_ptr<tonic::DartState> dart_state =
457 begin_frame_.dart_state().lock();
458 if (!dart_state) {
459 return;
460 }
461 tonic::DartState::Scope scope(dart_state);
462
463 if (last_frame_number_ > frame_number) {
464 FML_LOG(ERROR) << "Frame number is out of order: " << frame_number << " < "
465 << last_frame_number_;
466 }
467 last_frame_number_ = frame_number;
468
469 // frameTime is not a delta; its the timestamp of the presentation.
470 // This is just a type conversion.
471 int64_t microseconds = frameTime.ToEpochDelta().ToMicroseconds();
472 if (last_microseconds_ > microseconds) {
473 // Do not allow time traveling frametimes
474 // github.com/flutter/flutter/issues/106277
475 FML_LOG(ERROR)
476 << "Reported frame time is older than the last one; clamping. "
477 << microseconds << " < " << last_microseconds_
478 << " ~= " << last_microseconds_ - microseconds;
479 microseconds = last_microseconds_;
480 }
481 last_microseconds_ = microseconds;
482
484 tonic::DartInvoke(begin_frame_.Get(), {
485 Dart_NewInteger(microseconds),
486 Dart_NewInteger(frame_number),
487 }));
488
490
492}
493
494void PlatformConfiguration::ReportTimings(std::vector<int64_t> timings) {
495 std::shared_ptr<tonic::DartState> dart_state =
496 report_timings_.dart_state().lock();
497 if (!dart_state) {
498 return;
499 }
500 tonic::DartState::Scope scope(dart_state);
501
502 Dart_Handle data_handle =
503 Dart_NewTypedData(Dart_TypedData_kInt64, timings.size());
504
505 Dart_TypedData_Type type;
506 void* data = nullptr;
507 intptr_t num_acquired = 0;
508 FML_CHECK(!Dart_IsError(
509 Dart_TypedDataAcquireData(data_handle, &type, &data, &num_acquired)));
510 FML_DCHECK(num_acquired == static_cast<int>(timings.size()));
511
512 memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
513 FML_CHECK(Dart_TypedDataReleaseData(data_handle));
514
516 tonic::DartInvoke(report_timings_.Get(), {
517 data_handle,
518 }));
519}
520
522 auto found = metrics_.find(view_id);
523 if (found != metrics_.end()) {
524 return &found->second;
525 } else {
526 return nullptr;
527 }
528}
529
531 int response_id) {
532 if (!response_id) {
533 return;
534 }
535 auto it = pending_responses_.find(response_id);
536 if (it == pending_responses_.end()) {
537 return;
538 }
539 auto response = std::move(it->second);
540 pending_responses_.erase(it);
541 response->CompleteEmpty();
542}
543
545 int response_id,
546 std::vector<uint8_t> data) {
547 if (!response_id) {
548 return;
549 }
550 auto it = pending_responses_.find(response_id);
551 if (it == pending_responses_.end()) {
552 return;
553 }
554 auto response = std::move(it->second);
555 pending_responses_.erase(it);
556 response->Complete(std::make_unique<fml::DataMapping>(std::move(data)));
557}
558
567
575
576namespace {
577Dart_Handle HandlePlatformMessage(
578 UIDartState* dart_state,
579 const std::string& name,
580 Dart_Handle data_handle,
581 const fml::RefPtr<PlatformMessageResponse>& response) {
582 if (Dart_IsNull(data_handle)) {
583 return dart_state->HandlePlatformMessage(
584 std::make_unique<PlatformMessage>(name, response));
585 } else {
586 tonic::DartByteData data(data_handle);
587 const uint8_t* buffer = static_cast<const uint8_t*>(data.data());
588 return dart_state->HandlePlatformMessage(std::make_unique<PlatformMessage>(
589 name, fml::MallocMapping::Copy(buffer, data.length_in_bytes()),
590 response));
591 }
592}
593} // namespace
594
596 const std::string& name,
597 Dart_Handle callback,
598 Dart_Handle data_handle) {
599 UIDartState* dart_state = UIDartState::Current();
600
601 if (!dart_state->platform_configuration()) {
602 return tonic::ToDart(
603 "SendPlatformMessage only works on the root isolate, see "
604 "SendPortPlatformMessage.");
605 }
606
608 if (!Dart_IsNull(callback)) {
609 response = fml::MakeRefCounted<PlatformMessageResponseDart>(
611 dart_state->GetTaskRunners().GetUITaskRunner(), name);
612 }
613
614 return HandlePlatformMessage(dart_state, name, data_handle, response);
615}
616
618 const std::string& name,
619 Dart_Handle identifier,
620 Dart_Handle send_port,
621 Dart_Handle data_handle) {
622 // This can be executed on any isolate.
623 UIDartState* dart_state = UIDartState::Current();
624
625 int64_t c_send_port = tonic::DartConverter<int64_t>::FromDart(send_port);
626 if (c_send_port == ILLEGAL_PORT) {
627 return tonic::ToDart("Invalid port specified");
628 }
629
631 fml::MakeRefCounted<PlatformMessageResponseDartPort>(
632 c_send_port, tonic::DartConverter<int64_t>::FromDart(identifier),
633 name);
634
635 return HandlePlatformMessage(dart_state, name, data_handle, response);
636}
637
639 int64_t state,
640 int64_t direction) {
642 static_cast<ViewFocusState>(state),
643 static_cast<ViewFocusDirection>(direction)};
644 UIDartState* dart_state = UIDartState::Current();
646 request);
647}
648
650 int response_id,
651 const tonic::DartByteData& data) {
652 if (Dart_IsNull(data.dart_handle())) {
656 } else {
657 // TODO(engine): Avoid this copy.
658 const uint8_t* buffer = static_cast<const uint8_t*>(data.data());
662 response_id,
663 std::vector<uint8_t>(buffer, buffer + data.length_in_bytes()));
664 }
665}
666
672
673Dart_PerformanceMode PlatformConfigurationNativeApi::current_performance_mode_ =
674 Dart_PerformanceMode_Default;
675
677 return current_performance_mode_;
678}
679
682 current_performance_mode_ = static_cast<Dart_PerformanceMode>(mode);
683 return Dart_SetPerformanceMode(current_performance_mode_);
684}
685
688
689 auto persistent_isolate_data = UIDartState::Current()
691 ->client()
693
694 if (!persistent_isolate_data) {
695 return Dart_Null();
696 }
697
698 return tonic::DartByteData::Create(persistent_isolate_data->GetMapping(),
699 persistent_isolate_data->GetSize());
700}
701
706
711
718
726
734
736 Dart_Handle supportedLocalesHandle) {
738 std::vector<std::string> supportedLocales =
740 supportedLocalesHandle);
741
742 std::vector<std::string> results =
745 ->client()
746 ->ComputePlatformResolvedLocale(supportedLocales);
747
748 return tonic::DartConverter<std::vector<std::string>>::ToDart(results);
749}
750
758
760 UIDartState* dart_state = UIDartState::Current();
761 FML_DCHECK(dart_state);
762 return dart_state->GetRootIsolateToken();
763}
764
766 int64_t root_isolate_token) {
767 UIDartState* dart_state = UIDartState::Current();
768 FML_DCHECK(dart_state && !dart_state->IsRootIsolate());
769 auto platform_message_handler =
770 (*static_cast<std::shared_ptr<PlatformMessageHandlerStorage>*>(
771 Dart_CurrentIsolateGroupData()));
772 FML_DCHECK(platform_message_handler);
773 auto weak_platform_message_handler =
774 platform_message_handler->GetPlatformMessageHandler(root_isolate_token);
775 dart_state->SetPlatformMessageHandler(weak_platform_message_handler);
776}
777
779 bool listening) {
781 name, listening);
782}
783
785 double unscaled_font_size,
786 int configuration_id) {
788 return UIDartState::Current()
790 ->client()
791 ->GetScaledFontSize(unscaled_font_size, configuration_id);
792}
793} // namespace flutter
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.
HitTestResponse HitTest(int64_t view_id, const flutter::PointData offset)
Requests to perform framework hit test from the engine.
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
const char * message
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
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
impeller::ShaderType type
int32_t height
int32_t width