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 5 #ifndef FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_ 6 #define FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_ 7 8 #include <array> 9 #include <memory> 10 #include <set> 11 12 #include <fuchsia/io/cpp/fidl.h> 13 #include <fuchsia/sys/cpp/fidl.h> 14 #include <fuchsia/ui/app/cpp/fidl.h> 15 #include <lib/async-loop/cpp/loop.h> 16 #include <lib/async/default.h> 17 #include <lib/fidl/cpp/binding_set.h> 18 #include <lib/fidl/cpp/interface_request.h> 19 #include <lib/fit/function.h> 20 #include <lib/sys/cpp/service_directory.h> 21 #include <lib/vfs/cpp/pseudo_dir.h> 22 #include <lib/zx/eventpair.h> 23 24 #include "engine.h" 25 #include "flutter/common/settings.h" 26 #include "flutter/fml/macros.h" 27 28 #include "thread.h" 29 #include "unique_fdio_ns.h" 30 31 namespace flutter_runner { 32 33 // Represents an instance of a Flutter application that contains one of more 34 // Flutter engine instances. 35 class Application final : public Engine::Delegate, 36 public fuchsia::sys::ComponentController, 37 public fuchsia::ui::app::ViewProvider { 38 public: 39 using TerminationCallback = fit::function<void(const Application*)>; 40 41 // Creates a dedicated thread to run the application and constructions the 42 // application on it. The application can be accessed only on this thread. 43 // This is a synchronous operation. 44 static std::pair<std::unique_ptr<Thread>, std::unique_ptr<Application>> 45 Create(TerminationCallback termination_callback, 46 fuchsia::sys::Package package, 47 fuchsia::sys::StartupInfo startup_info, 48 std::shared_ptr<sys::ServiceDirectory> runner_incoming_services, 49 fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller); 50 51 // Must be called on the same thread returned from the create call. The thread 52 // may be collected after. 53 ~Application(); 54 55 const std::string& GetDebugLabel() const; 56 57 #if !defined(DART_PRODUCT) 58 void WriteProfileToTrace() const; 59 #endif // !defined(DART_PRODUCT) 60 61 private: 62 flutter::Settings settings_; 63 TerminationCallback termination_callback_; 64 const std::string debug_label_; 65 UniqueFDIONS fdio_ns_ = UniqueFDIONSCreate(); 66 fml::UniqueFD application_directory_; 67 fml::UniqueFD application_assets_directory_; 68 69 fidl::Binding<fuchsia::sys::ComponentController> application_controller_; 70 fuchsia::io::DirectoryPtr directory_ptr_; 71 fuchsia::io::NodePtr cloned_directory_ptr_; 72 fidl::InterfaceRequest<fuchsia::io::Directory> directory_request_; 73 std::unique_ptr<vfs::PseudoDir> outgoing_dir_; 74 std::shared_ptr<sys::ServiceDirectory> svc_; 75 std::shared_ptr<sys::ServiceDirectory> runner_incoming_services_; 76 fidl::BindingSet<fuchsia::ui::app::ViewProvider> shells_bindings_; 77 78 fml::RefPtr<flutter::DartSnapshot> isolate_snapshot_; 79 fml::RefPtr<flutter::DartSnapshot> shared_snapshot_; 80 std::set<std::unique_ptr<Engine>> shell_holders_; 81 std::pair<bool, uint32_t> last_return_code_; 82 fml::WeakPtrFactory<Application> weak_factory_; 83 84 Application( 85 TerminationCallback termination_callback, 86 fuchsia::sys::Package package, 87 fuchsia::sys::StartupInfo startup_info, 88 std::shared_ptr<sys::ServiceDirectory> runner_incoming_services, 89 fidl::InterfaceRequest<fuchsia::sys::ComponentController> controller); 90 91 // |fuchsia::sys::ComponentController| 92 void Kill() override; 93 94 // |fuchsia::sys::ComponentController| 95 void Detach() override; 96 97 // |fuchsia::ui::app::ViewProvider| 98 void CreateView( 99 zx::eventpair view_token, 100 fidl::InterfaceRequest<fuchsia::sys::ServiceProvider> incoming_services, 101 fidl::InterfaceHandle<fuchsia::sys::ServiceProvider> outgoing_services) 102 override; 103 104 // |flutter::Engine::Delegate| 105 void OnEngineTerminate(const Engine* holder) override; 106 107 void AttemptVMLaunchWithCurrentSettings(const flutter::Settings& settings); 108 109 FML_DISALLOW_COPY_AND_ASSIGN(Application); 110 }; 111 112 } // namespace flutter_runner 113 114 #endif // FLUTTER_SHELL_PLATFORM_FUCHSIA_COMPONENT_H_ 115