Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(705)

Unified Diff: content/browser/service_worker/service_worker_provider_host.cc

Issue 360123002: ServiceWorker: some more groundwork in support of the update process (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 =

Powered by Google App Engine
This is Rietveld 408576698