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

Unified Diff: content/browser/service_worker/service_worker_registration.cc

Issue 2119143002: service worker: Wait for inflight requests before activating (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 5 months 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/browser/service_worker/service_worker_registration.cc
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc
index cfd1e5e6e0d9554e6d069da150e3b52d4c66c3bd..64aba5869f0024fc4314cdf04caf3a4e94f402f4 100644
--- a/content/browser/service_worker/service_worker_registration.cc
+++ b/content/browser/service_worker/service_worker_registration.cc
@@ -182,11 +182,8 @@ void ServiceWorkerRegistration::UnsetVersionInternal(
void ServiceWorkerRegistration::ActivateWaitingVersionWhenReady() {
DCHECK(waiting_version());
should_activate_when_ready_ = true;
-
- if (!active_version() || !active_version()->HasControllee() ||
- waiting_version()->skip_waiting()) {
+ if (IsReadyToActivate())
ActivateWaitingVersion(false);
- }
}
void ServiceWorkerRegistration::ClaimClients() {
@@ -253,8 +250,27 @@ void ServiceWorkerRegistration::OnNoControllees(ServiceWorkerVersion* version) {
DCHECK_EQ(active_version(), version);
if (is_uninstalling_)
Clear();
- else if (should_activate_when_ready_)
- ActivateWaitingVersion(true);
+ else if (IsReadyToActivate())
+ ActivateWaitingVersion(true /* delay */);
+}
+
+void ServiceWorkerRegistration::OnNoInflightRequests(
+ ServiceWorkerVersion* version) {
+ if (!context_)
+ return;
+ DCHECK_EQ(active_version(), version);
+ if (IsReadyToActivate())
+ ActivateWaitingVersion(false /* delay */);
+}
+
+bool ServiceWorkerRegistration::IsReadyToActivate() const {
nhiroki 2016/07/08 05:04:42 DCHECK(waiting_version()) ?
falken 2016/07/08 07:06:45 Hmm good catch. The code assumes should_activate_w
+ if (!should_activate_when_ready_)
+ return false;
+
+ const ServiceWorkerVersion* active = active_version();
+ return !(active &&
+ (active->HasInflightRequests() ||
+ (active->HasControllee() && !waiting_version()->skip_waiting())));
nhiroki 2016/07/08 05:04:42 Negating the whole complex expression would make i
falken 2016/07/08 07:06:45 Done.
}
void ServiceWorkerRegistration::ActivateWaitingVersion(bool delay) {
@@ -271,8 +287,11 @@ void ServiceWorkerRegistration::ActivateWaitingVersion(bool delay) {
// "5. If exitingWorker is not null,
if (exiting_version.get()) {
- // TODO(michaeln): should wait for events to be complete
+ // TODO(falken): Update the quoted spec comments once
+ // https://github.com/slightlyoff/ServiceWorker/issues/916 is codified in
+ // the spec.
// "1. Wait for exitingWorker to finish handling any in-progress requests."
+ // This is already handled by IsReadyToActivate().
// "2. Terminate exitingWorker."
exiting_version->StopWorker(
base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));

Powered by Google App Engine
This is Rietveld 408576698