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..8858df823571a7b061d539b955fee088214b152f 100644 |
--- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
+++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc |
@@ -27,13 +27,16 @@ void EmbeddedWorkerInstanceClientImpl::Create( |
void EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted() { |
DCHECK(embedded_worker_id_); |
- DCHECK(stop_callback_); |
+ DCHECK(!stop_callbacks_.empty()); |
dispatcher_->UnregisterWorker(embedded_worker_id_.value()); |
embedded_worker_id_.reset(); |
- stop_callback_.Run(); |
+ std::vector<StopWorkerCallback> callbacks; |
+ stop_callbacks_.swap(callbacks); |
+ for (auto& callback : callbacks) |
+ callback.Run(); |
+ DCHECK(stop_callbacks_.empty()); |
TRACE_EVENT0("ServiceWorker", |
"EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted"); |
- stop_callback_.Reset(); |
wrapper_ = nullptr; |
} |
@@ -42,6 +45,7 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker( |
mojom::ServiceWorkerEventDispatcherRequest dispatcher_request) { |
DCHECK(ChildThreadImpl::current()); |
DCHECK(!wrapper_); |
+ DCHECK(!embedded_worker_id_); |
TRACE_EVENT0("ServiceWorker", |
"EmbeddedWorkerInstanceClientImpl::StartWorker"); |
embedded_worker_id_ = params.embedded_worker_id; |
@@ -61,12 +65,19 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker( |
void EmbeddedWorkerInstanceClientImpl::StopWorker( |
const StopWorkerCallback& callback) { |
DCHECK(ChildThreadImpl::current()); |
- DCHECK(embedded_worker_id_); |
- // StopWorker is possible to be called twice or before StartWorker(). |
- if (stop_callback_ || !wrapper_) |
+ // StopWorker is possible to be called before StartWorker(). |
falken
2016/12/20 04:41:31
Is this still possible?
shimazu
2016/12/20 07:55:01
No. This patch actually fixes this case. Updated.
|
+ if (!wrapper_) { |
+ callback.Run(); |
+ return; |
+ } |
+ // StopWorker is possible to be called twice. |
falken
2016/12/20 04:41:31
Can the comment expand on how?
shimazu
2016/12/20 07:55:01
This also shouldn't happen. Fixed on the browser s
|
+ if (!stop_callbacks_.empty()) { |
+ stop_callbacks_.push_back(std::move(callback)); |
return; |
+ } |
TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker"); |
- stop_callback_ = std::move(callback); |
+ stop_callbacks_.push_back(std::move(callback)); |
+ DCHECK(embedded_worker_id_); |
dispatcher_->RecordStopWorkerTimer(embedded_worker_id_.value()); |
wrapper_->worker()->terminateWorkerContext(); |
} |