| Index: content/common/service_manager/service_manager_connection_impl.cc
|
| diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc
|
| index 5549c63b8a726986bbd7161e11b17666f3e5b31b..9e81238aa0a4a53a53cbf5928388dcc0a9d1c9ec 100644
|
| --- a/content/common/service_manager/service_manager_connection_impl.cc
|
| +++ b/content/common/service_manager/service_manager_connection_impl.cc
|
| @@ -16,6 +16,7 @@
|
| #include "base/message_loop/message_loop.h"
|
| #include "base/threading/thread_checker.h"
|
| #include "base/threading/thread_task_runner_handle.h"
|
| +#include "content/common/child.mojom.h"
|
| #include "content/common/service_manager/embedded_service_runner.h"
|
| #include "content/public/common/connection_filter.h"
|
| #include "mojo/public/cpp/bindings/binding_set.h"
|
| @@ -43,12 +44,11 @@ ServiceManagerConnection::Factory* service_manager_connection_factory = nullptr;
|
| class ServiceManagerConnectionImpl::IOThreadContext
|
| : public base::RefCountedThreadSafe<IOThreadContext>,
|
| public service_manager::Service,
|
| - public service_manager::InterfaceFactory<
|
| - service_manager::mojom::ServiceFactory>,
|
| - public service_manager::mojom::ServiceFactory {
|
| + public service_manager::mojom::ServiceFactory,
|
| + public mojom::Child {
|
| public:
|
| using InitializeCallback =
|
| - base::Callback<void(const service_manager::Identity&)>;
|
| + base::Callback<void(const service_manager::ServiceInfo&)>;
|
|
|
| IOThreadContext(
|
| service_manager::mojom::ServiceRequest service_request,
|
| @@ -59,22 +59,22 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| io_task_runner_(io_task_runner),
|
| io_thread_connector_(std::move(io_thread_connector)),
|
| pending_connector_request_(std::move(connector_request)),
|
| + child_binding_(this),
|
| weak_factory_(this) {
|
| // This will be reattached by any of the IO thread functions on first call.
|
| io_thread_checker_.DetachFromThread();
|
| }
|
|
|
| // Safe to call from any thread.
|
| - void Start(
|
| - const InitializeCallback& initialize_callback,
|
| - const ServiceManagerConnection::OnConnectHandler& on_connect_callback,
|
| - const base::Closure& stop_callback) {
|
| + void Start(const InitializeCallback& local_info_available_callback,
|
| + const InitializeCallback& browser_info_available_callback,
|
| + const base::Closure& stop_callback) {
|
| DCHECK(!started_);
|
|
|
| started_ = true;
|
| callback_task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| - initialize_handler_ = initialize_callback;
|
| - on_connect_callback_ = on_connect_callback;
|
| + local_info_available_callback_ = local_info_available_callback;
|
| + browser_info_available_callback_ = browser_info_available_callback;
|
| stop_callback_ = stop_callback;
|
| io_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this));
|
| @@ -263,48 +263,57 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
|
|
| void OnStart() override {
|
| DCHECK(io_thread_checker_.CalledOnValidThread());
|
| - DCHECK(!initialize_handler_.is_null());
|
| + DCHECK(!local_info_available_callback_.is_null());
|
| local_info_ = context()->local_info();
|
|
|
| - InitializeCallback handler = base::ResetAndReturn(&initialize_handler_);
|
| + InitializeCallback handler =
|
| + base::ResetAndReturn(&local_info_available_callback_);
|
| callback_task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(handler, local_info_.identity));
|
| + base::Bind(handler, local_info_));
|
| }
|
|
|
| - bool OnConnect(const service_manager::ServiceInfo& remote_info,
|
| - service_manager::InterfaceRegistry* registry) override {
|
| + void OnBindInterface(const service_manager::ServiceInfo& source_info,
|
| + const std::string& interface_name,
|
| + mojo::ScopedMessagePipeHandle interface_pipe) override {
|
| DCHECK(io_thread_checker_.CalledOnValidThread());
|
|
|
| - callback_task_runner_->PostTask(
|
| - FROM_HERE, base::Bind(on_connect_callback_, local_info_, remote_info));
|
| -
|
| - std::string remote_service = remote_info.identity.name();
|
| - if (remote_service == service_manager::mojom::kServiceName) {
|
| - // Only expose the ServiceFactory interface to the Service Manager.
|
| - registry->AddInterface<service_manager::mojom::ServiceFactory>(this);
|
| - return true;
|
| + std::string remote_service = source_info.identity.name();
|
| + // Only expose the ServiceFactory interface to the Service Manager.
|
| + if (remote_service == service_manager::mojom::kServiceName &&
|
| + interface_name == service_manager::mojom::ServiceFactory::Name_) {
|
| + factory_bindings_.AddBinding(
|
| + this, mojo::MakeRequest<service_manager::mojom::ServiceFactory>(
|
| + std::move(interface_pipe)));
|
| + return;
|
| }
|
|
|
| - bool accept = false;
|
| {
|
| base::AutoLock lock(lock_);
|
| for (auto& entry : connection_filters_) {
|
| - accept |= entry.second->OnConnect(remote_info.identity, registry,
|
| - service_context_->connector());
|
| + entry.second->OnBindInterface(source_info, interface_name,
|
| + &interface_pipe,
|
| + service_context_->connector());
|
| + // A filter may have bound the interface, claiming the pipe.
|
| + if (!interface_pipe.is_valid())
|
| + return;
|
| }
|
| }
|
|
|
| - if (remote_service == "content_browser" &&
|
| - !has_browser_connection_) {
|
| - has_browser_connection_ = true;
|
| - registry->set_default_binder(default_browser_binder_);
|
| - registry->AddConnectionLostClosure(
|
| - base::Bind(&IOThreadContext::OnBrowserConnectionLost, this));
|
| - return true;
|
| + if (remote_service == "content_browser") {
|
| + if (interface_name == mojom::Child::Name_ && !has_browser_connection_) {
|
| + has_browser_connection_ = true;
|
| + InitializeCallback handler =
|
| + base::ResetAndReturn(&browser_info_available_callback_);
|
| + callback_task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(handler, source_info));
|
| +
|
| + child_binding_.Bind(std::move(interface_pipe));
|
| + child_binding_.set_connection_error_handler(
|
| + base::Bind(&IOThreadContext::OnBrowserConnectionLost, this));
|
| + } else {
|
| + default_browser_binder_.Run(interface_name, std::move(interface_pipe));
|
| + }
|
| }
|
| -
|
| - // If no filters were interested, reject the connection.
|
| - return accept;
|
| }
|
|
|
| bool OnServiceManagerConnectionLost() override {
|
| @@ -314,16 +323,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| }
|
|
|
| /////////////////////////////////////////////////////////////////////////////
|
| - // service_manager::InterfaceFactory<service_manager::mojom::ServiceFactory>
|
| - // implementation
|
| -
|
| - void Create(const service_manager::Identity& remote_identity,
|
| - service_manager::mojom::ServiceFactoryRequest request) override {
|
| - DCHECK(io_thread_checker_.CalledOnValidThread());
|
| - factory_bindings_.AddBinding(this, std::move(request));
|
| - }
|
| -
|
| - /////////////////////////////////////////////////////////////////////////////
|
| // service_manager::mojom::ServiceFactory implementation
|
|
|
| void CreateService(service_manager::mojom::ServiceRequest request,
|
| @@ -359,10 +358,8 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| scoped_refptr<base::SequencedTaskRunner> callback_task_runner_;
|
|
|
| // Callback to run once Service::OnStart is invoked.
|
| - InitializeCallback initialize_handler_;
|
| -
|
| - // Callback to run when a connection request is received.
|
| - ServiceManagerConnection::OnConnectHandler on_connect_callback_;
|
| + InitializeCallback local_info_available_callback_;
|
| + InitializeCallback browser_info_available_callback_;
|
|
|
| // Callback to run if the service is stopped by the service manager.
|
| base::Closure stop_callback_;
|
| @@ -395,6 +392,8 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| embedded_services_;
|
| std::unordered_map<std::string, ServiceRequestHandler> request_handlers_;
|
|
|
| + mojo::Binding<mojom::Child> child_binding_;
|
| +
|
| base::WeakPtrFactory<IOThreadContext> weak_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(IOThreadContext);
|
| @@ -465,9 +464,9 @@ ServiceManagerConnectionImpl::~ServiceManagerConnectionImpl() {
|
|
|
| void ServiceManagerConnectionImpl::Start() {
|
| context_->Start(
|
| - base::Bind(&ServiceManagerConnectionImpl::OnContextInitialized,
|
| + base::Bind(&ServiceManagerConnectionImpl::OnLocalServiceInfoAvailable,
|
| weak_factory_.GetWeakPtr()),
|
| - base::Bind(&ServiceManagerConnectionImpl::OnConnect,
|
| + base::Bind(&ServiceManagerConnectionImpl::OnBrowserServiceInfoAvailable,
|
| weak_factory_.GetWeakPtr()),
|
| base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost,
|
| weak_factory_.GetWeakPtr()));
|
| @@ -477,9 +476,14 @@ service_manager::Connector* ServiceManagerConnectionImpl::GetConnector() {
|
| return connector_.get();
|
| }
|
|
|
| -const service_manager::Identity& ServiceManagerConnectionImpl::GetIdentity()
|
| +const service_manager::ServiceInfo& ServiceManagerConnectionImpl::GetLocalInfo()
|
| const {
|
| - return identity_;
|
| + return local_info_;
|
| +}
|
| +
|
| +const service_manager::ServiceInfo&
|
| +ServiceManagerConnectionImpl::GetBrowserInfo() const {
|
| + return browser_info_;
|
| }
|
|
|
| void ServiceManagerConnectionImpl::SetConnectionLostClosure(
|
| @@ -532,9 +536,16 @@ void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) {
|
| on_connect_handlers_.erase(it);
|
| }
|
|
|
| -void ServiceManagerConnectionImpl::OnContextInitialized(
|
| - const service_manager::Identity& identity) {
|
| - identity_ = identity;
|
| +void ServiceManagerConnectionImpl::OnLocalServiceInfoAvailable(
|
| + const service_manager::ServiceInfo& local_info) {
|
| + local_info_ = local_info;
|
| +}
|
| +
|
| +void ServiceManagerConnectionImpl::OnBrowserServiceInfoAvailable(
|
| + const service_manager::ServiceInfo& browser_info) {
|
| + browser_info_ = browser_info;
|
| + for (auto& handler : on_connect_handlers_)
|
| + handler.second.Run(local_info_, browser_info_);
|
| }
|
|
|
| void ServiceManagerConnectionImpl::OnConnectionLost() {
|
| @@ -542,14 +553,6 @@ void ServiceManagerConnectionImpl::OnConnectionLost() {
|
| connection_lost_handler_.Run();
|
| }
|
|
|
| -void ServiceManagerConnectionImpl::OnConnect(
|
| - const service_manager::ServiceInfo& local_info,
|
| - const service_manager::ServiceInfo& remote_info) {
|
| - local_info_ = local_info;
|
| - for (auto& handler : on_connect_handlers_)
|
| - handler.second.Run(local_info, remote_info);
|
| -}
|
| -
|
| void ServiceManagerConnectionImpl::GetInterface(
|
| service_manager::mojom::InterfaceProvider* provider,
|
| const std::string& interface_name,
|
|
|