Index: content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
index 38014c8cc62640fcf7258ef9d588d784c2c0b1c3..aa699bcf0c170284ae143f2fca0b89058d158178 100644 |
--- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
+++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
@@ -28,12 +28,18 @@ void EmbeddedWorkerInstanceClientImpl::Create( |
void EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted() { |
DCHECK(embedded_worker_id_); |
DCHECK(stop_callback_); |
- dispatcher_->UnregisterWorker(embedded_worker_id_.value()); |
- embedded_worker_id_.reset(); |
- stop_callback_.Run(); |
TRACE_EVENT0("ServiceWorker", |
"EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted"); |
+ // TODO(falken): The signals to the browser should be in the order: |
+ // (1) WorkerStopped (via stop_callback_) |
+ // (2) ProviderDestroyed (via UnregisterWorker destroying |
+ // WebEmbeddedWorkerImpl) |
+ // But this ordering is currently not guaranteed since the Mojo pipes are |
+ // different. https://crbug.com/676526 |
+ stop_callback_.Run(); |
stop_callback_.Reset(); |
+ dispatcher_->UnregisterWorker(embedded_worker_id_.value()); |
+ embedded_worker_id_.reset(); |
wrapper_ = nullptr; |
} |