| 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..14f2f1e3aad14e6f81d7dda2a7cad1a4b55959ba 100644
|
| --- a/content/browser/service_worker/service_worker_provider_host.cc
|
| +++ b/content/browser/service_worker/service_worker_provider_host.cc
|
| @@ -33,7 +33,9 @@ ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
|
| if (active_version_)
|
| active_version_->RemoveControllee(this);
|
| if (waiting_version_)
|
| - waiting_version_->RemoveWaitingControllee(this);
|
| + waiting_version_->RemovePotentialControllee(this);
|
| + if (installing_version_)
|
| + installing_version_->RemovePotentialControllee(this);
|
| }
|
|
|
| void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
|
| @@ -43,6 +45,7 @@ void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
|
|
|
| void ServiceWorkerProviderHost::SetActiveVersion(
|
| ServiceWorkerVersion* version) {
|
| + DCHECK(CanAssociateVersion(version));
|
| if (version == active_version_)
|
| return;
|
| scoped_refptr<ServiceWorkerVersion> previous_version = active_version_;
|
| @@ -61,15 +64,15 @@ 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_;
|
| waiting_version_ = version;
|
| if (version)
|
| - version->AddWaitingControllee(this);
|
| + version->AddPotentialControllee(this);
|
| if (previous_version)
|
| - previous_version->RemoveWaitingControllee(this);
|
| + previous_version->RemovePotentialControllee(this);
|
|
|
| if (!dispatcher_host_)
|
| return; // Could be NULL in some tests.
|
| @@ -78,6 +81,38 @@ 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->AddPotentialControllee(this);
|
| + if (previous_version)
|
| + previous_version->RemovePotentialControllee(this);
|
| +
|
| + if (!dispatcher_host_)
|
| + return; // Could be NULL in some tests.
|
| +
|
| + // TODO(michaeln): Update once the renderer side understands the .installing
|
| + // attribute value.
|
| + dispatcher_host_->Send(new ServiceWorkerMsg_SetWaitingServiceWorker(
|
| + 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 +153,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 +196,6 @@ void ServiceWorkerProviderHost::PostMessage(
|
|
|
| ServiceWorkerObjectInfo ServiceWorkerProviderHost::CreateHandleAndPass(
|
| ServiceWorkerVersion* version) {
|
| - DCHECK(ValidateVersionForAssociation(version));
|
| ServiceWorkerObjectInfo info;
|
| if (context_ && version) {
|
| scoped_ptr<ServiceWorkerHandle> handle =
|
|
|