summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/service_worker/service_worker_unregister_job.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/service_worker/service_worker_unregister_job.cc')
-rw-r--r--chromium/content/browser/service_worker/service_worker_unregister_job.cc90
1 files changed, 90 insertions, 0 deletions
diff --git a/chromium/content/browser/service_worker/service_worker_unregister_job.cc b/chromium/content/browser/service_worker/service_worker_unregister_job.cc
new file mode 100644
index 00000000000..dabcd22f108
--- /dev/null
+++ b/chromium/content/browser/service_worker/service_worker_unregister_job.cc
@@ -0,0 +1,90 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/service_worker/service_worker_unregister_job.h"
+
+#include "content/browser/service_worker/service_worker_context_core.h"
+#include "content/browser/service_worker/service_worker_job_coordinator.h"
+#include "content/browser/service_worker/service_worker_registration.h"
+#include "content/browser/service_worker/service_worker_storage.h"
+
+namespace content {
+
+typedef ServiceWorkerRegisterJobBase::RegistrationJobType RegistrationJobType;
+
+ServiceWorkerUnregisterJob::ServiceWorkerUnregisterJob(
+ base::WeakPtr<ServiceWorkerContextCore> context,
+ const GURL& pattern)
+ : context_(context),
+ pattern_(pattern),
+ weak_factory_(this) {}
+
+ServiceWorkerUnregisterJob::~ServiceWorkerUnregisterJob() {}
+
+void ServiceWorkerUnregisterJob::AddCallback(
+ const UnregistrationCallback& callback) {
+ callbacks_.push_back(callback);
+}
+
+void ServiceWorkerUnregisterJob::Start() {
+ context_->storage()->FindRegistrationForPattern(
+ pattern_,
+ base::Bind(&ServiceWorkerUnregisterJob::DeleteExistingRegistration,
+ weak_factory_.GetWeakPtr()));
+}
+
+void ServiceWorkerUnregisterJob::Abort() {
+ CompleteInternal(SERVICE_WORKER_ERROR_ABORT);
+}
+
+bool ServiceWorkerUnregisterJob::Equals(ServiceWorkerRegisterJobBase* job) {
+ if (job->GetType() != GetType())
+ return false;
+ return static_cast<ServiceWorkerUnregisterJob*>(job)->pattern_ == pattern_;
+}
+
+RegistrationJobType ServiceWorkerUnregisterJob::GetType() {
+ return ServiceWorkerRegisterJobBase::UNREGISTRATION;
+}
+
+void ServiceWorkerUnregisterJob::DeleteExistingRegistration(
+ ServiceWorkerStatusCode status,
+ const scoped_refptr<ServiceWorkerRegistration>& registration) {
+ if (status == SERVICE_WORKER_OK) {
+ DCHECK(registration);
+ // TODO(michaeln): Deactivate the live registration object and
+ // eventually call storage->DeleteVersionResources()
+ // when the version no longer has any controllees.
+ context_->storage()->DeleteRegistration(
+ registration->id(),
+ registration->script_url().GetOrigin(),
+ base::Bind(&ServiceWorkerUnregisterJob::Complete,
+ weak_factory_.GetWeakPtr()));
+ return;
+ }
+
+ if (status == SERVICE_WORKER_ERROR_NOT_FOUND) {
+ DCHECK(!registration);
+ Complete(SERVICE_WORKER_OK);
+ return;
+ }
+
+ Complete(status);
+}
+
+void ServiceWorkerUnregisterJob::Complete(ServiceWorkerStatusCode status) {
+ CompleteInternal(status);
+ context_->job_coordinator()->FinishJob(pattern_, this);
+}
+
+void ServiceWorkerUnregisterJob::CompleteInternal(
+ ServiceWorkerStatusCode status) {
+ for (std::vector<UnregistrationCallback>::iterator it = callbacks_.begin();
+ it != callbacks_.end();
+ ++it) {
+ it->Run(status);
+ }
+}
+
+} // namespace content