Chromium Code Reviews| 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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 | 131 |
| 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( |
| 142 const StatusCallback& callback, | |
| 143 const std::vector<int>& possible_process_ids) { | |
| 142 DCHECK(embedded_worker_); | 144 DCHECK(embedded_worker_); |
| 143 if (running_status() == RUNNING) { | 145 switch (running_status()) { |
|
kinuko
2014/04/25 13:46:35
This looks nicer, thanks.
| |
| 144 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 146 case RUNNING: |
| 145 return; | 147 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 148 return; | |
| 149 case STOPPING: | |
| 150 RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); | |
| 151 return; | |
| 152 case STOPPED: | |
| 153 case STARTING: | |
| 154 start_callbacks_.push_back(callback); | |
| 155 if (running_status() == STOPPED) { | |
| 156 embedded_worker_->Start( | |
| 157 version_id_, | |
| 158 scope_, | |
| 159 script_url_, | |
| 160 possible_process_ids, | |
| 161 base::Bind(&ServiceWorkerVersion::RunStartWorkerCallbacksOnError, | |
| 162 weak_factory_.GetWeakPtr())); | |
| 163 } | |
| 164 return; | |
| 146 } | 165 } |
| 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 } | 166 } |
| 161 | 167 |
| 162 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { | 168 void ServiceWorkerVersion::StopWorker(const StatusCallback& callback) { |
| 163 DCHECK(embedded_worker_); | 169 DCHECK(embedded_worker_); |
| 164 if (running_status() == STOPPED) { | 170 if (running_status() == STOPPED) { |
| 165 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); | 171 RunSoon(base::Bind(callback, SERVICE_WORKER_OK)); |
| 166 return; | 172 return; |
| 167 } | 173 } |
| 168 if (stop_callbacks_.empty()) { | 174 if (stop_callbacks_.empty()) { |
| 169 ServiceWorkerStatusCode status = embedded_worker_->Stop(); | 175 ServiceWorkerStatusCode status = embedded_worker_->Stop(); |
| 170 if (status != SERVICE_WORKER_OK) { | 176 if (status != SERVICE_WORKER_OK) { |
| 171 RunSoon(base::Bind(callback, status)); | 177 RunSoon(base::Bind(callback, status)); |
| 172 return; | 178 return; |
| 173 } | 179 } |
| 174 } | 180 } |
| 175 stop_callbacks_.push_back(callback); | 181 stop_callbacks_.push_back(callback); |
| 176 } | 182 } |
| 177 | 183 |
| 178 void ServiceWorkerVersion::SendMessage( | 184 void ServiceWorkerVersion::SendMessage( |
| 179 const IPC::Message& message, const StatusCallback& callback) { | 185 const IPC::Message& message, const StatusCallback& callback) { |
| 180 DCHECK(embedded_worker_); | 186 DCHECK(embedded_worker_); |
| 181 if (running_status() != RUNNING) { | 187 if (running_status() != RUNNING) { |
| 182 // Schedule calling this method after starting the worker. | 188 // Schedule calling this method after starting the worker. |
| 183 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 189 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| 184 weak_factory_.GetWeakPtr(), callback, | 190 weak_factory_.GetWeakPtr(), |
| 191 callback, | |
| 185 base::Bind(&self::SendMessage, | 192 base::Bind(&self::SendMessage, |
| 186 weak_factory_.GetWeakPtr(), | 193 weak_factory_.GetWeakPtr(), |
| 187 message, callback))); | 194 message, |
| 195 callback)), | |
| 196 std::vector<int>()); | |
| 188 return; | 197 return; |
| 189 } | 198 } |
| 190 | 199 |
| 191 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); | 200 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); |
| 192 RunSoon(base::Bind(callback, status)); | 201 RunSoon(base::Bind(callback, status)); |
| 193 } | 202 } |
| 194 | 203 |
| 195 void ServiceWorkerVersion::DispatchInstallEvent( | 204 void ServiceWorkerVersion::DispatchInstallEvent(int active_version_id, |
| 196 int active_version_id, | 205 const StatusCallback& callback, |
| 197 const StatusCallback& callback) { | 206 bool second_call) { |
| 198 DCHECK_EQ(NEW, status()) << status(); | 207 if (!second_call) |
| 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(base::Bind(&RunTaskAfterStartWorker, |
| 203 weak_factory_.GetWeakPtr(), callback, | 214 weak_factory_.GetWeakPtr(), |
| 215 callback, | |
| 204 base::Bind(&self::DispatchInstallEvent, | 216 base::Bind(&self::DispatchInstallEvent, |
| 205 weak_factory_.GetWeakPtr(), | 217 weak_factory_.GetWeakPtr(), |
| 206 active_version_id, callback))); | 218 active_version_id, |
| 219 callback, | |
| 220 true)), | |
| 221 std::vector<int>()); | |
| 207 return; | 222 return; |
| 208 } | 223 } |
| 209 | 224 |
| 210 SetStatus(INSTALLING); | |
| 211 int request_id = install_callbacks_.Add(new StatusCallback(callback)); | 225 int request_id = install_callbacks_.Add(new StatusCallback(callback)); |
| 212 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 226 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 213 ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); | 227 ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); |
| 214 if (status != SERVICE_WORKER_OK) { | 228 if (status != SERVICE_WORKER_OK) { |
| 215 install_callbacks_.Remove(request_id); | 229 install_callbacks_.Remove(request_id); |
| 216 RunSoon(base::Bind(callback, status)); | 230 RunSoon(base::Bind(callback, status)); |
| 217 } | 231 } |
| 218 } | 232 } |
| 219 | 233 |
| 220 void ServiceWorkerVersion::DispatchActivateEvent( | 234 void ServiceWorkerVersion::DispatchActivateEvent(const StatusCallback& callback, |
| 221 const StatusCallback& callback) { | 235 bool second_call) { |
| 222 DCHECK_EQ(INSTALLED, status()) << status(); | 236 if (!second_call) |
| 237 DCHECK_EQ(INSTALLED, status()) << status(); | |
| 238 SetStatus(ACTIVATING); | |
|
Jeffrey Yasskin
2014/04/25 04:40:33
This fixes the url_request_job_unittest, which was
kinuko
2014/04/25 13:46:35
Uh oh I see. Thanks for noticing, this was sketchy
Jeffrey Yasskin
2014/04/26 03:52:19
Using a new field for this will allow the user to
| |
| 223 | 239 |
| 224 if (running_status() != RUNNING) { | 240 if (running_status() != RUNNING) { |
| 225 // Schedule calling this method after starting the worker. | 241 // Schedule calling this method after starting the worker. |
| 226 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 242 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| 227 weak_factory_.GetWeakPtr(), callback, | 243 weak_factory_.GetWeakPtr(), |
| 244 callback, | |
| 228 base::Bind(&self::DispatchActivateEvent, | 245 base::Bind(&self::DispatchActivateEvent, |
| 229 weak_factory_.GetWeakPtr(), | 246 weak_factory_.GetWeakPtr(), |
| 230 callback))); | 247 callback, |
| 248 true)), | |
| 249 std::vector<int>()); | |
| 231 return; | 250 return; |
| 232 } | 251 } |
| 233 | 252 |
| 234 SetStatus(ACTIVATING); | |
| 235 int request_id = activate_callbacks_.Add(new StatusCallback(callback)); | 253 int request_id = activate_callbacks_.Add(new StatusCallback(callback)); |
| 236 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 254 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 237 ServiceWorkerMsg_ActivateEvent(request_id)); | 255 ServiceWorkerMsg_ActivateEvent(request_id)); |
| 238 if (status != SERVICE_WORKER_OK) { | 256 if (status != SERVICE_WORKER_OK) { |
| 239 activate_callbacks_.Remove(request_id); | 257 activate_callbacks_.Remove(request_id); |
| 240 RunSoon(base::Bind(callback, status)); | 258 RunSoon(base::Bind(callback, status)); |
| 241 } | 259 } |
| 242 } | 260 } |
| 243 | 261 |
| 244 void ServiceWorkerVersion::DispatchFetchEvent( | 262 void ServiceWorkerVersion::DispatchFetchEvent( |
| 245 const ServiceWorkerFetchRequest& request, | 263 const ServiceWorkerFetchRequest& request, |
| 246 const FetchCallback& callback) { | 264 const FetchCallback& callback) { |
| 247 DCHECK_EQ(ACTIVE, status()) << status(); | 265 DCHECK_EQ(ACTIVE, status()) << status(); |
| 248 | 266 |
| 249 if (running_status() != RUNNING) { | 267 if (running_status() != RUNNING) { |
| 250 // Schedule calling this method after starting the worker. | 268 // Schedule calling this method after starting the worker. |
| 251 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 269 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| 252 weak_factory_.GetWeakPtr(), | 270 weak_factory_.GetWeakPtr(), |
| 253 base::Bind(&RunErrorFetchCallback, callback), | 271 base::Bind(&RunErrorFetchCallback, callback), |
| 254 base::Bind(&self::DispatchFetchEvent, | 272 base::Bind(&self::DispatchFetchEvent, |
| 255 weak_factory_.GetWeakPtr(), | 273 weak_factory_.GetWeakPtr(), |
| 256 request, callback))); | 274 request, |
| 275 callback)), | |
| 276 std::vector<int>()); | |
| 257 return; | 277 return; |
| 258 } | 278 } |
| 259 | 279 |
| 260 int request_id = fetch_callbacks_.Add(new FetchCallback(callback)); | 280 int request_id = fetch_callbacks_.Add(new FetchCallback(callback)); |
| 261 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 281 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 262 ServiceWorkerMsg_FetchEvent(request_id, request)); | 282 ServiceWorkerMsg_FetchEvent(request_id, request)); |
| 263 if (status != SERVICE_WORKER_OK) { | 283 if (status != SERVICE_WORKER_OK) { |
| 264 fetch_callbacks_.Remove(request_id); | 284 fetch_callbacks_.Remove(request_id); |
| 265 RunSoon(base::Bind(&RunErrorFetchCallback, | 285 RunSoon(base::Bind(&RunErrorFetchCallback, |
| 266 callback, | 286 callback, |
| 267 SERVICE_WORKER_ERROR_FAILED)); | 287 SERVICE_WORKER_ERROR_FAILED)); |
| 268 } | 288 } |
| 269 } | 289 } |
| 270 | 290 |
| 271 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { | 291 void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { |
| 272 DCHECK_EQ(ACTIVE, status()) << status(); | 292 DCHECK_EQ(ACTIVE, status()) << status(); |
| 273 | 293 |
| 274 if (!CommandLine::ForCurrentProcess()->HasSwitch( | 294 if (!CommandLine::ForCurrentProcess()->HasSwitch( |
| 275 switches::kEnableServiceWorkerSync)) { | 295 switches::kEnableServiceWorkerSync)) { |
| 276 callback.Run(SERVICE_WORKER_ERROR_ABORT); | 296 callback.Run(SERVICE_WORKER_ERROR_ABORT); |
| 277 return; | 297 return; |
| 278 } | 298 } |
| 279 | 299 |
| 280 if (running_status() != RUNNING) { | 300 if (running_status() != RUNNING) { |
| 281 // Schedule calling this method after starting the worker. | 301 // Schedule calling this method after starting the worker. |
| 282 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 302 StartWorker(base::Bind(&RunTaskAfterStartWorker, |
| 283 weak_factory_.GetWeakPtr(), callback, | 303 weak_factory_.GetWeakPtr(), |
| 304 callback, | |
| 284 base::Bind(&self::DispatchSyncEvent, | 305 base::Bind(&self::DispatchSyncEvent, |
| 285 weak_factory_.GetWeakPtr(), | 306 weak_factory_.GetWeakPtr(), |
| 286 callback))); | 307 callback)), |
| 308 std::vector<int>()); | |
| 287 return; | 309 return; |
| 288 } | 310 } |
| 289 | 311 |
| 290 int request_id = sync_callbacks_.Add(new StatusCallback(callback)); | 312 int request_id = sync_callbacks_.Add(new StatusCallback(callback)); |
| 291 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | 313 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
| 292 ServiceWorkerMsg_SyncEvent(request_id)); | 314 ServiceWorkerMsg_SyncEvent(request_id)); |
| 293 if (status != SERVICE_WORKER_OK) { | 315 if (status != SERVICE_WORKER_OK) { |
| 294 sync_callbacks_.Remove(request_id); | 316 sync_callbacks_.Remove(request_id); |
| 295 RunSoon(base::Bind(callback, status)); | 317 RunSoon(base::Bind(callback, status)); |
| 296 } | 318 } |
| (...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 426 OnInstallEventFinished) | 448 OnInstallEventFinished) |
| 427 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 449 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
| 428 OnFetchEventFinished) | 450 OnFetchEventFinished) |
| 429 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 451 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
| 430 OnSyncEventFinished) | 452 OnSyncEventFinished) |
| 431 IPC_MESSAGE_UNHANDLED(handled = false) | 453 IPC_MESSAGE_UNHANDLED(handled = false) |
| 432 IPC_END_MESSAGE_MAP() | 454 IPC_END_MESSAGE_MAP() |
| 433 return handled; | 455 return handled; |
| 434 } | 456 } |
| 435 | 457 |
| 458 void ServiceWorkerVersion::RunStartWorkerCallbacksOnError( | |
| 459 ServiceWorkerStatusCode status) { | |
| 460 if (status != SERVICE_WORKER_OK) | |
| 461 RunCallbacks(this, &start_callbacks_, status); | |
| 462 } | |
| 463 | |
| 436 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { | 464 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { |
| 437 std::vector<int> client_ids; | 465 std::vector<int> client_ids; |
| 438 ControlleeByIDMap::iterator it(&controllee_by_id_); | 466 ControlleeByIDMap::iterator it(&controllee_by_id_); |
| 439 while (!it.IsAtEnd()) { | 467 while (!it.IsAtEnd()) { |
| 440 client_ids.push_back(it.GetCurrentKey()); | 468 client_ids.push_back(it.GetCurrentKey()); |
| 441 it.Advance(); | 469 it.Advance(); |
| 442 } | 470 } |
| 443 // Don't bother if it's no longer running. | 471 // Don't bother if it's no longer running. |
| 444 if (running_status() == RUNNING) { | 472 if (running_status() == RUNNING) { |
| 445 embedded_worker_->SendMessage( | 473 embedded_worker_->SendMessage( |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 507 NOTREACHED() << "Got unexpected message: " << request_id; | 535 NOTREACHED() << "Got unexpected message: " << request_id; |
| 508 return; | 536 return; |
| 509 } | 537 } |
| 510 | 538 |
| 511 scoped_refptr<ServiceWorkerVersion> protect(this); | 539 scoped_refptr<ServiceWorkerVersion> protect(this); |
| 512 callback->Run(SERVICE_WORKER_OK); | 540 callback->Run(SERVICE_WORKER_OK); |
| 513 sync_callbacks_.Remove(request_id); | 541 sync_callbacks_.Remove(request_id); |
| 514 } | 542 } |
| 515 | 543 |
| 516 } // namespace content | 544 } // namespace content |
| OLD | NEW |