| 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 e30a6b2d60c29bbef230ca8f36846b69497ea6a3..946397d56042b0d3d1976e233003088750e826cd 100644
|
| --- a/content/browser/service_worker/service_worker_provider_host.cc
|
| +++ b/content/browser/service_worker/service_worker_provider_host.cc
|
| @@ -30,8 +30,10 @@ ServiceWorkerProviderHost::ServiceWorkerProviderHost(
|
| }
|
|
|
| ServiceWorkerProviderHost::~ServiceWorkerProviderHost() {
|
| + if (controlling_version_)
|
| + controlling_version_->RemoveControllee(this);
|
| if (active_version_)
|
| - active_version_->RemoveControllee(this);
|
| + active_version_->RemovePotentialControllee(this);
|
| if (waiting_version_)
|
| waiting_version_->RemovePotentialControllee(this);
|
| if (installing_version_)
|
| @@ -43,6 +45,25 @@ void ServiceWorkerProviderHost::SetDocumentUrl(const GURL& url) {
|
| document_url_ = url;
|
| }
|
|
|
| +void ServiceWorkerProviderHost::SetControllerVersion(
|
| + ServiceWorkerVersion* version) {
|
| + DCHECK(CanAssociateVersion(version));
|
| + if (version == controlling_version_)
|
| + return;
|
| + scoped_refptr<ServiceWorkerVersion> previous_version = controlling_version_;
|
| + controlling_version_ = version;
|
| + if (version)
|
| + version->AddControllee(this);
|
| + if (previous_version)
|
| + previous_version->RemoveControllee(this);
|
| +
|
| + if (!dispatcher_host_)
|
| + return; // Could be NULL in some tests.
|
| +
|
| + dispatcher_host_->Send(new ServiceWorkerMsg_SetControllerServiceWorker(
|
| + kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
|
| +}
|
| +
|
| void ServiceWorkerProviderHost::SetActiveVersion(
|
| ServiceWorkerVersion* version) {
|
| DCHECK(CanAssociateVersion(version));
|
| @@ -51,14 +72,14 @@ void ServiceWorkerProviderHost::SetActiveVersion(
|
| scoped_refptr<ServiceWorkerVersion> previous_version = active_version_;
|
| active_version_ = version;
|
| if (version)
|
| - version->AddControllee(this);
|
| + version->AddPotentialControllee(this);
|
| if (previous_version)
|
| - previous_version->RemoveControllee(this);
|
| + previous_version->RemovePotentialControllee(this);
|
|
|
| if (!dispatcher_host_)
|
| return; // Could be NULL in some tests.
|
|
|
| - dispatcher_host_->Send(new ServiceWorkerMsg_SetControllerServiceWorker(
|
| + dispatcher_host_->Send(new ServiceWorkerMsg_SetActiveServiceWorker(
|
| kDocumentMainThreadId, provider_id(), CreateHandleAndPass(version)));
|
| }
|
|
|
| @@ -109,6 +130,8 @@ void ServiceWorkerProviderHost::UnsetVersion(ServiceWorkerVersion* version) {
|
| SetWaitingVersion(NULL);
|
| else if (active_version_ == version)
|
| SetActiveVersion(NULL);
|
| + else if (controlling_version_ == version)
|
| + SetControllerVersion(NULL);
|
| }
|
|
|
| bool ServiceWorkerProviderHost::SetHostedVersionId(int64 version_id) {
|
| @@ -161,6 +184,8 @@ bool ServiceWorkerProviderHost::CanAssociateVersion(
|
| return true;
|
|
|
| ServiceWorkerVersion* already_associated_version = NULL;
|
| + if (controlling_version_)
|
| + already_associated_version = controlling_version_;
|
| if (active_version_)
|
| already_associated_version = active_version_;
|
| else if (waiting_version_)
|
|
|