summaryrefslogtreecommitdiffstats
path: root/chromium/content/browser/service_worker/service_worker_job_coordinator.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/service_worker/service_worker_job_coordinator.h')
-rw-r--r--chromium/content/browser/service_worker/service_worker_job_coordinator.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/chromium/content/browser/service_worker/service_worker_job_coordinator.h b/chromium/content/browser/service_worker/service_worker_job_coordinator.h
new file mode 100644
index 00000000000..06a1057d76e
--- /dev/null
+++ b/chromium/content/browser/service_worker/service_worker_job_coordinator.h
@@ -0,0 +1,85 @@
+// 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.
+
+#ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_
+#define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_
+
+#include <deque>
+#include <map>
+
+#include "content/browser/service_worker/service_worker_register_job.h"
+#include "content/browser/service_worker/service_worker_unregister_job.h"
+#include "content/common/content_export.h"
+#include "url/gurl.h"
+
+namespace content {
+
+class EmbeddedWorkerRegistry;
+class ServiceWorkerRegistration;
+class ServiceWorkerStorage;
+
+// This class manages all in-flight registration or unregistration jobs.
+class CONTENT_EXPORT ServiceWorkerJobCoordinator {
+ public:
+ explicit ServiceWorkerJobCoordinator(
+ base::WeakPtr<ServiceWorkerContextCore> context);
+ ~ServiceWorkerJobCoordinator();
+
+ void Register(const GURL& pattern,
+ const GURL& script_url,
+ int source_process_id,
+ const ServiceWorkerRegisterJob::RegistrationCallback& callback);
+
+ void Unregister(
+ const GURL& pattern,
+ const ServiceWorkerUnregisterJob::UnregistrationCallback& callback);
+
+ // Calls ServiceWorkerRegisterJobBase::Abort() on all jobs and removes them.
+ void AbortAll();
+
+ // Removes the job. A job that was not aborted must call FinishJob when it is
+ // done.
+ void FinishJob(const GURL& pattern, ServiceWorkerRegisterJobBase* job);
+
+ private:
+ class JobQueue {
+ public:
+ JobQueue();
+ ~JobQueue();
+
+ // Adds a job to the queue. If an identical job is already in the queue, no
+ // new job is added. Returns the job in the queue, regardless of whether it
+ // was newly added.
+ ServiceWorkerRegisterJobBase* Push(
+ scoped_ptr<ServiceWorkerRegisterJobBase> job);
+
+ // Removes a job from the queue.
+ void Pop(ServiceWorkerRegisterJobBase* job);
+
+ bool empty() { return jobs_.empty(); }
+
+ // Aborts all jobs in the queue and removes them.
+ void AbortAll();
+
+ // Marks that the browser is shutting down, so jobs may be destroyed before
+ // finishing.
+ void ClearForShutdown();
+
+ private:
+ std::deque<ServiceWorkerRegisterJobBase*> jobs_;
+ };
+
+ typedef std::map<GURL, JobQueue> RegistrationJobMap;
+
+ // The ServiceWorkerContextCore object should always outlive the
+ // job coordinator, the core owns the coordinator.
+ base::WeakPtr<ServiceWorkerContextCore> context_;
+ RegistrationJobMap job_queues_;
+
+ DISALLOW_COPY_AND_ASSIGN(ServiceWorkerJobCoordinator);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_JOB_COORDINATOR_H_