diff --git a/base/BUILD.gn b/base/BUILD.gn index 2190bece686aa..0267875df233a 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn @@ -1938,6 +1938,7 @@ mixed_component("base") { # by public //base headers, which requires they be on the include path. # TODO(https://crbug.com/841171): Move these back to |deps|. public_deps += [ + "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.component.runner", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.intl", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.io", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.logger", diff --git a/base/fuchsia/startup_context.cc b/base/fuchsia/startup_context.cc index 8019b361a325c..e93634c29c557 100644 --- a/base/fuchsia/startup_context.cc +++ b/base/fuchsia/startup_context.cc @@ -5,11 +5,13 @@ #include "base/fuchsia/startup_context.h" #include <tuple> +#include <utility> #include <fuchsia/io/cpp/fidl.h> #include <lib/sys/cpp/outgoing_directory.h> #include <lib/sys/cpp/service_directory.h> +#include "base/check.h" #include "base/check_op.h" #include "base/fuchsia/file_utils.h" #include "base/fuchsia/fuchsia_logging.h" @@ -17,6 +19,36 @@ namespace base { +StartupContext::StartupContext( + fuchsia::component::runner::ComponentStartInfo start_info) { + std::unique_ptr<sys::ServiceDirectory> incoming_services; + + // Component manager generates |flat_namespace|, so things are horribly broken + // if |flat_namespace| is malformed. + CHECK(start_info.has_ns()); + + // Find the /svc directory and wrap it into a sys::ServiceDirectory. + auto& namespace_entries = *start_info.mutable_ns(); + for (auto& entry : namespace_entries) { + CHECK(entry.has_path() && entry.has_directory()); + if (entry.path() == kServiceDirectoryPath) { + incoming_services = std::make_unique<sys::ServiceDirectory>( + std::move(*entry.mutable_directory())); + break; + } + } + + // If there is no service-directory in the namespace then `incoming_services` + // may be null, in which case `svc()` will be null. + component_context_ = + std::make_unique<sys::ComponentContext>(std::move(incoming_services)); + if (start_info.has_outgoing_dir()) { + outgoing_directory_request_ = std::move(*start_info.mutable_outgoing_dir()); + } +} + +StartupContext::~StartupContext() = default; + StartupContext::StartupContext(fuchsia::sys::StartupInfo startup_info) { std::unique_ptr<sys::ServiceDirectory> incoming_services; @@ -34,51 +66,6 @@ StartupContext::StartupContext(fuchsia::sys::StartupInfo startup_info) { } } - // TODO(https://crbug.com/933834): Remove these workarounds when we migrate to - // the new component manager. - if (!incoming_services && startup_info.launch_info.flat_namespace) { - LOG(WARNING) << "Falling back to LaunchInfo namespace"; - for (size_t i = 0; - i < startup_info.launch_info.flat_namespace->paths.size(); ++i) { - if (startup_info.launch_info.flat_namespace->paths[i] == - kServiceDirectoryPath) { - incoming_services = std::make_unique<sys::ServiceDirectory>( - std::move(startup_info.launch_info.flat_namespace->directories[i])); - break; - } - } - } - - if (!incoming_services && startup_info.launch_info.additional_services) { - LOG(WARNING) << "Falling back to additional ServiceList services"; - - // Construct a OutgoingDirectory and publish the additional services into - // it. - additional_services_.Bind( - std::move(startup_info.launch_info.additional_services->provider)); - additional_services_directory_ = std::make_unique<sys::OutgoingDirectory>(); - for (auto& name : startup_info.launch_info.additional_services->names) { - zx_status_t status = additional_services_directory_->AddPublicService( - std::make_unique<vfs::Service>([this, name]( - zx::channel channel, - async_dispatcher_t* dispatcher) { - additional_services_->ConnectToService(name, std::move(channel)); - }), - name); - ZX_CHECK(status == ZX_OK, status) - << "AddPublicService(" << name << ") failed"; - } - - // Publish those services to the caller as |incoming_services|. - fidl::InterfaceHandle<fuchsia::io::Directory> incoming_directory; - additional_services_directory_->GetOrCreateDirectory("svc")->Serve( - fuchsia::io::OpenFlags::RIGHT_READABLE | - fuchsia::io::OpenFlags::RIGHT_WRITABLE, - incoming_directory.NewRequest().TakeChannel()); - incoming_services = - std::make_unique<sys::ServiceDirectory>(std::move(incoming_directory)); - } - if (!incoming_services) { LOG(WARNING) << "Component started without a service directory"; @@ -96,8 +83,6 @@ StartupContext::StartupContext(fuchsia::sys::StartupInfo startup_info) { std::move(startup_info.launch_info.directory_request); } -StartupContext::~StartupContext() = default; - void StartupContext::ServeOutgoingDirectory() { DCHECK(outgoing_directory_request_); component_context_->outgoing()->Serve(std::move(outgoing_directory_request_)); diff --git a/base/fuchsia/startup_context.h b/base/fuchsia/startup_context.h index 263342b18a958..44c7236de5284 100644 --- a/base/fuchsia/startup_context.h +++ b/base/fuchsia/startup_context.h @@ -5,15 +5,17 @@ #ifndef BASE_FUCHSIA_STARTUP_CONTEXT_H_ #define BASE_FUCHSIA_STARTUP_CONTEXT_H_ +#include <fuchsia/component/runner/cpp/fidl.h> +#include <fuchsia/io/cpp/fidl.h> #include <fuchsia/sys/cpp/fidl.h> #include <lib/sys/cpp/component_context.h> #include <lib/zx/channel.h> + #include <memory> #include "base/base_export.h" namespace sys { -class ComponentContext; class ServiceDirectory; class OutgoingDirectory; } // namespace sys @@ -25,10 +27,15 @@ namespace base { // directories, resolve launch URL etc). // Embedders may derived from StartupContext to e.g. add bound pointers to // embedder-specific services, as required. -class BASE_EXPORT StartupContext { +class BASE_EXPORT StartupContext final { public: + explicit StartupContext( + ::fuchsia::component::runner::ComponentStartInfo start_info); + ~StartupContext(); + + // TODO(https://crbug.com/1065707): Remove this overload once the CFv1 + // Runner implementations are removed. explicit StartupContext(::fuchsia::sys::StartupInfo startup_info); - virtual ~StartupContext(); StartupContext(const StartupContext&) = delete; StartupContext& operator=(const StartupContext&) = delete; @@ -56,11 +63,6 @@ class BASE_EXPORT StartupContext { } private: - // TODO(https://crbug.com/933834): Remove these when we migrate to the new - // component manager APIs. - ::fuchsia::sys::ServiceProviderPtr additional_services_; - std::unique_ptr<sys::OutgoingDirectory> additional_services_directory_; - std::unique_ptr<sys::ComponentContext> component_context_; // Used to store outgoing directory until ServeOutgoingDirectory() is called.