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 9e81238aa0a4a53a53cbf5928388dcc0a9d1c9ec..ea9b4f4cc3584edf7c6eefa71c939726d8367c15 100644 |
--- a/content/common/service_manager/service_manager_connection_impl.cc |
+++ b/content/common/service_manager/service_manager_connection_impl.cc |
@@ -139,6 +139,11 @@ class ServiceManagerConnectionImpl::IOThreadContext |
private: |
friend class base::RefCountedThreadSafe<IOThreadContext>; |
+ struct PendingRequest { |
+ std::string service_name; |
+ service_manager::mojom::ServiceRequest request; |
+ }; |
+ |
class MessageLoopObserver : public base::MessageLoop::DestructionObserver { |
public: |
explicit MessageLoopObserver(base::WeakPtr<IOThreadContext> context) |
@@ -256,6 +261,16 @@ class ServiceManagerConnectionImpl::IOThreadContext |
DCHECK(io_thread_checker_.CalledOnValidThread()); |
auto result = request_handlers_.insert(std::make_pair(name, handler)); |
DCHECK(result.second); |
+ auto iter = pending_requests_.begin(); |
+ while (iter != pending_requests_.end()) { |
+ if ((*iter)->service_name == name) { |
+ std::unique_ptr<PendingRequest> pending_request = std::move(*iter); |
+ iter = pending_requests_.erase(iter); |
+ handler.Run(std::move(pending_request->request)); |
+ } else { |
+ ++iter; |
+ } |
+ } |
} |
///////////////////////////////////////////////////////////////////////////// |
@@ -329,8 +344,14 @@ class ServiceManagerConnectionImpl::IOThreadContext |
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."; |
+ if (it == request_handlers_.end()) { |
+ std::unique_ptr<PendingRequest> pending_request = |
+ base::MakeUnique<PendingRequest>(); |
+ pending_request->service_name = name; |
+ pending_request->request = std::move(request); |
+ pending_requests_.push_back(std::move(pending_request)); |
+ return; |
+ } |
it->second.Run(std::move(request)); |
} |
@@ -392,6 +413,10 @@ class ServiceManagerConnectionImpl::IOThreadContext |
embedded_services_; |
std::unordered_map<std::string, ServiceRequestHandler> request_handlers_; |
+ // Requests before the service have been registered are added here. Typically |
+ // there are very few elements, so we use a vector. |
+ std::vector<std::unique_ptr<PendingRequest>> pending_requests_; |
+ |
mojo::Binding<mojom::Child> child_binding_; |
base::WeakPtrFactory<IOThreadContext> weak_factory_; |