Chromium Code Reviews| 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..15d4801d0e6eb72f9606f3940c9fbb6dfe6a460c 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,14 @@ 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(); |
| + for (auto& callback : stop_callbacks_) |
|
nhiroki
2016/12/15 09:53:15
Generally, it would be preferable to swap a callba
shimazu
2016/12/19 08:25:12
Done.
|
| + callback.Run(); |
|
nhiroki
2016/12/15 09:53:15
Do we need to call EmbeddedWorkerRegistry::OnWorke
shimazu
2016/12/19 08:25:12
No we don't in terms of the chromium IPC, but mojo
nhiroki
2016/12/19 09:21:55
What happens when EmbeddedWorkerInstance::Start()
shimazu
2017/01/05 06:02:41
Sorry for missing the comment. It's an unwelcome s
|
| + stop_callbacks_.clear(); |
| TRACE_EVENT0("ServiceWorker", |
| "EmbeddedWorkerInstanceClientImpl::StopWorkerCompleted"); |
| - stop_callback_.Reset(); |
| wrapper_ = nullptr; |
| } |
| @@ -42,6 +43,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 +63,19 @@ void EmbeddedWorkerInstanceClientImpl::StartWorker( |
| void EmbeddedWorkerInstanceClientImpl::StopWorker( |
| const StopWorkerCallback& callback) { |
| DCHECK(ChildThreadImpl::current()); |
| + // StopWorker is possible to be called before StartWorker(). |
| + if (!wrapper_) { |
| + callback.Run(); |
| + return; |
| + } |
| DCHECK(embedded_worker_id_); |
| - // StopWorker is possible to be called twice or before StartWorker(). |
| - if (stop_callback_ || !wrapper_) |
| + // StopWorker is possible to be called twice. |
| + 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)); |
| dispatcher_->RecordStopWorkerTimer(embedded_worker_id_.value()); |
| wrapper_->worker()->terminateWorkerContext(); |
| } |