| 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 |