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 17d4cd49e02c3021eb0f2b61f3865b94bf689789..842a57a357553eb9d6d591088973fd0bfc0b1306 100644 |
--- a/content/browser/service_worker/embedded_worker_instance.cc |
+++ b/content/browser/service_worker/embedded_worker_instance.cc |
@@ -460,8 +460,11 @@ void EmbeddedWorkerInstance::Start( |
params->settings.v8_cache_options = GetV8CacheOptions(); |
mojom::EmbeddedWorkerInstanceClientRequest request; |
- if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) |
+ if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { |
request = mojo::GetProxy(&client_); |
+ client_.set_connection_error_handler( |
+ base::Bind(&EmbeddedWorkerInstance::Detach, base::Unretained(this))); |
+ } |
inflight_start_task_.reset( |
new StartTask(this, params->script_url, std::move(request))); |
@@ -476,8 +479,15 @@ ServiceWorkerStatusCode EmbeddedWorkerInstance::Stop() { |
// Abort an inflight start task. |
inflight_start_task_.reset(); |
- ServiceWorkerStatusCode status = |
- registry_->StopWorker(process_id(), embedded_worker_id_); |
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_IPC_FAILED; |
+ if (ServiceWorkerUtils::IsMojoForServiceWorkerEnabled()) { |
+ status = SERVICE_WORKER_OK; |
+ client_->StopWorker(base::Bind(&EmbeddedWorkerRegistry::OnWorkerStopped, |
+ base::Unretained(registry_.get()), |
+ process_id(), embedded_worker_id())); |
+ } else { |
+ status = registry_->StopWorker(process_id(), embedded_worker_id_); |
+ } |
UMA_HISTOGRAM_ENUMERATION("ServiceWorker.SendStopWorker.Status", status, |
SERVICE_WORKER_ERROR_MAX_VALUE); |
// StopWorker could fail if we were starting up and don't have a process yet, |
@@ -756,7 +766,7 @@ void EmbeddedWorkerInstance::OnDetached() { |
} |
void EmbeddedWorkerInstance::Detach() { |
- registry_->RemoveWorker(process_id(), embedded_worker_id_); |
+ registry_->DetachWorker(process_id(), embedded_worker_id()); |
OnDetached(); |
} |
@@ -836,6 +846,7 @@ void EmbeddedWorkerInstance::ReleaseProcess() { |
// Abort an inflight start task. |
inflight_start_task_.reset(); |
+ client_.reset(); |
devtools_proxy_.reset(); |
process_handle_.reset(); |
status_ = EmbeddedWorkerStatus::STOPPED; |