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_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "content/browser/service_worker/embedded_worker_instance.h" | 8 #include "content/browser/service_worker/embedded_worker_instance.h" |
9 #include "content/browser/service_worker/embedded_worker_registry.h" | 9 #include "content/browser/service_worker/embedded_worker_registry.h" |
10 #include "content/browser/service_worker/service_worker_context_core.h" | 10 #include "content/browser/service_worker/service_worker_context_core.h" |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 callback.Run(status); | 160 callback.Run(status); |
161 } | 161 } |
162 | 162 |
163 } // namespace | 163 } // namespace |
164 | 164 |
165 ServiceWorkerVersion::ServiceWorkerVersion( | 165 ServiceWorkerVersion::ServiceWorkerVersion( |
166 ServiceWorkerRegistration* registration, | 166 ServiceWorkerRegistration* registration, |
167 int64 version_id, | 167 int64 version_id, |
168 base::WeakPtr<ServiceWorkerContextCore> context) | 168 base::WeakPtr<ServiceWorkerContextCore> context) |
169 : version_id_(version_id), | 169 : version_id_(version_id), |
| 170 registration_id_(kInvalidServiceWorkerVersionId), |
170 status_(NEW), | 171 status_(NEW), |
171 is_shutdown_(false), | |
172 registration_(registration), | |
173 weak_factory_(this), | 172 weak_factory_(this), |
174 context_(context) { | 173 context_(context) { |
175 DCHECK(context_); | 174 DCHECK(context_); |
| 175 if (registration) { |
| 176 registration_id_ = registration->id(); |
| 177 script_url_ = registration->script_url(); |
| 178 } |
176 context_->AddLiveVersion(this); | 179 context_->AddLiveVersion(this); |
177 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); | 180 embedded_worker_ = context_->embedded_worker_registry()->CreateWorker(); |
178 embedded_worker_->AddObserver(this); | 181 embedded_worker_->AddObserver(this); |
179 } | 182 } |
180 | 183 |
181 ServiceWorkerVersion::~ServiceWorkerVersion() { | 184 ServiceWorkerVersion::~ServiceWorkerVersion() { |
182 DCHECK(is_shutdown_); | |
183 } | |
184 | |
185 void ServiceWorkerVersion::Shutdown() { | |
186 is_shutdown_ = true; | |
187 registration_ = NULL; | |
188 status_change_callbacks_.clear(); | 185 status_change_callbacks_.clear(); |
189 if (embedded_worker_) { | 186 if (embedded_worker_) { |
190 embedded_worker_->RemoveObserver(this); | 187 embedded_worker_->RemoveObserver(this); |
191 embedded_worker_.reset(); | 188 embedded_worker_.reset(); |
192 } | 189 } |
193 if (context_) | 190 if (context_) |
194 context_->RemoveLiveVersion(version_id_); | 191 context_->RemoveLiveVersion(version_id_); |
195 } | 192 } |
196 | 193 |
197 void ServiceWorkerVersion::SetStatus(Status status) { | 194 void ServiceWorkerVersion::SetStatus(Status status) { |
(...skipping 14 matching lines...) Expand all Loading... |
212 | 209 |
213 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { | 210 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { |
214 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
215 return ServiceWorkerVersionInfo(running_status(), | 212 return ServiceWorkerVersionInfo(running_status(), |
216 status(), | 213 status(), |
217 embedded_worker()->process_id(), | 214 embedded_worker()->process_id(), |
218 embedded_worker()->thread_id()); | 215 embedded_worker()->thread_id()); |
219 } | 216 } |
220 | 217 |
221 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { | 218 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { |
222 DCHECK(!is_shutdown_); | |
223 DCHECK(embedded_worker_); | 219 DCHECK(embedded_worker_); |
224 DCHECK(registration_); | |
225 if (running_status() == RUNNING) { | 220 if (running_status() == RUNNING) { |
226 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 221 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
227 return; | 222 return; |
228 } | 223 } |
229 if (running_status() == STOPPING) { | 224 if (running_status() == STOPPING) { |
230 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | 225 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
231 return; | 226 return; |
232 } | 227 } |
233 if (start_callbacks_.empty()) { | 228 if (start_callbacks_.empty()) { |
234 ServiceWorkerStatusCode status = embedded_worker_->Start( | 229 ServiceWorkerStatusCode status = embedded_worker_->Start( |
235 version_id_, | 230 version_id_, |
236 registration_->script_url()); | 231 script_url_); |
237 if (status != SERVICE_WORKER_OK) { | 232 if (status != SERVICE_WORKER_OK) { |
238 RunSoon(base::Bind(callback, status)); | 233 RunSoon(base::Bind(callback, status)); |
239 return; | 234 return; |
240 } | 235 } |
241 } | 236 } |
242 start_callbacks_.push_back(callback); | 237 start_callbacks_.push_back(callback); |
243 } | 238 } |
244 | 239 |
245 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { | 240 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
246 DCHECK(!is_shutdown_); | |
247 DCHECK(embedded_worker_); | 241 DCHECK(embedded_worker_); |
248 if (running_status() == STOPPED) { | 242 if (running_status() == STOPPED) { |
249 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 243 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
250 return; | 244 return; |
251 } | 245 } |
252 if (stop_callbacks_.empty()) { | 246 if (stop_callbacks_.empty()) { |
253 ServiceWorkerStatusCode status = embedded_worker_->Stop(); | 247 ServiceWorkerStatusCode status = embedded_worker_->Stop(); |
254 if (status != SERVICE_WORKER_OK) { | 248 if (status != SERVICE_WORKER_OK) { |
255 RunSoon(base::Bind(callback, status)); | 249 RunSoon(base::Bind(callback, status)); |
256 return; | 250 return; |
257 } | 251 } |
258 } | 252 } |
259 stop_callbacks_.push_back(callback); | 253 stop_callbacks_.push_back(callback); |
260 } | 254 } |
261 | 255 |
262 void ServiceWorkerVersion::SendMessage( | 256 void ServiceWorkerVersion::SendMessage( |
263 const IPC::Message& message, const StatusCallback& callback) { | 257 const IPC::Message& message, const StatusCallback& callback) { |
264 DCHECK(!is_shutdown_); | |
265 DCHECK(embedded_worker_); | 258 DCHECK(embedded_worker_); |
266 if (running_status() != RUNNING) { | 259 if (running_status() != RUNNING) { |
267 // Schedule calling this method after starting the worker. | 260 // Schedule calling this method after starting the worker. |
268 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 261 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
269 weak_factory_.GetWeakPtr(), callback, | 262 weak_factory_.GetWeakPtr(), callback, |
270 base::Bind(&self::SendMessage, | 263 base::Bind(&self::SendMessage, |
271 weak_factory_.GetWeakPtr(), | 264 weak_factory_.GetWeakPtr(), |
272 message, callback))); | 265 message, callback))); |
273 return; | 266 return; |
274 } | 267 } |
275 | 268 |
276 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 269 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
277 kInvalidServiceWorkerRequestId, message); | 270 kInvalidServiceWorkerRequestId, message); |
278 RunSoon(base::Bind(callback, status)); | 271 RunSoon(base::Bind(callback, status)); |
279 } | 272 } |
280 | 273 |
281 void ServiceWorkerVersion::SendMessageAndRegisterCallback( | 274 void ServiceWorkerVersion::SendMessageAndRegisterCallback( |
282 const IPC::Message& message, const MessageCallback& callback) { | 275 const IPC::Message& message, const MessageCallback& callback) { |
283 DCHECK(!is_shutdown_); | |
284 DCHECK(embedded_worker_); | 276 DCHECK(embedded_worker_); |
285 if (running_status() != RUNNING) { | 277 if (running_status() != RUNNING) { |
286 // Schedule calling this method after starting the worker. | 278 // Schedule calling this method after starting the worker. |
287 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 279 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
288 weak_factory_.GetWeakPtr(), | 280 weak_factory_.GetWeakPtr(), |
289 base::Bind(&RunEmptyMessageCallback, callback), | 281 base::Bind(&RunEmptyMessageCallback, callback), |
290 base::Bind(&self::SendMessageAndRegisterCallback, | 282 base::Bind(&self::SendMessageAndRegisterCallback, |
291 weak_factory_.GetWeakPtr(), | 283 weak_factory_.GetWeakPtr(), |
292 message, callback))); | 284 message, callback))); |
293 return; | 285 return; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
350 } | 342 } |
351 | 343 |
352 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { | 344 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { |
353 DCHECK_EQ(ACTIVE, status()) << status(); | 345 DCHECK_EQ(ACTIVE, status()) << status(); |
354 SendMessageAndRegisterCallback( | 346 SendMessageAndRegisterCallback( |
355 ServiceWorkerMsg_SyncEvent(), | 347 ServiceWorkerMsg_SyncEvent(), |
356 base::Bind(&HandleSyncEventFinished, callback)); | 348 base::Bind(&HandleSyncEventFinished, callback)); |
357 } | 349 } |
358 | 350 |
359 void ServiceWorkerVersion::AddProcessToWorker(int process_id) { | 351 void ServiceWorkerVersion::AddProcessToWorker(int process_id) { |
360 DCHECK(!is_shutdown_); | |
361 embedded_worker_->AddProcessReference(process_id); | 352 embedded_worker_->AddProcessReference(process_id); |
362 } | 353 } |
363 | 354 |
364 void ServiceWorkerVersion::RemoveProcessFromWorker(int process_id) { | 355 void ServiceWorkerVersion::RemoveProcessFromWorker(int process_id) { |
365 // We may have been shutdown. | 356 embedded_worker_->ReleaseProcessReference(process_id); |
366 if (embedded_worker_) | |
367 embedded_worker_->ReleaseProcessReference(process_id); | |
368 } | 357 } |
369 | 358 |
370 void ServiceWorkerVersion::AddControllee( | 359 void ServiceWorkerVersion::AddControllee( |
371 ServiceWorkerProviderHost* provider_host) { | 360 ServiceWorkerProviderHost* provider_host) { |
372 DCHECK(!ContainsKey(controllee_providers_, provider_host)); | 361 DCHECK(!ContainsKey(controllee_providers_, provider_host)); |
373 controllee_providers_.insert(provider_host); | 362 controllee_providers_.insert(provider_host); |
374 AddProcessToWorker(provider_host->process_id()); | 363 AddProcessToWorker(provider_host->process_id()); |
375 } | 364 } |
376 | 365 |
377 void ServiceWorkerVersion::RemoveControllee( | 366 void ServiceWorkerVersion::RemoveControllee( |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 scoped_refptr<ServiceWorkerVersion> protect(this); | 409 scoped_refptr<ServiceWorkerVersion> protect(this); |
421 callback->Run(SERVICE_WORKER_OK, message); | 410 callback->Run(SERVICE_WORKER_OK, message); |
422 message_callbacks_.Remove(request_id); | 411 message_callbacks_.Remove(request_id); |
423 return; | 412 return; |
424 } | 413 } |
425 NOTREACHED() << "Got unexpected message: " << request_id | 414 NOTREACHED() << "Got unexpected message: " << request_id |
426 << " " << message.type(); | 415 << " " << message.type(); |
427 } | 416 } |
428 | 417 |
429 } // namespace content | 418 } // namespace content |
OLD | NEW |