| 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 212ec813940655443904302f87647e01d9e0680e..5549c63b8a726986bbd7161e11b17666f3e5b31b 100644
|
| --- a/content/common/service_manager/service_manager_connection_impl.cc
|
| +++ b/content/common/service_manager/service_manager_connection_impl.cc
|
| @@ -49,9 +49,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| public:
|
| using InitializeCallback =
|
| base::Callback<void(const service_manager::Identity&)>;
|
| - using ServiceFactoryCallback =
|
| - base::Callback<void(service_manager::mojom::ServiceRequest,
|
| - const std::string&)>;
|
|
|
| IOThreadContext(
|
| service_manager::mojom::ServiceRequest service_request,
|
| @@ -71,7 +68,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| void Start(
|
| const InitializeCallback& initialize_callback,
|
| const ServiceManagerConnection::OnConnectHandler& on_connect_callback,
|
| - const ServiceFactoryCallback& create_service_callback,
|
| const base::Closure& stop_callback) {
|
| DCHECK(!started_);
|
|
|
| @@ -79,7 +75,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| callback_task_runner_ = base::ThreadTaskRunnerHandle::Get();
|
| initialize_handler_ = initialize_callback;
|
| on_connect_callback_ = on_connect_callback;
|
| - create_service_callback_ = create_service_callback;
|
| stop_callback_ = stop_callback;
|
| io_task_runner_->PostTask(
|
| FROM_HERE, base::Bind(&IOThreadContext::StartOnIOThread, this));
|
| @@ -126,6 +121,21 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| base::ThreadTaskRunnerHandle::Get(), binder);
|
| }
|
|
|
| + void AddEmbeddedService(const std::string& name, const ServiceInfo& info) {
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&ServiceManagerConnectionImpl::IOThreadContext::
|
| + AddEmbeddedServiceRequestHandlerOnIoThread,
|
| + this, name, info));
|
| + }
|
| +
|
| + void AddServiceRequestHandler(const std::string& name,
|
| + const ServiceRequestHandler& handler) {
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&ServiceManagerConnectionImpl::IOThreadContext::
|
| + AddServiceRequestHandlerOnIoThread,
|
| + this, name, handler));
|
| + }
|
| +
|
| private:
|
| friend class base::RefCountedThreadSafe<IOThreadContext>;
|
|
|
| @@ -203,6 +213,9 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| service_context_.reset();
|
|
|
| ClearConnectionFiltersOnIOThread();
|
| +
|
| + request_handlers_.clear();
|
| + embedded_services_.clear();
|
| }
|
|
|
| void ClearConnectionFiltersOnIOThread() {
|
| @@ -224,6 +237,27 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| has_browser_connection_ = false;
|
| }
|
|
|
| + void AddEmbeddedServiceRequestHandlerOnIoThread(const std::string& name,
|
| + const ServiceInfo& info) {
|
| + DCHECK(io_thread_checker_.CalledOnValidThread());
|
| + std::unique_ptr<EmbeddedServiceRunner> service(
|
| + new EmbeddedServiceRunner(name, info));
|
| + AddServiceRequestHandlerOnIoThread(
|
| + name, base::Bind(&EmbeddedServiceRunner::BindServiceRequest,
|
| + base::Unretained(service.get())));
|
| + auto result =
|
| + embedded_services_.insert(std::make_pair(name, std::move(service)));
|
| + DCHECK(result.second);
|
| + }
|
| +
|
| + void AddServiceRequestHandlerOnIoThread(
|
| + const std::string& name,
|
| + const ServiceRequestHandler& handler) {
|
| + DCHECK(io_thread_checker_.CalledOnValidThread());
|
| + auto result = request_handlers_.insert(std::make_pair(name, handler));
|
| + DCHECK(result.second);
|
| + }
|
| +
|
| /////////////////////////////////////////////////////////////////////////////
|
| // service_manager::Service implementation
|
|
|
| @@ -295,9 +329,10 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| void CreateService(service_manager::mojom::ServiceRequest request,
|
| const std::string& name) override {
|
| DCHECK(io_thread_checker_.CalledOnValidThread());
|
| - callback_task_runner_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(create_service_callback_, base::Passed(&request), name));
|
| + auto it = request_handlers_.find(name);
|
| + DCHECK(it != request_handlers_.end())
|
| + << "Can't create service " << name << ". No handler found.";
|
| + it->second.Run(std::move(request));
|
| }
|
|
|
| static void CallBinderOnTaskRunner(
|
| @@ -329,9 +364,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| // Callback to run when a connection request is received.
|
| ServiceManagerConnection::OnConnectHandler on_connect_callback_;
|
|
|
| - // Callback to run when a new Service request is received.
|
| - ServiceFactoryCallback create_service_callback_;
|
| -
|
| // Callback to run if the service is stopped by the service manager.
|
| base::Closure stop_callback_;
|
|
|
| @@ -359,6 +391,10 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| base::Lock lock_;
|
| std::map<int, std::unique_ptr<ConnectionFilter>> connection_filters_;
|
|
|
| + std::unordered_map<std::string, std::unique_ptr<EmbeddedServiceRunner>>
|
| + embedded_services_;
|
| + std::unordered_map<std::string, ServiceRequestHandler> request_handlers_;
|
| +
|
| base::WeakPtrFactory<IOThreadContext> weak_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(IOThreadContext);
|
| @@ -433,8 +469,6 @@ void ServiceManagerConnectionImpl::Start() {
|
| weak_factory_.GetWeakPtr()),
|
| base::Bind(&ServiceManagerConnectionImpl::OnConnect,
|
| weak_factory_.GetWeakPtr()),
|
| - base::Bind(&ServiceManagerConnectionImpl::CreateService,
|
| - weak_factory_.GetWeakPtr()),
|
| base::Bind(&ServiceManagerConnectionImpl::OnConnectionLost,
|
| weak_factory_.GetWeakPtr()));
|
| }
|
| @@ -476,21 +510,13 @@ void ServiceManagerConnectionImpl::RemoveConnectionFilter(int filter_id) {
|
|
|
| void ServiceManagerConnectionImpl::AddEmbeddedService(const std::string& name,
|
| const ServiceInfo& info) {
|
| - std::unique_ptr<EmbeddedServiceRunner> service(
|
| - new EmbeddedServiceRunner(name, info));
|
| - AddServiceRequestHandler(
|
| - name, base::Bind(&EmbeddedServiceRunner::BindServiceRequest,
|
| - base::Unretained(service.get())));
|
| - auto result =
|
| - embedded_services_.insert(std::make_pair(name, std::move(service)));
|
| - DCHECK(result.second);
|
| + context_->AddEmbeddedService(name, info);
|
| }
|
|
|
| void ServiceManagerConnectionImpl::AddServiceRequestHandler(
|
| const std::string& name,
|
| const ServiceRequestHandler& handler) {
|
| - auto result = request_handlers_.insert(std::make_pair(name, handler));
|
| - DCHECK(result.second);
|
| + context_->AddServiceRequestHandler(name, handler);
|
| }
|
|
|
| int ServiceManagerConnectionImpl::AddOnConnectHandler(
|
| @@ -506,16 +532,6 @@ void ServiceManagerConnectionImpl::RemoveOnConnectHandler(int id) {
|
| on_connect_handlers_.erase(it);
|
| }
|
|
|
| -void ServiceManagerConnectionImpl::CreateService(
|
| - service_manager::mojom::ServiceRequest request,
|
| - const std::string& name) {
|
| - auto it = request_handlers_.find(name);
|
| - DCHECK(it != request_handlers_.end())
|
| - << "Can't create service " << name << ". No handler found.";
|
| - if (it != request_handlers_.end())
|
| - it->second.Run(std::move(request));
|
| -}
|
| -
|
| void ServiceManagerConnectionImpl::OnContextInitialized(
|
| const service_manager::Identity& identity) {
|
| identity_ = identity;
|
|
|