| 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 c4d8d6ac20524a6074f6f0b669d0e180dfd1d6e5..7d41454f4adab012710e26305a44a4d697bb03e5 100644
|
| --- a/content/browser/service_worker/service_worker_registration.cc
|
| +++ b/content/browser/service_worker/service_worker_registration.cc
|
| @@ -125,6 +125,8 @@ void ServiceWorkerRegistration::SetVersionInternal(
|
| ChangedVersionAttributesMask mask;
|
| if (version)
|
| UnsetVersionInternal(version, &mask);
|
| + if (*data_member && *data_member == active_version_)
|
| + active_version_->RemoveListener(this);
|
| *data_member = version;
|
| if (active_version_.get() && active_version_.get() == version)
|
| active_version_->AddListener(this);
|
| @@ -154,7 +156,8 @@ void ServiceWorkerRegistration::UnsetVersionInternal(
|
| void ServiceWorkerRegistration::ActivateWaitingVersionWhenReady() {
|
| DCHECK(waiting_version());
|
| should_activate_when_ready_ = true;
|
| - if (!active_version() || !active_version()->HasControllee())
|
| + if (!active_version() || !active_version()->HasControllee() ||
|
| + waiting_version()->skip_waiting())
|
| ActivateWaitingVersion();
|
| }
|
|
|
| @@ -243,9 +246,8 @@ void ServiceWorkerRegistration::ActivateWaitingVersion() {
|
| return; // Activation is no longer relevant.
|
| }
|
|
|
| - // "4. If exitingWorker is not null,
|
| + // "5. If exitingWorker is not null,
|
| if (exiting_version.get()) {
|
| - DCHECK(!exiting_version->HasControllee());
|
| // TODO(michaeln): should wait for events to be complete
|
| // "1. Wait for exitingWorker to finish handling any in-progress requests."
|
| // "2. Terminate exitingWorker."
|
| @@ -256,17 +258,19 @@ void ServiceWorkerRegistration::ActivateWaitingVersion() {
|
| exiting_version->SetStatus(ServiceWorkerVersion::REDUNDANT);
|
| }
|
|
|
| - // "5. Set serviceWorkerRegistration.activeWorker to activatingWorker."
|
| - // "6. Set serviceWorkerRegistration.waitingWorker to null."
|
| + // "6. Set serviceWorkerRegistration.activeWorker to activatingWorker."
|
| + // "7. Set serviceWorkerRegistration.waitingWorker to null."
|
| SetActiveVersion(activating_version.get());
|
|
|
| - // "7. Run the [[UpdateState]] algorithm passing registration.activeWorker and
|
| + // "8. Run the [[UpdateState]] algorithm passing registration.activeWorker and
|
| // "activating" as arguments."
|
| activating_version->SetStatus(ServiceWorkerVersion::ACTIVATING);
|
| + // "9. Fire a simple event named controllerchange..."
|
| + // Notify associated provider hosts to change the controller.
|
| + if (activating_version->skip_waiting())
|
| + FOR_EACH_OBSERVER(Listener, listeners_, OnSkippedWaiting(this));
|
|
|
| - // TODO(nhiroki): "8. Fire a simple event named controllerchange..."
|
| -
|
| - // "9. Queue a task to fire an event named activate..."
|
| + // "10. Queue a task to fire an event named activate..."
|
| activating_version->DispatchActivateEvent(
|
| base::Bind(&ServiceWorkerRegistration::OnActivateEventFinished,
|
| this, activating_version));
|
|
|