| 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 5c92bd7a654e2c9af88c56fcca28f6204a30e58e..212ec813940655443904302f87647e01d9e0680e 100644
|
| --- a/content/common/service_manager/service_manager_connection_impl.cc
|
| +++ b/content/common/service_manager/service_manager_connection_impl.cc
|
| @@ -49,6 +49,9 @@ 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,
|
| @@ -68,6 +71,7 @@ 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_);
|
|
|
| @@ -75,6 +79,7 @@ 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));
|
| @@ -121,21 +126,6 @@ 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>;
|
|
|
| @@ -213,9 +203,6 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| service_context_.reset();
|
|
|
| ClearConnectionFiltersOnIOThread();
|
| -
|
| - request_handlers_.clear();
|
| - embedded_services_.clear();
|
| }
|
|
|
| void ClearConnectionFiltersOnIOThread() {
|
| @@ -237,27 +224,6 @@ 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));
|
| - 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);
|
| - }
|
| -
|
| - 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
|
|
|
| @@ -329,10 +295,9 @@ class ServiceManagerConnectionImpl::IOThreadContext
|
| void CreateService(service_manager::mojom::ServiceRequest request,
|
| const std::string& name) override {
|
| DCHECK(io_thread_checker_.CalledOnValidThread());
|
| - 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));
|
| + callback_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(create_service_callback_, base::Passed(&request), name));
|
| }
|
|
|
| static void CallBinderOnTaskRunner(
|
| @@ -364,6 +329,9 @@ 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_;
|
|
|
| @@ -391,10 +359,6 @@ 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);
|
| @@ -469,6 +433,8 @@ 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()));
|
| }
|
| @@ -510,13 +476,21 @@ void ServiceManagerConnectionImpl::RemoveConnectionFilter(int filter_id) {
|
|
|
| void ServiceManagerConnectionImpl::AddEmbeddedService(const std::string& name,
|
| const ServiceInfo& info) {
|
| - context_->AddEmbeddedService(name, 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);
|
| }
|
|
|
| void ServiceManagerConnectionImpl::AddServiceRequestHandler(
|
| const std::string& name,
|
| const ServiceRequestHandler& handler) {
|
| - context_->AddServiceRequestHandler(name, handler);
|
| + auto result = request_handlers_.insert(std::make_pair(name, handler));
|
| + DCHECK(result.second);
|
| }
|
|
|
| int ServiceManagerConnectionImpl::AddOnConnectHandler(
|
| @@ -532,6 +506,16 @@ 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;
|
|
|