Chromium Code Reviews| Index: content/browser/service_worker/service_worker_provider_host.cc |
| diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc |
| index eeba3736d036920663b8cf3195177283bad7056b..fdfcff2d68ec32eb583f80ed57dd03a68becfbac 100644 |
| --- a/content/browser/service_worker/service_worker_provider_host.cc |
| +++ b/content/browser/service_worker/service_worker_provider_host.cc |
| @@ -61,7 +61,7 @@ void ServiceWorkerProviderHost::SetActiveVersion( |
| void ServiceWorkerProviderHost::SetWaitingVersion( |
| ServiceWorkerVersion* version) { |
| - DCHECK(ValidateVersionForAssociation(version)); |
| + DCHECK(CanAssociateVersion(version)); |
| if (version == waiting_version_) |
| return; |
| scoped_refptr<ServiceWorkerVersion> previous_version = waiting_version_; |
| @@ -78,6 +78,36 @@ void ServiceWorkerProviderHost::SetWaitingVersion( |
| kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version))); |
| } |
| +void ServiceWorkerProviderHost::SetInstallingVersion( |
| + ServiceWorkerVersion* version) { |
| + DCHECK(CanAssociateVersion(version)); |
| + if (version == installing_version_) |
| + return; |
| + scoped_refptr<ServiceWorkerVersion> previous_version = installing_version_; |
| + installing_version_ = version; |
| + if (version) |
| + version->AddWaitingControllee(this); |
| + if (previous_version) |
| + previous_version->RemoveWaitingControllee(this); |
|
nhiroki
2014/07/02 07:25:12
We are adding/removing 'this' as a waiting control
michaeln
2014/07/02 23:17:14
ooops, i've generalized this to add/rmv PotentialC
|
| + |
| + if (!dispatcher_host_) |
| + return; // Could be NULL in some tests. |
| + |
| + dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker( |
|
nhiroki
2014/07/02 07:25:11
nit: indent looks broken.
michaeln
2014/07/02 23:17:14
also added a comment about updating the msg once t
michaeln
2014/07/02 23:17:14
Done.
|
| + kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version))); |
| +} |
| + |
| +void ServiceWorkerProviderHost::UnsetVersion(ServiceWorkerVersion* version) { |
| + if (!version) |
| + return; |
| + if (installing_version_ == version) |
| + SetInstallingVersion(NULL); |
| + else if (waiting_version_ == version) |
| + SetWaitingVersion(NULL); |
| + else if (active_version_ == version) |
| + SetActiveVersion(NULL); |
| +} |
| + |
| bool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) { |
| if (!context_) |
| return true; // System is shutting down. |
| @@ -118,26 +148,26 @@ ServiceWorkerProviderHost::CreateRequestHandler( |
| return scoped_ptr<ServiceWorkerRequestHandler>(); |
| } |
| -bool ServiceWorkerProviderHost::ValidateVersionForAssociation( |
| +bool ServiceWorkerProviderHost::CanAssociateVersion( |
| ServiceWorkerVersion* version) { |
| + if (!context_) |
| + return false; |
| if (running_hosted_version_) |
| return false; |
| if (!version) |
| return true; |
| - // A version to be associated with this provider should have the same |
| - // registration (scope) as current active/waiting versions. |
| - if (active_version_) { |
| - if (active_version_->registration_id() != version->registration_id()) |
| - return false; |
| - DCHECK_EQ(active_version_->scope(), version->scope()); |
| - } |
| - if (waiting_version_) { |
| - if (waiting_version_->registration_id() != version->registration_id()) |
| - return false; |
| - DCHECK_EQ(waiting_version_->scope(), version->scope()); |
| - } |
| - return true; |
| + ServiceWorkerVersion* already_associated_version = NULL; |
| + if (active_version_) |
| + already_associated_version = active_version_; |
| + else if (waiting_version_) |
| + already_associated_version = waiting_version_; |
| + else if (installing_version_) |
| + already_associated_version = installing_version_; |
| + |
| + return !already_associated_version || |
| + already_associated_version->registration_id() == |
| + version->registration_id(); |
| } |
| void ServiceWorkerProviderHost::PostMessage( |
| @@ -161,7 +191,6 @@ void ServiceWorkerProviderHost::PostMessage( |
| ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass( |
| ServiceWorkerVersion* version) { |
| - DCHECK(ValidateVersionForAssociation(version)); |
| ServiceWorkerObjectInfo info; |
| if (context_ && version) { |
| scoped_ptr<ServiceWorkerHandle> handle = |