| 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/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "content/browser/service_worker/embedded_worker_instance.h" | 9 #include "content/browser/service_worker/embedded_worker_instance.h" |
| 10 #include "content/browser/service_worker/embedded_worker_registry.h" | 10 #include "content/browser/service_worker/embedded_worker_registry.h" |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { | 132 ServiceWorkerVersionInfo ServiceWorkerVersion::GetInfo() { |
| 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 133 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 134 return ServiceWorkerVersionInfo(running_status(), | 134 return ServiceWorkerVersionInfo(running_status(), |
| 135 status(), | 135 status(), |
| 136 version_id(), | 136 version_id(), |
| 137 embedded_worker()->process_id(), | 137 embedded_worker()->process_id(), |
| 138 embedded_worker()->thread_id()); | 138 embedded_worker()->thread_id()); |
| 139 } | 139 } |
| 140 | 140 |
| 141 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { | 141 void ServiceWorkerVersion::StartWorker(const StatusCallback& callback) { |
| 142 StartWorkerWithCandidateProcesses(std::vector<int>(), callback); |
| 143 } |
| 144 |
| 145 void ServiceWorkerVersion::StartWorkerWithCandidateProcesses( |
| 146 const std::vector<int>& possible_process_ids, |
| 147 const StatusCallback& callback) { |
| 142 DCHECK(embedded_worker_); | 148 DCHECK(embedded_worker_); |
| 143 if (running_status() == RUNNING) { | 149 switch (running_status()) { |
| 144 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 150 case RUNNING: |
| 145 return; | 151 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 152 return; |
| 153 case STOPPING: |
| 154 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
| 155 return; |
| 156 case STOPPED: |
| 157 case STARTING: |
| 158 start_callbacks_.push_back(callback); |
| 159 if (running_status() == STOPPED) { |
| 160 embedded_worker_->Start( |
| 161 version_id_, |
| 162 scope_, |
| 163 script_url_, |
| 164 possible_process_ids, |
| 165 base::Bind(&ServiceWorkerVersion::RunStartWorkerCallbacksOnError, |
| 166 weak_factory_.GetWeakPtr())); |
| 167 } |
| 168 return; |
| 146 } | 169 } |
| 147 if (running_status() == STOPPING) { | |
| 148 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | |
| 149 return; | |
| 150 } | |
| 151 if (start_callbacks_.empty()) { | |
| 152 ServiceWorkerStatusCode status = embedded_worker_->Start( | |
| 153 version_id_, scope_, script_url_); | |
| 154 if (status != SERVICE_WORKER_OK) { | |
| 155 RunSoon(base::Bind(callback, status)); | |
| 156 return; | |
| 157 } | |
| 158 } | |
| 159 start_callbacks_.push_back(callback); | |
| 160 } | 170 } |
| 161 | 171 |
| 162 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { | 172 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
| 163 DCHECK(embedded_worker_); | 173 DCHECK(embedded_worker_); |
| 164 if (running_status() == STOPPED) { | 174 if (running_status() == STOPPED) { |
| 165 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 175 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 166 return; | 176 return; |
| 167 } | 177 } |
| 168 if (stop_callbacks_.empty()) { | 178 if (stop_callbacks_.empty()) { |
| 169 ServiceWorkerStatusCode status = embedded_worker_->Stop(); | 179 ServiceWorkerStatusCode status = embedded_worker_->Stop(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 189 } | 199 } |
| 190 | 200 |
| 191 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); | 201 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); |
| 192 RunSoon(base::Bind(callback, status)); | 202 RunSoon(base::Bind(callback, status)); |
| 193 } | 203 } |
| 194 | 204 |
| 195 void ServiceWorkerVersion::DispatchInstallEvent( | 205 void ServiceWorkerVersion::DispatchInstallEvent( |
| 196 int active_version_id, | 206 int active_version_id, |
| 197 const StatusCallback& callback) { | 207 const StatusCallback& callback) { |
| 198 DCHECK_EQ(NEW, status()) << status(); | 208 DCHECK_EQ(NEW, status()) << status(); |
| 209 SetStatus(INSTALLING); |
| 199 | 210 |
| 200 if (running_status() != RUNNING) { | 211 if (running_status() != RUNNING) { |
| 201 // Schedule calling this method after starting the worker. | 212 // Schedule calling this method after starting the worker. |
| 202 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 213 StartWorker( |
| 203 weak_factory_.GetWeakPtr(), callback, | 214 base::Bind(&RunTaskAfterStartWorker, |
| 204 base::Bind(&self::DispatchInstallEvent, | 215 weak_factory_.GetWeakPtr(), |
| 205 weak_factory_.GetWeakPtr(), | 216 callback, |
| 206 active_version_id, callback))); | 217 base::Bind(&self::DispatchInstallEventAfterStartWorker, |
| 207 return; | 218 weak_factory_.GetWeakPtr(), |
| 208 } | 219 active_version_id, |
| 209 | 220 callback))); |
| 210 SetStatus(INSTALLING); | 221 } else { |
| 211 int request_id = install_callbacks_.Add(new StatusCallback(callback)); | 222 DispatchInstallEventAfterStartWorker(active_version_id, callback); |
| 212 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | |
| 213 ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); | |
| 214 if (status != SERVICE_WORKER_OK) { | |
| 215 install_callbacks_.Remove(request_id); | |
| 216 RunSoon(base::Bind(callback, status)); | |
| 217 } | 223 } |
| 218 } | 224 } |
| 219 | 225 |
| 220 void ServiceWorkerVersion::DispatchActivateEvent( | 226 void ServiceWorkerVersion::DispatchActivateEvent( |
| 221 const StatusCallback& callback) { | 227 const StatusCallback& callback) { |
| 222 DCHECK_EQ(INSTALLED, status()) << status(); | 228 DCHECK_EQ(INSTALLED, status()) << status(); |
| 229 SetStatus(ACTIVATING); |
| 223 | 230 |
| 224 if (running_status() != RUNNING) { | 231 if (running_status() != RUNNING) { |
| 225 // Schedule calling this method after starting the worker. | 232 // Schedule calling this method after starting the worker. |
| 226 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 233 StartWorker( |
| 227 weak_factory_.GetWeakPtr(), callback, | 234 base::Bind(&RunTaskAfterStartWorker, |
| 228 base::Bind(&self::DispatchActivateEvent, | 235 weak_factory_.GetWeakPtr(), |
| 229 weak_factory_.GetWeakPtr(), | 236 callback, |
| 230 callback))); | 237 base::Bind(&self::DispatchActivateEventAfterStartWorker, |
| 231 return; | 238 weak_factory_.GetWeakPtr(), |
| 232 } | 239 callback))); |
| 233 | 240 } else { |
| 234 SetStatus(ACTIVATING); | 241 DispatchActivateEventAfterStartWorker(callback); |
| 235 int request_id = activate_callbacks_.Add(new StatusCallback(callback)); | |
| 236 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | |
| 237 ServiceWorkerMsg_ActivateEvent(request_id)); | |
| 238 if (status != SERVICE_WORKER_OK) { | |
| 239 activate_callbacks_.Remove(request_id); | |
| 240 RunSoon(base::Bind(callback, status)); | |
| 241 } | 242 } |
| 242 } | 243 } |
| 243 | 244 |
| 244 void ServiceWorkerVersion::DispatchFetchEvent( | 245 void ServiceWorkerVersion::DispatchFetchEvent( |
| 245 const ServiceWorkerFetchRequest& request, | 246 const ServiceWorkerFetchRequest& request, |
| 246 const FetchCallback& callback) { | 247 const FetchCallback& callback) { |
| 247 DCHECK_EQ(ACTIVE, status()) << status(); | 248 DCHECK_EQ(ACTIVE, status()) << status(); |
| 248 | 249 |
| 249 if (running_status() != RUNNING) { | 250 if (running_status() != RUNNING) { |
| 250 // Schedule calling this method after starting the worker. | 251 // Schedule calling this method after starting the worker. |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 426 OnInstallEventFinished) | 427 OnInstallEventFinished) |
| 427 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 428 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
| 428 OnFetchEventFinished) | 429 OnFetchEventFinished) |
| 429 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 430 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
| 430 OnSyncEventFinished) | 431 OnSyncEventFinished) |
| 431 IPC_MESSAGE_UNHANDLED(handled = false) | 432 IPC_MESSAGE_UNHANDLED(handled = false) |
| 432 IPC_END_MESSAGE_MAP() | 433 IPC_END_MESSAGE_MAP() |
| 433 return handled; | 434 return handled; |
| 434 } | 435 } |
| 435 | 436 |
| 437 void ServiceWorkerVersion::RunStartWorkerCallbacksOnError( |
| 438 ServiceWorkerStatusCode status) { |
| 439 if (status != SERVICE_WORKER_OK) |
| 440 RunCallbacks(this, &start_callbacks_, status); |
| 441 } |
| 442 |
| 443 void ServiceWorkerVersion::DispatchInstallEventAfterStartWorker( |
| 444 int active_version_id, |
| 445 const StatusCallback& callback) { |
| 446 DCHECK_EQ(RUNNING, running_status()) |
| 447 << "Worker stopped too soon after it was started."; |
| 448 int request_id = install_callbacks_.Add(new StatusCallback(callback)); |
| 449 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 450 ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); |
| 451 if (status != SERVICE_WORKER_OK) { |
| 452 install_callbacks_.Remove(request_id); |
| 453 RunSoon(base::Bind(callback, status)); |
| 454 } |
| 455 } |
| 456 |
| 457 void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( |
| 458 const StatusCallback& callback) { |
| 459 DCHECK_EQ(RUNNING, running_status()) |
| 460 << "Worker stopped too soon after it was started."; |
| 461 int request_id = activate_callbacks_.Add(new StatusCallback(callback)); |
| 462 ServiceWorkerStatusCode status = |
| 463 embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); |
| 464 if (status != SERVICE_WORKER_OK) { |
| 465 activate_callbacks_.Remove(request_id); |
| 466 RunSoon(base::Bind(callback, status)); |
| 467 } |
| 468 } |
| 469 |
| 436 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { | 470 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { |
| 437 std::vector<int> client_ids; | 471 std::vector<int> client_ids; |
| 438 ControlleeByIDMap::iterator it(&controllee_by_id_); | 472 ControlleeByIDMap::iterator it(&controllee_by_id_); |
| 439 while (!it.IsAtEnd()) { | 473 while (!it.IsAtEnd()) { |
| 440 client_ids.push_back(it.GetCurrentKey()); | 474 client_ids.push_back(it.GetCurrentKey()); |
| 441 it.Advance(); | 475 it.Advance(); |
| 442 } | 476 } |
| 443 // Don't bother if it's no longer running. | 477 // Don't bother if it's no longer running. |
| 444 if (running_status() == RUNNING) { | 478 if (running_status() == RUNNING) { |
| 445 embedded_worker_->SendMessage( | 479 embedded_worker_->SendMessage( |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 507 NOTREACHED() << "Got unexpected message: " << request_id; | 541 NOTREACHED() << "Got unexpected message: " << request_id; |
| 508 return; | 542 return; |
| 509 } | 543 } |
| 510 | 544 |
| 511 scoped_refptr<ServiceWorkerVersion> protect(this); | 545 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 512 callback->Run(SERVICE_WORKER_OK); | 546 callback->Run(SERVICE_WORKER_OK); |
| 513 sync_callbacks_.Remove(request_id); | 547 sync_callbacks_.Remove(request_id); |
| 514 } | 548 } |
| 515 | 549 |
| 516 } // namespace content | 550 } // namespace content |
| OLD | NEW |