1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_
6 #define CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_
10 #include "base/memory/weak_ptr.h"
11 #include "content/browser/service_worker/service_worker_registration_status.h"
12 #include "content/browser/service_worker/service_worker_storage.h"
13 #include "content/browser/service_worker/service_worker_version.h"
17 class EmbeddedWorkerRegistry;
18 class ServiceWorkerJobCoordinator;
20 // A ServiceWorkerRegisterJob lives only for the lifetime of a single
21 // registration or unregistration.
22 class ServiceWorkerRegisterJob {
24 enum RegistrationType {
29 typedef base::Callback<void(ServiceWorkerStatusCode status,
30 const scoped_refptr<ServiceWorkerRegistration>&
31 registration)> RegistrationCallback;
32 typedef base::Callback<void(ServiceWorkerStatusCode status)>
33 UnregistrationCallback;
34 // TODO(alecflett): Unify this with RegistrationCallback
35 typedef base::Callback<
36 void(const scoped_refptr<ServiceWorkerRegistration>& registration,
37 ServiceWorkerStatusCode status)> StatusCallback;
39 // All type of jobs (Register and Unregister) complete through a
40 // single call to this callback on the IO thread.
41 ServiceWorkerRegisterJob(ServiceWorkerStorage* storage,
42 EmbeddedWorkerRegistry* worker_registry,
43 ServiceWorkerJobCoordinator* coordinator,
45 const GURL& script_url,
46 RegistrationType type);
47 ~ServiceWorkerRegisterJob();
49 void AddCallback(const RegistrationCallback& callback, int process_id);
53 bool Equals(ServiceWorkerRegisterJob* job);
56 // The Registration flow includes most or all of the following,
57 // depending on what is already registered:
58 // - creating a ServiceWorkerRegistration instance if there isn't
59 // already something registered
60 // - creating a ServiceWorkerVersion for the new registration instance.
61 // - starting a worker for the ServiceWorkerVersion
62 // - telling the Version to evaluate the script
63 // - firing the 'install' event at the ServiceWorkerVersion
64 // - firing the 'activate' event at the ServiceWorkerVersion
65 // - Waiting for older ServiceWorkerVersions to deactivate
66 // - designating the new version to be the 'active' version
67 // This method should be called once and only once per job.
70 // The Unregistration process is primarily cleanup, removing
71 // everything that was created during the Registration process,
72 // including the ServiceWorkerRegistration itself.
73 // This method should be called once and only once per job.
74 void StartUnregister();
76 // These are all steps in the registration and unregistration pipeline.
77 void RegisterPatternAndContinue(
78 const RegistrationCallback& callback,
79 ServiceWorkerStatusCode previous_status);
81 void UnregisterPatternAndContinue(
82 const UnregistrationCallback& callback,
84 ServiceWorkerStatusCode previous_status,
85 const scoped_refptr<ServiceWorkerRegistration>& previous_registration);
87 void StartWorkerAndContinue(
88 const StatusCallback& callback,
89 ServiceWorkerStatusCode status,
90 const scoped_refptr<ServiceWorkerRegistration>& registration);
92 // These methods are the last internal callback in the callback
93 // chain, and ultimately call callback_.
94 void UnregisterComplete(ServiceWorkerStatusCode status);
95 void RegisterComplete(
96 const scoped_refptr<ServiceWorkerRegistration>& registration,
97 ServiceWorkerStatusCode start_status);
100 ServiceWorkerStatusCode status,
101 const scoped_refptr<ServiceWorkerRegistration>& registration);
103 // The ServiceWorkerStorage object should always outlive
106 // TODO(alecflett) When we support job cancelling, if we are keeping
107 // this job alive for any reason, be sure to clear this variable,
108 // because we may be cancelling while there are outstanding
109 // callbacks that expect access to storage_.
110 ServiceWorkerStorage* storage_;
111 EmbeddedWorkerRegistry* worker_registry_;
112 ServiceWorkerJobCoordinator* coordinator_;
113 scoped_refptr<ServiceWorkerVersion> pending_version_;
115 const GURL script_url_;
116 const RegistrationType type_;
117 std::vector<RegistrationCallback> callbacks_;
118 std::vector<int> pending_process_ids_;
119 base::WeakPtrFactory<ServiceWorkerRegisterJob> weak_factory_;
121 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRegisterJob);
123 } // namespace content
125 #endif // CONTENT_BROWSER_SERVICE_WORKER_SERVICE_WORKER_REGISTER_JOB_H_