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 c4dc0bd865c4bc87fe1f0b0a2bbbf8c22369d88d..8282cb22f8302664aec9fc20f5ac3bb361abf311 100644 |
--- a/content/browser/service_worker/service_worker_register_job.cc |
+++ b/content/browser/service_worker/service_worker_register_job.cc |
@@ -47,7 +47,7 @@ void ServiceWorkerRegisterJob::AddCallback(const RegistrationCallback& callback, |
int process_id) { |
if (!is_promise_resolved_) { |
callbacks_.push_back(callback); |
- if (process_id != -1 && (phase_ < UPDATE || !pending_version())) |
+ if (process_id != -1 && (phase_ < UPDATE || !new_version())) |
pending_process_ids_.push_back(process_id); |
return; |
} |
@@ -101,16 +101,16 @@ ServiceWorkerRegistration* ServiceWorkerRegisterJob::registration() { |
return internal_.registration; |
} |
-void ServiceWorkerRegisterJob::set_pending_version( |
+void ServiceWorkerRegisterJob::set_new_version( |
ServiceWorkerVersion* version) { |
DCHECK(phase_ == UPDATE) << phase_; |
- DCHECK(!internal_.pending_version); |
- internal_.pending_version = version; |
+ DCHECK(!internal_.new_version); |
+ internal_.new_version = version; |
} |
-ServiceWorkerVersion* ServiceWorkerRegisterJob::pending_version() { |
+ServiceWorkerVersion* ServiceWorkerRegisterJob::new_version() { |
DCHECK(phase_ >= UPDATE) << phase_; |
- return internal_.pending_version; |
+ return internal_.new_version; |
} |
void ServiceWorkerRegisterJob::SetPhase(Phase phase) { |
@@ -234,14 +234,14 @@ void ServiceWorkerRegisterJob::UpdateAndContinue( |
// "Let serviceWorker be a newly-created ServiceWorker object..." and start |
// the worker. |
- set_pending_version(new ServiceWorkerVersion( |
+ set_new_version(new ServiceWorkerVersion( |
registration(), context_->storage()->NewVersionId(), context_)); |
// TODO(michaeln): Pause after downloading when performing an update. |
bool pause_after_download = false; |
if (pause_after_download) |
- pending_version()->embedded_worker()->AddListener(this); |
- pending_version()->StartWorkerWithCandidateProcesses( |
+ new_version()->embedded_worker()->AddListener(this); |
+ new_version()->StartWorkerWithCandidateProcesses( |
pending_process_ids_, |
pause_after_download, |
base::Bind(&ServiceWorkerRegisterJob::OnStartWorkerFinished, |
@@ -257,16 +257,17 @@ void ServiceWorkerRegisterJob::OnStartWorkerFinished( |
return; |
} |
- // "Resolve promise with serviceWorker." |
- // Although the spec doesn't set waitingWorker until after resolving the |
- // promise, our system's resolving works by passing ServiceWorkerRegistration |
- // to the callbacks, so waitingWorker must be set first. |
- DCHECK(!registration()->waiting_version()); |
- registration()->set_waiting_version(pending_version()); |
- ResolvePromise(status, registration(), pending_version()); |
- |
- AssociateWaitingVersionToDocuments(context_, pending_version()); |
+ // TODO(michaeln): Compare the old and new script. |
+ // If different unpause the worker and continue with |
+ // the job. If the same ResolvePromise with the current |
+ // version and complete the job, throwing away the new version |
+ // since there's nothing new. |
+ // "Resolve promise with serviceWorker." |
+ DCHECK(!registration()->installing_version()); |
+ ResolvePromise(status, registration(), new_version()); |
+ registration()->SetInstallingVersion(new_version()); |
+ AssociateInstallingVersionToDocuments(context_, new_version()); |
InstallAndContinue(); |
} |
@@ -275,7 +276,7 @@ void ServiceWorkerRegisterJob::InstallAndContinue() { |
SetPhase(INSTALL); |
// "Set serviceWorkerRegistration.installingWorker._state to installing." |
// "Fire install event on the associated ServiceWorkerGlobalScope object." |
- pending_version()->DispatchInstallEvent( |
+ new_version()->DispatchInstallEvent( |
-1, |
base::Bind(&ServiceWorkerRegisterJob::OnInstallFinished, |
weak_factory_.GetWeakPtr())); |
@@ -295,7 +296,7 @@ void ServiceWorkerRegisterJob::OnInstallFinished( |
SetPhase(STORE); |
context_->storage()->StoreRegistration( |
registration(), |
- pending_version(), |
+ new_version(), |
base::Bind(&ServiceWorkerRegisterJob::OnStoreRegistrationComplete, |
weak_factory_.GetWeakPtr())); |
} |
@@ -306,7 +307,7 @@ void ServiceWorkerRegisterJob::OnStoreRegistrationComplete( |
Complete(status); |
return; |
} |
- |
+ registration()->SetWaitingVersion(new_version()); |
ActivateAndContinue(); |
} |
@@ -334,16 +335,12 @@ void ServiceWorkerRegisterJob::ActivateAndContinue() { |
// "Set serviceWorkerRegistration.waitingWorker to null." |
// "Set serviceWorkerRegistration.activeWorker to activatingWorker." |
- DisassociateWaitingVersionFromDocuments( |
- context_, pending_version()->version_id()); |
- registration()->set_waiting_version(NULL); |
- DCHECK(!registration()->active_version()); |
- registration()->set_active_version(pending_version()); |
+ registration()->SetActiveVersion(new_version()); |
// "Set serviceWorkerRegistration.activeWorker._state to activating." |
// "Fire activate event on the associated ServiceWorkerGlobalScope object." |
// "Set serviceWorkerRegistration.activeWorker._state to active." |
- pending_version()->DispatchActivateEvent( |
+ new_version()->DispatchActivateEvent( |
base::Bind(&ServiceWorkerRegisterJob::OnActivateFinished, |
weak_factory_.GetWeakPtr())); |
} |
@@ -355,7 +352,7 @@ void ServiceWorkerRegisterJob::OnActivateFinished( |
// TODO(kinuko,falken): For some error cases (e.g. ServiceWorker is |
// unexpectedly terminated) we may want to retry sending the event again. |
if (status != SERVICE_WORKER_OK) { |
- registration()->set_active_version(NULL); |
+ registration()->SetActiveVersion(NULL); |
Complete(status); |
return; |
} |
@@ -374,16 +371,17 @@ void ServiceWorkerRegisterJob::CompleteInternal( |
ServiceWorkerStatusCode status) { |
SetPhase(COMPLETE); |
if (status != SERVICE_WORKER_OK) { |
- if (registration() && registration()->waiting_version()) { |
- DisassociateWaitingVersionFromDocuments( |
- context_, registration()->waiting_version()->version_id()); |
- registration()->set_waiting_version(NULL); |
- } |
- if (registration() && !registration()->active_version()) { |
- context_->storage()->DeleteRegistration( |
- registration()->id(), |
- registration()->script_url().GetOrigin(), |
- base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
+ if (registration()) { |
+ if (new_version()) { |
+ DisassociateVersionFromDocuments(context_, new_version()); |
+ registration()->UnsetVersion(new_version()); |
+ } |
+ if (!registration()->active_version()) { |
+ context_->storage()->DeleteRegistration( |
+ registration()->id(), |
+ registration()->script_url().GetOrigin(), |
+ base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
+ } |
} |
if (!is_promise_resolved_) |
ResolvePromise(status, NULL, NULL); |
@@ -391,10 +389,10 @@ void ServiceWorkerRegisterJob::CompleteInternal( |
DCHECK(callbacks_.empty()); |
if (registration()) { |
context_->storage()->NotifyDoneInstallingRegistration( |
- registration(), pending_version(), status); |
+ registration(), new_version(), status); |
} |
- if (pending_version()) |
- pending_version()->embedded_worker()->RemoveListener(this); |
+ if (new_version()) |
+ new_version()->embedded_worker()->RemoveListener(this); |
} |
void ServiceWorkerRegisterJob::ResolvePromise( |
@@ -420,8 +418,8 @@ void ServiceWorkerRegisterJob::OnPausedAfterDownload() { |
// the job. If the same ResolvePromise with the current |
// version and complete the job, throwing away the new version |
// since there's nothing new. |
falken
2014/07/02 05:42:11
Now we have this comment twice.
michaeln
2014/07/02 23:17:14
Done.
|
- pending_version()->embedded_worker()->RemoveListener(this); |
- pending_version()->embedded_worker()->ResumeAfterDownload(); |
+ new_version()->embedded_worker()->RemoveListener(this); |
+ new_version()->embedded_worker()->ResumeAfterDownload(); |
} |
bool ServiceWorkerRegisterJob::OnMessageReceived(const IPC::Message& message) { |
@@ -429,7 +427,7 @@ bool ServiceWorkerRegisterJob::OnMessageReceived(const IPC::Message& message) { |
} |
// static |
-void ServiceWorkerRegisterJob::AssociateWaitingVersionToDocuments( |
+void ServiceWorkerRegisterJob::AssociateInstallingVersionToDocuments( |
base::WeakPtr<ServiceWorkerContextCore> context, |
ServiceWorkerVersion* version) { |
DCHECK(context); |
@@ -437,45 +435,27 @@ void ServiceWorkerRegisterJob::AssociateWaitingVersionToDocuments( |
for (scoped_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = |
context->GetProviderHostIterator(); |
- !it->IsAtEnd(); |
- it->Advance()) { |
+ !it->IsAtEnd(); it->Advance()) { |
ServiceWorkerProviderHost* host = it->GetProviderHost(); |
- if (!host->IsContextAlive()) |
- continue; |
falken
2014/07/02 05:42:11
I wonder why this was here. Is it possible the pro
nhiroki
2014/07/02 07:25:12
Right. After the corruption recovery, there can be
|
if (ServiceWorkerUtils::ScopeMatches(version->scope(), |
host->document_url())) { |
- // The spec's _Update algorithm says, "upgrades active version to a new |
- // version for the same URL scope.", so skip if the scope (registration) |
- // of |version| is different from that of the current active/waiting |
- // version. |
- if (!host->ValidateVersionForAssociation(version)) |
+ if (!host->CanAssociateVersion(version)) |
continue; |
- |
- // TODO(nhiroki): Keep |host->waiting_version()| to be replaced and set |
- // status of them to 'redandunt' after breaking the loop. |
- |
- host->SetWaitingVersion(version); |
- // TODO(nhiroki): Set |host|'s installing version to null. |
+ host->SetInstallingVersion(version); |
} |
} |
} |
// static |
-void ServiceWorkerRegisterJob::DisassociateWaitingVersionFromDocuments( |
+void ServiceWorkerRegisterJob::DisassociateVersionFromDocuments( |
base::WeakPtr<ServiceWorkerContextCore> context, |
- int64 version_id) { |
+ ServiceWorkerVersion* version) { |
DCHECK(context); |
for (scoped_ptr<ServiceWorkerContextCore::ProviderHostIterator> it = |
context->GetProviderHostIterator(); |
- !it->IsAtEnd(); |
- it->Advance()) { |
+ !it->IsAtEnd(); it->Advance()) { |
ServiceWorkerProviderHost* host = it->GetProviderHost(); |
- if (!host->IsContextAlive()) |
- continue; |
- if (host->waiting_version() && |
- host->waiting_version()->version_id() == version_id) { |
- host->SetWaitingVersion(NULL); |
- } |
+ host->UnsetVersion(version); |
} |
} |