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

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: Fix another compile error. Created 6 years, 8 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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698