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()) { |
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(); |
(...skipping 19 matching lines...) Expand all Loading... | |
189 } | 195 } |
190 | 196 |
191 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); | 197 ServiceWorkerStatusCode status = embedded_worker_->SendMessage(message); |
192 RunSoon(base::Bind(callback, status)); | 198 RunSoon(base::Bind(callback, status)); |
193 } | 199 } |
194 | 200 |
195 void ServiceWorkerVersion::DispatchInstallEvent( | 201 void ServiceWorkerVersion::DispatchInstallEvent( |
196 int active_version_id, | 202 int active_version_id, |
197 const StatusCallback& callback) { | 203 const StatusCallback& callback) { |
198 DCHECK_EQ(NEW, status()) << status(); | 204 DCHECK_EQ(NEW, status()) << status(); |
205 SetStatus(INSTALLING); | |
199 | 206 |
200 if (running_status() != RUNNING) { | 207 if (running_status() != RUNNING) { |
201 // Schedule calling this method after starting the worker. | 208 // Schedule calling this method after starting the worker. |
202 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 209 StartWorker( |
203 weak_factory_.GetWeakPtr(), callback, | 210 base::Bind(&RunTaskAfterStartWorker, |
204 base::Bind(&self::DispatchInstallEvent, | 211 weak_factory_.GetWeakPtr(), |
205 weak_factory_.GetWeakPtr(), | 212 callback, |
206 active_version_id, callback))); | 213 base::Bind(&self::DispatchInstallEventAfterStartWorker, |
207 return; | 214 weak_factory_.GetWeakPtr(), |
208 } | 215 active_version_id, |
209 | 216 callback))); |
210 SetStatus(INSTALLING); | 217 } else { |
211 int request_id = install_callbacks_.Add(new StatusCallback(callback)); | 218 DispatchInstallEventAfterStartWorker(active_version_id, callback); |
kinuko
2014/04/28 06:58:16
Thx, using private methods look nicer to me.
| |
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 } | 219 } |
218 } | 220 } |
219 | 221 |
220 void ServiceWorkerVersion::DispatchActivateEvent( | 222 void ServiceWorkerVersion::DispatchActivateEvent( |
221 const StatusCallback& callback) { | 223 const StatusCallback& callback) { |
222 DCHECK_EQ(INSTALLED, status()) << status(); | 224 DCHECK_EQ(INSTALLED, status()) << status(); |
225 SetStatus(ACTIVATING); | |
223 | 226 |
224 if (running_status() != RUNNING) { | 227 if (running_status() != RUNNING) { |
225 // Schedule calling this method after starting the worker. | 228 // Schedule calling this method after starting the worker. |
226 StartWorker(base::Bind(&RunTaskAfterStartWorker, | 229 StartWorker( |
227 weak_factory_.GetWeakPtr(), callback, | 230 base::Bind(&RunTaskAfterStartWorker, |
228 base::Bind(&self::DispatchActivateEvent, | 231 weak_factory_.GetWeakPtr(), |
229 weak_factory_.GetWeakPtr(), | 232 callback, |
230 callback))); | 233 base::Bind(&self::DispatchActivateEventAfterStartWorker, |
231 return; | 234 weak_factory_.GetWeakPtr(), |
232 } | 235 callback))); |
233 | 236 } else { |
234 SetStatus(ACTIVATING); | 237 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 } | 238 } |
242 } | 239 } |
243 | 240 |
244 void ServiceWorkerVersion::DispatchFetchEvent( | 241 void ServiceWorkerVersion::DispatchFetchEvent( |
245 const ServiceWorkerFetchRequest& request, | 242 const ServiceWorkerFetchRequest& request, |
246 const FetchCallback& callback) { | 243 const FetchCallback& callback) { |
247 DCHECK_EQ(ACTIVE, status()) << status(); | 244 DCHECK_EQ(ACTIVE, status()) << status(); |
248 | 245 |
249 if (running_status() != RUNNING) { | 246 if (running_status() != RUNNING) { |
250 // Schedule calling this method after starting the worker. | 247 // Schedule calling this method after starting the worker. |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
426 OnInstallEventFinished) | 423 OnInstallEventFinished) |
427 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, | 424 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_FetchEventFinished, |
428 OnFetchEventFinished) | 425 OnFetchEventFinished) |
429 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, | 426 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
430 OnSyncEventFinished) | 427 OnSyncEventFinished) |
431 IPC_MESSAGE_UNHANDLED(handled = false) | 428 IPC_MESSAGE_UNHANDLED(handled = false) |
432 IPC_END_MESSAGE_MAP() | 429 IPC_END_MESSAGE_MAP() |
433 return handled; | 430 return handled; |
434 } | 431 } |
435 | 432 |
433 void ServiceWorkerVersion::RunStartWorkerCallbacksOnError( | |
434 ServiceWorkerStatusCode status) { | |
435 if (status != SERVICE_WORKER_OK) | |
436 RunCallbacks(this, &start_callbacks_, status); | |
437 } | |
438 | |
439 void ServiceWorkerVersion::DispatchInstallEventAfterStartWorker( | |
440 int active_version_id, | |
441 const StatusCallback& callback) { | |
442 DCHECK_EQ(RUNNING, running_status()) | |
443 << "Worker stopped too soon after it was started."; | |
444 int request_id = install_callbacks_.Add(new StatusCallback(callback)); | |
445 ServiceWorkerStatusCode status = embedded_worker_->SendMessage( | |
446 ServiceWorkerMsg_InstallEvent(request_id, active_version_id)); | |
447 if (status != SERVICE_WORKER_OK) { | |
448 install_callbacks_.Remove(request_id); | |
449 RunSoon(base::Bind(callback, status)); | |
450 } | |
451 } | |
452 | |
453 void ServiceWorkerVersion::DispatchActivateEventAfterStartWorker( | |
454 const StatusCallback& callback) { | |
455 DCHECK_EQ(RUNNING, running_status()) | |
456 << "Worker stopped too soon after it was started."; | |
457 int request_id = activate_callbacks_.Add(new StatusCallback(callback)); | |
458 ServiceWorkerStatusCode status = | |
459 embedded_worker_->SendMessage(ServiceWorkerMsg_ActivateEvent(request_id)); | |
460 if (status != SERVICE_WORKER_OK) { | |
461 activate_callbacks_.Remove(request_id); | |
462 RunSoon(base::Bind(callback, status)); | |
463 } | |
464 } | |
465 | |
436 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { | 466 void ServiceWorkerVersion::OnGetClientDocuments(int request_id) { |
437 std::vector<int> client_ids; | 467 std::vector<int> client_ids; |
438 ControlleeByIDMap::iterator it(&controllee_by_id_); | 468 ControlleeByIDMap::iterator it(&controllee_by_id_); |
439 while (!it.IsAtEnd()) { | 469 while (!it.IsAtEnd()) { |
440 client_ids.push_back(it.GetCurrentKey()); | 470 client_ids.push_back(it.GetCurrentKey()); |
441 it.Advance(); | 471 it.Advance(); |
442 } | 472 } |
443 // Don't bother if it's no longer running. | 473 // Don't bother if it's no longer running. |
444 if (running_status() == RUNNING) { | 474 if (running_status() == RUNNING) { |
445 embedded_worker_->SendMessage( | 475 embedded_worker_->SendMessage( |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
507 NOTREACHED() << "Got unexpected message: " << request_id; | 537 NOTREACHED() << "Got unexpected message: " << request_id; |
508 return; | 538 return; |
509 } | 539 } |
510 | 540 |
511 scoped_refptr<ServiceWorkerVersion> protect(this); | 541 scoped_refptr<ServiceWorkerVersion> protect(this); |
512 callback->Run(SERVICE_WORKER_OK); | 542 callback->Run(SERVICE_WORKER_OK); |
513 sync_callbacks_.Remove(request_id); | 543 sync_callbacks_.Remove(request_id); |
514 } | 544 } |
515 | 545 |
516 } // namespace content | 546 } // namespace content |
OLD | NEW |