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

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

Issue 355163003: Don't prematurely delete script resources when registration is deleted (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_unregister_job.cc
diff --git a/content/browser/service_worker/service_worker_unregister_job.cc b/content/browser/service_worker/service_worker_unregister_job.cc
index 48f51ee12c00a1dc67ba9749e78a75cec8ac639c..67fb7befcf94f9315c645fb59b35c9759a2ba8e6 100644
--- a/content/browser/service_worker/service_worker_unregister_job.cc
+++ b/content/browser/service_worker/service_worker_unregister_job.cc
@@ -18,7 +18,9 @@ ServiceWorkerUnregisterJob::ServiceWorkerUnregisterJob(
const GURL& pattern)
: context_(context),
pattern_(pattern),
- weak_factory_(this) {}
+ is_promise_resolved_(false),
+ weak_factory_(this) {
+}
ServiceWorkerUnregisterJob::~ServiceWorkerUnregisterJob() {}
@@ -63,24 +65,46 @@ void ServiceWorkerUnregisterJob::OnRegistrationFound(
}
DCHECK(registration);
- DeleteRegistration(registration);
+ registration_ = registration;
+ ResolvePromise(status);
+ UninstallRegistration();
}
-void ServiceWorkerUnregisterJob::DeleteRegistration(
- const scoped_refptr<ServiceWorkerRegistration>& registration) {
+void ServiceWorkerUnregisterJob::UninstallRegistration() {
+ registration_->mark_as_uninstalling();
+
// TODO(nhiroki): When we've implemented the installing version, terminate and
// set it to redundant here as per spec.
+ context_->storage()->DeleteRegistration(
+ registration_->id(),
+ registration_->script_url().GetOrigin(),
+ base::Bind(&ServiceWorkerUnregisterJob::DeleteWaitingVersion,
+ weak_factory_.GetWeakPtr()));
+}
- if (registration->waiting_version()) {
- registration->waiting_version()->SetStatus(
- ServiceWorkerVersion::REDUNDANT);
+void ServiceWorkerUnregisterJob::DeleteWaitingVersion(
+ ServiceWorkerStatusCode status) {
+ // Nothing we can do about a bad status, keep trying to delete stuff.
+ if (!registration_->waiting_version()) {
+ DeleteActiveVersion(status);
+ return;
}
+ registration_->waiting_version()->SetStatus(ServiceWorkerVersion::REDUNDANT);
+ context_->storage()->DeleteVersionResources(
+ registration_->waiting_version()->version_id(),
+ base::Bind(&ServiceWorkerUnregisterJob::DeleteActiveVersion,
+ weak_factory_.GetWeakPtr()));
+}
- // TODO(michaeln): Eventually call storage->DeleteVersionResources() when the
- // version no longer has any controllees.
- context_->storage()->DeleteRegistration(
- registration->id(),
- registration->script_url().GetOrigin(),
+void ServiceWorkerUnregisterJob::DeleteActiveVersion(
+ ServiceWorkerStatusCode status) {
+ ServiceWorkerVersion* active_version = registration_->active_version();
+ if (!active_version || active_version->HasControllee()) {
+ Complete(status);
+ return;
+ }
+ context_->storage()->DeleteVersionResources(
+ active_version->version_id(),
base::Bind(&ServiceWorkerUnregisterJob::Complete,
weak_factory_.GetWeakPtr()));
}
@@ -92,11 +116,19 @@ void ServiceWorkerUnregisterJob::Complete(ServiceWorkerStatusCode status) {
void ServiceWorkerUnregisterJob::CompleteInternal(
ServiceWorkerStatusCode status) {
+ if (!is_promise_resolved_)
+ ResolvePromise(status);
+}
+
+void ServiceWorkerUnregisterJob::ResolvePromise(
+ ServiceWorkerStatusCode status) {
+ DCHECK(!is_promise_resolved_);
for (std::vector<UnregistrationCallback>::iterator it = callbacks_.begin();
it != callbacks_.end();
++it) {
it->Run(status);
}
+ callbacks_.clear();
}
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698