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_) |