OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/service_worker/service_worker_register_job.h" | 5 #include "content/browser/service_worker/service_worker_register_job.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "content/browser/service_worker/service_worker_job_coordinator.h" | 9 #include "content/browser/service_worker/service_worker_job_coordinator.h" |
10 #include "content/browser/service_worker/service_worker_registration.h" | 10 #include "content/browser/service_worker/service_worker_registration.h" |
11 #include "content/public/browser/browser_thread.h" | 11 #include "content/public/browser/browser_thread.h" |
12 #include "url/gurl.h" | 12 #include "url/gurl.h" |
13 | 13 |
14 namespace content { | 14 namespace content { |
15 | 15 |
16 ServiceWorkerRegisterJob::ServiceWorkerRegisterJob( | 16 ServiceWorkerRegisterJob::ServiceWorkerRegisterJob( |
17 ServiceWorkerStorage* storage, | 17 ServiceWorkerStorage* storage, |
18 EmbeddedWorkerRegistry* worker_registry, | |
18 ServiceWorkerJobCoordinator* coordinator, | 19 ServiceWorkerJobCoordinator* coordinator, |
19 const GURL& pattern, | 20 const GURL& pattern, |
20 const GURL& script_url, | 21 const GURL& script_url, |
21 RegistrationType type) | 22 RegistrationType type) |
22 : storage_(storage), | 23 : storage_(storage), |
24 worker_registry_(worker_registry), | |
23 coordinator_(coordinator), | 25 coordinator_(coordinator), |
26 pending_version_(NULL), | |
24 pattern_(pattern), | 27 pattern_(pattern), |
25 script_url_(script_url), | 28 script_url_(script_url), |
26 type_(type), | 29 type_(type), |
27 weak_factory_(this) {} | 30 weak_factory_(this) {} |
28 | 31 |
29 ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {} | 32 ServiceWorkerRegisterJob::~ServiceWorkerRegisterJob() {} |
30 | 33 |
31 void ServiceWorkerRegisterJob::AddCallback( | 34 void ServiceWorkerRegisterJob::AddCallback( |
32 const RegistrationCallback& callback) { | 35 const RegistrationCallback& callback, |
36 ServiceWorkerProviderHost* source_provider) { | |
37 // if we've created a pending version, associate source_provider it with | |
38 // that, otherwise queue it up | |
33 callbacks_.push_back(callback); | 39 callbacks_.push_back(callback); |
40 DCHECK(source_provider); | |
41 if (pending_version_) { | |
42 pending_version_->OnAssociateProvider(source_provider); | |
kinuko
2014/01/20 09:39:09
How do we relate this to ServiceWorkerRegistration
| |
43 } else { | |
44 pending_provider_hosts_.push_back(source_provider); | |
45 } | |
34 } | 46 } |
35 | 47 |
36 void ServiceWorkerRegisterJob::Start() { | 48 void ServiceWorkerRegisterJob::Start() { |
37 if (type_ == REGISTER) | 49 if (type_ == REGISTER) |
38 StartRegister(); | 50 StartRegister(); |
39 else | 51 else |
40 StartUnregister(); | 52 StartUnregister(); |
41 } | 53 } |
42 | 54 |
43 bool ServiceWorkerRegisterJob::Equals(ServiceWorkerRegisterJob* job) { | 55 bool ServiceWorkerRegisterJob::Equals(ServiceWorkerRegisterJob* job) { |
44 return job->type_ == type_ && | 56 return job->type_ == type_ && |
45 (type_ == ServiceWorkerRegisterJob::UNREGISTER || | 57 (type_ == ServiceWorkerRegisterJob::UNREGISTER || |
46 job->script_url_ == script_url_); | 58 job->script_url_ == script_url_); |
47 } | 59 } |
48 | 60 |
49 void ServiceWorkerRegisterJob::StartRegister() { | 61 void ServiceWorkerRegisterJob::StartRegister() { |
50 // Set up a chain of callbacks, in reverse order. Each of these | 62 // Set up a chain of callbacks, in reverse order. Each of these |
51 // callbacks may be called asynchronously by the previous callback. | 63 // callbacks may be called asynchronously by the previous callback. |
52 RegistrationCallback finish_registration(base::Bind( | 64 base::Callback<void(ServiceWorkerRegistrationStatus, |
53 &ServiceWorkerRegisterJob::RegisterComplete, weak_factory_.GetWeakPtr())); | 65 const scoped_refptr<ServiceWorkerRegistration>&, |
66 ServiceWorkerVersionStatus)> | |
67 finish_registration( | |
68 base::Bind(&ServiceWorkerRegisterJob::RegisterComplete, | |
69 weak_factory_.GetWeakPtr())); | |
70 | |
71 RegistrationCallback start_worker( | |
72 base::Bind(&ServiceWorkerRegisterJob::StartWorkerAndContinue, | |
73 weak_factory_.GetWeakPtr(), | |
74 finish_registration)); | |
54 | 75 |
55 UnregistrationCallback register_new( | 76 UnregistrationCallback register_new( |
56 base::Bind(&ServiceWorkerRegisterJob::RegisterPatternAndContinue, | 77 base::Bind(&ServiceWorkerRegisterJob::RegisterPatternAndContinue, |
57 weak_factory_.GetWeakPtr(), | 78 weak_factory_.GetWeakPtr(), |
58 finish_registration)); | 79 start_worker)); |
59 | 80 |
60 ServiceWorkerStorage::FindRegistrationCallback unregister_old( | 81 ServiceWorkerStorage::FindRegistrationCallback unregister_old( |
61 base::Bind(&ServiceWorkerRegisterJob::UnregisterPatternAndContinue, | 82 base::Bind(&ServiceWorkerRegisterJob::UnregisterPatternAndContinue, |
62 weak_factory_.GetWeakPtr(), | 83 weak_factory_.GetWeakPtr(), |
63 register_new)); | 84 register_new)); |
kinuko
2014/01/28 06:34:55
While revisiting the installation flow this just c
| |
64 | 85 |
65 storage_->FindRegistrationForPattern(pattern_, unregister_old); | 86 storage_->FindRegistrationForPattern(pattern_, unregister_old); |
66 } | 87 } |
67 | 88 |
68 void ServiceWorkerRegisterJob::StartUnregister() { | 89 void ServiceWorkerRegisterJob::StartUnregister() { |
69 // Set up a chain of callbacks, in reverse order. Each of these | 90 // Set up a chain of callbacks, in reverse order. Each of these |
70 // callbacks may be called asynchronously by the previous callback. | 91 // callbacks may be called asynchronously by the previous callback. |
71 UnregistrationCallback finish_unregistration( | 92 UnregistrationCallback finish_unregistration( |
72 base::Bind(&ServiceWorkerRegisterJob::UnregisterComplete, | 93 base::Bind(&ServiceWorkerRegisterJob::UnregisterComplete, |
73 weak_factory_.GetWeakPtr())); | 94 weak_factory_.GetWeakPtr())); |
(...skipping 16 matching lines...) Expand all Loading... | |
90 base::Bind(callback, | 111 base::Bind(callback, |
91 previous_status, | 112 previous_status, |
92 scoped_refptr<ServiceWorkerRegistration>())); | 113 scoped_refptr<ServiceWorkerRegistration>())); |
93 return; | 114 return; |
94 } | 115 } |
95 | 116 |
96 // TODO: Eventually RegisterInternal will be replaced by an asynchronous | 117 // TODO: Eventually RegisterInternal will be replaced by an asynchronous |
97 // operation. Pass its resulting status through 'callback'. | 118 // operation. Pass its resulting status through 'callback'. |
98 scoped_refptr<ServiceWorkerRegistration> registration = | 119 scoped_refptr<ServiceWorkerRegistration> registration = |
99 storage_->RegisterInternal(pattern_, script_url_); | 120 storage_->RegisterInternal(pattern_, script_url_); |
121 | |
100 BrowserThread::PostTask(BrowserThread::IO, | 122 BrowserThread::PostTask(BrowserThread::IO, |
101 FROM_HERE, | 123 FROM_HERE, |
102 base::Bind(callback, REGISTRATION_OK, registration)); | 124 base::Bind(callback, REGISTRATION_OK, registration)); |
103 } | 125 } |
104 | 126 |
105 void ServiceWorkerRegisterJob::UnregisterPatternAndContinue( | 127 void ServiceWorkerRegisterJob::UnregisterPatternAndContinue( |
106 const UnregistrationCallback& callback, | 128 const UnregistrationCallback& callback, |
107 bool found, | 129 bool found, |
108 ServiceWorkerRegistrationStatus previous_status, | 130 ServiceWorkerRegistrationStatus previous_status, |
109 const scoped_refptr<ServiceWorkerRegistration>& previous_registration) { | 131 const scoped_refptr<ServiceWorkerRegistration>& previous_registration) { |
110 | 132 |
111 // The previous registration may not exist, which is ok. | 133 // The previous registration may not exist, which is ok. |
112 if (previous_status == REGISTRATION_OK && found && | 134 if (previous_status == REGISTRATION_OK && found && |
113 (script_url_.is_empty() || | 135 (script_url_.is_empty() || |
114 previous_registration->script_url() != script_url_)) { | 136 previous_registration->script_url() != script_url_)) { |
115 // TODO: Eventually UnregisterInternal will be replaced by an | 137 // TODO: Eventually UnregisterInternal will be replaced by an |
116 // asynchronous operation. Pass its resulting status though | 138 // asynchronous operation. Pass its resulting status though |
117 // 'callback'. | 139 // 'callback'. |
118 storage_->UnregisterInternal(pattern_); | 140 storage_->UnregisterInternal(pattern_); |
119 DCHECK(previous_registration->is_shutdown()); | 141 DCHECK(previous_registration->is_shutdown()); |
120 } | 142 } |
121 BrowserThread::PostTask( | 143 BrowserThread::PostTask( |
122 BrowserThread::IO, FROM_HERE, base::Bind(callback, previous_status)); | 144 BrowserThread::IO, FROM_HERE, base::Bind(callback, previous_status)); |
123 } | 145 } |
124 | 146 |
147 void ServiceWorkerRegisterJob::StartWorkerAndContinue( | |
148 const base::Callback<void(ServiceWorkerRegistrationStatus, | |
149 const scoped_refptr<ServiceWorkerRegistration>&, | |
150 ServiceWorkerVersionStatus)> callback, | |
151 ServiceWorkerRegistrationStatus status, | |
152 const scoped_refptr<ServiceWorkerRegistration>& registration) { | |
153 pending_version_ = new ServiceWorkerVersion( | |
154 registration, worker_registry_, registration->next_version_id(), -1L); | |
155 LOG(ERROR) << "StartWorkerAndContinue..."; | |
156 for (std::vector<ServiceWorkerProviderHost*>::const_iterator it = | |
157 pending_provider_hosts_.begin(); | |
158 it != pending_provider_hosts_.end(); | |
159 ++it) | |
160 pending_version_->OnAssociateProvider(*it); | |
kinuko
2014/01/20 09:39:09
As I wrote above I feel this association should be
| |
161 | |
162 pending_version_->StartWorker(base::Bind(callback, status, registration)); | |
163 } | |
164 | |
125 void ServiceWorkerRegisterJob::RunCallbacks( | 165 void ServiceWorkerRegisterJob::RunCallbacks( |
126 ServiceWorkerRegistrationStatus status, | 166 ServiceWorkerRegistrationStatus status, |
127 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 167 const scoped_refptr<ServiceWorkerRegistration>& registration) { |
128 for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin(); | 168 for (std::vector<RegistrationCallback>::iterator it = callbacks_.begin(); |
129 it != callbacks_.end(); | 169 it != callbacks_.end(); |
130 ++it) { | 170 ++it) { |
131 it->Run(status, registration); | 171 it->Run(status, registration); |
132 } | 172 } |
133 } | 173 } |
134 void ServiceWorkerRegisterJob::RegisterComplete( | 174 void ServiceWorkerRegisterJob::RegisterComplete( |
135 ServiceWorkerRegistrationStatus status, | 175 ServiceWorkerRegistrationStatus status, |
136 const scoped_refptr<ServiceWorkerRegistration>& registration) { | 176 const scoped_refptr<ServiceWorkerRegistration>& registration, |
137 RunCallbacks(status, registration); | 177 ServiceWorkerVersionStatus version_status) { |
178 ServiceWorkerRegistrationStatus registration_status; | |
179 switch (version_status) { | |
180 case SERVICE_WORKER_VERSION_OK: | |
181 registration_status = REGISTRATION_OK; | |
182 break; | |
183 | |
184 case SERVICE_WORKER_VERSION_ERROR_FAILED: | |
185 case SERVICE_WORKER_VERSION_ERROR_START_FAILED: | |
186 case SERVICE_WORKER_VERSION_ERROR_INSTALL_FAILED: | |
187 registration_status = REGISTRATION_INSTALL_FAILED; | |
188 break; | |
189 } | |
190 RunCallbacks(registration_status, registration); | |
138 coordinator_->FinishJob(pattern_, this); | 191 coordinator_->FinishJob(pattern_, this); |
139 } | 192 } |
140 | 193 |
141 void ServiceWorkerRegisterJob::UnregisterComplete( | 194 void ServiceWorkerRegisterJob::UnregisterComplete( |
142 ServiceWorkerRegistrationStatus status) { | 195 ServiceWorkerRegistrationStatus status) { |
143 RunCallbacks(status, NULL); | 196 RunCallbacks(status, NULL); |
144 coordinator_->FinishJob(pattern_, this); | 197 coordinator_->FinishJob(pattern_, this); |
145 } | 198 } |
146 | 199 |
147 } // namespace content | 200 } // namespace content |
OLD | NEW |