| Index: content/browser/service_worker/embedded_worker_instance.cc
|
| diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
|
| index 64f122f45e5c4f489abb264814848b27414de1b2..c79fdfe34b6b83ff5e314c5a60e8684c1375c417 100644
|
| --- a/content/browser/service_worker/embedded_worker_instance.cc
|
| +++ b/content/browser/service_worker/embedded_worker_instance.cc
|
| @@ -15,7 +15,9 @@
|
| #include "content/browser/service_worker/embedded_worker_registry.h"
|
| #include "content/browser/service_worker/service_worker_context_core.h"
|
| #include "content/common/content_switches_internal.h"
|
| +#include "content/common/mojo/service_registry_impl.h"
|
| #include "content/common/service_worker/embedded_worker_messages.h"
|
| +#include "content/common/service_worker/embedded_worker_setup.mojom.h"
|
| #include "content/common/service_worker/service_worker_types.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/render_process_host.h"
|
| @@ -83,6 +85,20 @@ void RegisterToWorkerDevToolsManagerOnUI(
|
| base::Bind(callback, worker_devtools_agent_route_id, wait_for_debugger));
|
| }
|
|
|
| +void SetupMojoOnUIThread(int process_id,
|
| + int thread_id,
|
| + mojo::InterfaceRequest<mojo::ServiceProvider> services,
|
| + mojo::ServiceProviderPtr exposed_services) {
|
| + RenderProcessHost* rph = RenderProcessHost::FromID(process_id);
|
| + // |rph| may be NULL in unit tests.
|
| + if (!rph)
|
| + return;
|
| + EmbeddedWorkerSetupPtr setup;
|
| + rph->GetServiceRegistry()->ConnectToRemoteService(mojo::GetProxy(&setup));
|
| + setup->ExchangeServiceProviders(thread_id, services.Pass(),
|
| + exposed_services.Pass());
|
| +}
|
| +
|
| } // namespace
|
|
|
| // Lives on IO thread, proxies notifications to DevToolsManager that lives on
|
| @@ -145,6 +161,7 @@ void EmbeddedWorkerInstance::Start(int64 service_worker_version_id,
|
| status_ = STARTING;
|
| starting_phase_ = ALLOCATING_PROCESS;
|
| network_accessed_for_script_ = false;
|
| + service_registry_.reset(new ServiceRegistryImpl());
|
| FOR_EACH_OBSERVER(Listener, listener_list_, OnStarting());
|
| scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params(
|
| new EmbeddedWorkerMsg_StartWorker_Params());
|
| @@ -202,6 +219,11 @@ ServiceWorkerStatusCode EmbeddedWorkerInstance::SendMessage(
|
| thread_id_, embedded_worker_id_, message));
|
| }
|
|
|
| +ServiceRegistry* EmbeddedWorkerInstance::GetServiceRegistry() {
|
| + DCHECK(status_ == STARTING || status_ == RUNNING) << status_;
|
| + return service_registry_.get();
|
| +}
|
| +
|
| EmbeddedWorkerInstance::EmbeddedWorkerInstance(
|
| base::WeakPtr<ServiceWorkerContextCore> context,
|
| int embedded_worker_id)
|
| @@ -257,6 +279,7 @@ void EmbeddedWorkerInstance::ProcessAllocated(
|
| if (status != SERVICE_WORKER_OK) {
|
| Status old_status = status_;
|
| status_ = STOPPED;
|
| + service_registry_.reset();
|
| callback.Run(status);
|
| FOR_EACH_OBSERVER(Listener, listener_list_, OnStopped(old_status));
|
| return;
|
| @@ -344,6 +367,18 @@ void EmbeddedWorkerInstance::OnScriptLoaded(int thread_id) {
|
| }
|
| thread_id_ = thread_id;
|
| FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded());
|
| +
|
| + mojo::ServiceProviderPtr exposed_services;
|
| + service_registry_->Bind(GetProxy(&exposed_services));
|
| + mojo::ServiceProviderPtr services;
|
| + mojo::InterfaceRequest<mojo::ServiceProvider> services_request =
|
| + GetProxy(&services);
|
| + BrowserThread::PostTask(
|
| + BrowserThread::UI, FROM_HERE,
|
| + base::Bind(SetupMojoOnUIThread, process_id_, thread_id_,
|
| + base::Passed(&services_request),
|
| + base::Passed(&exposed_services)));
|
| + service_registry_->BindRemoteServiceProvider(services.Pass());
|
| }
|
|
|
| void EmbeddedWorkerInstance::OnScriptLoadFailed() {
|
| @@ -449,6 +484,7 @@ void EmbeddedWorkerInstance::ReleaseProcess() {
|
| status_ = STOPPED;
|
| process_id_ = -1;
|
| thread_id_ = -1;
|
| + service_registry_.reset();
|
| start_callback_.Reset();
|
| }
|
|
|
|
|