Chromium Code Reviews| 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)); |