Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(471)

Unified Diff: content/renderer/service_worker/embedded_worker_instance_client_impl.cc

Issue 2578023002: ServiceWorker: Stop don't send a message before connection established (Closed)
Patch Set: Added DCHECKs Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698