Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 238043002: Teach EmbeddedWorkerInstance to create a process when it needs one. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Handle 2 places where context_ could be NULL. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698