Index: content/browser/service_worker/service_worker_register_job.cc |
diff --git a/content/browser/service_worker/service_worker_register_job.cc b/content/browser/service_worker/service_worker_register_job.cc |
index 05e62bb48b35bd4e7fcbae95aba1ec5fe1abf118..0903cdb8f15ff818a3622e8e5dfdc70d6fae1236 100644 |
--- a/content/browser/service_worker/service_worker_register_job.cc |
+++ b/content/browser/service_worker/service_worker_register_job.cc |
@@ -344,7 +344,9 @@ void ServiceWorkerRegisterJob::ActivateAndContinue() { |
// "5. Set serviceWorkerRegistration.activeWorker to activatingWorker." |
// "6. Set serviceWorkerRegistration.waitingWorker to null." |
+ DisassociateVersionFromDocuments(context_, new_version()); |
registration()->SetActiveVersion(new_version()); |
+ AssociateActiveVersionToDocuments(context_, new_version()); |
// "7. Run the [[UpdateState]] algorithm passing registration.activeWorker and |
// "activating" as arguments." |
@@ -483,6 +485,26 @@ void ServiceWorkerRegisterJob::AssociateWaitingVersionToDocuments( |
} |
// static |
+void ServiceWorkerRegisterJob::AssociateActiveVersionToDocuments( |
+ base::WeakPtr<ServiceWorkerContextCore> context, |
+ ServiceWorkerVersion* version) { |
+ DCHECK(context); |
+ DCHECK(version); |
+ |
+ for (scoped_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = |
+ context->GetProviderHostIterator(); |
+ !it->IsAtEnd(); it->Advance()) { |
+ ServiceWorkerProviderHost* host = it->GetProviderHost(); |
+ if (ServiceWorkerUtils::ScopeMatches(version->scope(), |
+ host->document_url())) { |
+ if (!host->CanAssociateVersion(version)) |
+ continue; |
+ host->SetActiveVersion(version); |
+ } |
+ } |
+} |
+ |
+// static |
void ServiceWorkerRegisterJob::DisassociateVersionFromDocuments( |
base::WeakPtr<ServiceWorkerContextCore> context, |
ServiceWorkerVersion* version) { |