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

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: Addressed comments from nhiroki@ 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..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();
}

Powered by Google App Engine
This is Rietveld 408576698