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

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: Null out browser_context_ in Shutdown 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()) {
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698