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

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

Issue 962543005: Service Worker: Add metrics and timeout for starting a Service Worker. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: self-review Created 5 years, 9 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
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/embedded_worker_instance.h" 5 #include "content/browser/service_worker/embedded_worker_instance.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 const GURL& script_url, 138 const GURL& script_url,
139 bool pause_after_download, 139 bool pause_after_download,
140 const StatusCallback& callback) { 140 const StatusCallback& callback) {
141 if (!context_) { 141 if (!context_) {
142 callback.Run(SERVICE_WORKER_ERROR_ABORT); 142 callback.Run(SERVICE_WORKER_ERROR_ABORT);
143 return; 143 return;
144 } 144 }
145 DCHECK(status_ == STOPPED); 145 DCHECK(status_ == STOPPED);
146 start_timing_ = base::TimeTicks::Now(); 146 start_timing_ = base::TimeTicks::Now();
147 status_ = STARTING; 147 status_ = STARTING;
148 starting_phase_ = ALLOCATE_PROCESS;
148 network_accessed_for_script_ = false; 149 network_accessed_for_script_ = false;
149 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params( 150 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params(
150 new EmbeddedWorkerMsg_StartWorker_Params()); 151 new EmbeddedWorkerMsg_StartWorker_Params());
151 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", 152 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker",
152 "EmbeddedWorkerInstance::ProcessAllocate", 153 "EmbeddedWorkerInstance::ProcessAllocate",
153 params.get(), 154 params.get(),
154 "Scope", scope.spec(), 155 "Scope", scope.spec(),
155 "Script URL", script_url.spec()); 156 "Script URL", script_url.spec());
156 params->embedded_worker_id = embedded_worker_id_; 157 params->embedded_worker_id = embedded_worker_id_;
157 params->service_worker_version_id = service_worker_version_id; 158 params->service_worker_version_id = service_worker_version_id;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 base::WeakPtr<ServiceWorkerContextCore> context, 212 base::WeakPtr<ServiceWorkerContextCore> context,
212 int embedded_worker_id) 213 int embedded_worker_id)
213 : context_(context), 214 : context_(context),
214 registry_(context->embedded_worker_registry()), 215 registry_(context->embedded_worker_registry()),
215 embedded_worker_id_(embedded_worker_id), 216 embedded_worker_id_(embedded_worker_id),
216 status_(STOPPED), 217 status_(STOPPED),
217 process_id_(-1), 218 process_id_(-1),
218 thread_id_(kInvalidEmbeddedWorkerThreadId), 219 thread_id_(kInvalidEmbeddedWorkerThreadId),
219 devtools_attached_(false), 220 devtools_attached_(false),
220 network_accessed_for_script_(false), 221 network_accessed_for_script_(false),
221 weak_factory_(this) { 222 weak_factory_(this) {
kinuko 2015/03/02 03:19:33 initializing starting_phase_ here?
falken 2015/03/02 04:19:16 Done.
222 } 223 }
223 224
224 // static 225 // static
225 void EmbeddedWorkerInstance::RunProcessAllocated( 226 void EmbeddedWorkerInstance::RunProcessAllocated(
226 base::WeakPtr<EmbeddedWorkerInstance> instance, 227 base::WeakPtr<EmbeddedWorkerInstance> instance,
227 base::WeakPtr<ServiceWorkerContextCore> context, 228 base::WeakPtr<ServiceWorkerContextCore> context,
228 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params, 229 scoped_ptr<EmbeddedWorkerMsg_StartWorker_Params> params,
229 const EmbeddedWorkerInstance::StatusCallback& callback, 230 const EmbeddedWorkerInstance::StatusCallback& callback,
230 ServiceWorkerStatusCode status, 231 ServiceWorkerStatusCode status,
231 int process_id) { 232 int process_id) {
(...skipping 27 matching lines...) Expand all
259 status_ = STOPPED; 260 status_ = STOPPED;
260 callback.Run(status); 261 callback.Run(status);
261 return; 262 return;
262 } 263 }
263 const int64 service_worker_version_id = params->service_worker_version_id; 264 const int64 service_worker_version_id = params->service_worker_version_id;
264 process_id_ = process_id; 265 process_id_ = process_id;
265 GURL script_url(params->script_url); 266 GURL script_url(params->script_url);
266 267
267 // Register this worker to DevToolsManager on UI thread, then continue to 268 // Register this worker to DevToolsManager on UI thread, then continue to
268 // call SendStartWorker on IO thread. 269 // call SendStartWorker on IO thread.
270 starting_phase_ = REGISTER_TO_DEVTOOLS;
269 BrowserThread::PostTask( 271 BrowserThread::PostTask(
270 BrowserThread::UI, 272 BrowserThread::UI,
271 FROM_HERE, 273 FROM_HERE,
272 base::Bind(RegisterToWorkerDevToolsManagerOnUI, 274 base::Bind(RegisterToWorkerDevToolsManagerOnUI,
273 process_id_, 275 process_id_,
274 context_.get(), 276 context_.get(),
275 context_, 277 context_,
276 service_worker_version_id, 278 service_worker_version_id,
277 script_url, 279 script_url,
278 base::Bind(&EmbeddedWorkerInstance::SendStartWorker, 280 base::Bind(&EmbeddedWorkerInstance::SendStartWorker,
(...skipping 19 matching lines...) Expand all
298 // wait_for_debugger flag is set. So we set the NULL time here. 300 // wait_for_debugger flag is set. So we set the NULL time here.
299 start_timing_ = base::TimeTicks(); 301 start_timing_ = base::TimeTicks();
300 } else { 302 } else {
301 DCHECK(!start_timing_.is_null()); 303 DCHECK(!start_timing_.is_null());
302 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ProcessAllocation", 304 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ProcessAllocation",
303 base::TimeTicks::Now() - start_timing_); 305 base::TimeTicks::Now() - start_timing_);
304 // Reset |start_timing_| to measure the time excluding the process 306 // Reset |start_timing_| to measure the time excluding the process
305 // allocation time. 307 // allocation time.
306 start_timing_ = base::TimeTicks::Now(); 308 start_timing_ = base::TimeTicks::Now();
307 } 309 }
310
311 starting_phase_ = SEND_START_WORKER;
308 ServiceWorkerStatusCode status = 312 ServiceWorkerStatusCode status =
309 registry_->SendStartWorker(params.Pass(), process_id_); 313 registry_->SendStartWorker(params.Pass(), process_id_);
310 if (status != SERVICE_WORKER_OK) { 314 if (status != SERVICE_WORKER_OK) {
311 callback.Run(status); 315 callback.Run(status);
312 return; 316 return;
313 } 317 }
314 DCHECK(start_callback_.is_null()); 318 DCHECK(start_callback_.is_null());
315 start_callback_ = callback; 319 start_callback_ = callback;
316 } 320 }
317 321
318 void EmbeddedWorkerInstance::OnReadyForInspection() { 322 void EmbeddedWorkerInstance::OnReadyForInspection() {
319 if (devtools_proxy_) 323 if (devtools_proxy_)
320 devtools_proxy_->NotifyWorkerReadyForInspection(); 324 devtools_proxy_->NotifyWorkerReadyForInspection();
321 } 325 }
322 326
323 void EmbeddedWorkerInstance::OnScriptLoaded(int thread_id) { 327 void EmbeddedWorkerInstance::OnScriptLoaded(int thread_id) {
328 starting_phase_ = SCRIPT_LOADED;
324 if (!start_timing_.is_null()) { 329 if (!start_timing_.is_null()) {
325 if (network_accessed_for_script_) { 330 if (network_accessed_for_script_) {
326 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptLoadWithNetworkAccess", 331 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptLoadWithNetworkAccess",
327 base::TimeTicks::Now() - start_timing_); 332 base::TimeTicks::Now() - start_timing_);
328 } else { 333 } else {
329 UMA_HISTOGRAM_TIMES( 334 UMA_HISTOGRAM_TIMES(
330 "EmbeddedWorkerInstance.ScriptLoadWithoutNetworkAccess", 335 "EmbeddedWorkerInstance.ScriptLoadWithoutNetworkAccess",
331 base::TimeTicks::Now() - start_timing_); 336 base::TimeTicks::Now() - start_timing_);
332 } 337 }
333 // Reset |start_timing_| to measure the time excluding the process 338 // Reset |start_timing_| to measure the time excluding the process
334 // allocation time and the script loading time. 339 // allocation time and the script loading time.
335 start_timing_ = base::TimeTicks::Now(); 340 start_timing_ = base::TimeTicks::Now();
336 } 341 }
337 thread_id_ = thread_id; 342 thread_id_ = thread_id;
338 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded()); 343 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded());
339 } 344 }
340 345
341 void EmbeddedWorkerInstance::OnScriptLoadFailed() { 346 void EmbeddedWorkerInstance::OnScriptLoadFailed() {
342 } 347 }
343 348
344 void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { 349 void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) {
350 starting_phase_ = SCRIPT_EVALUATED;
345 if (success && !start_timing_.is_null()) { 351 if (success && !start_timing_.is_null()) {
346 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptEvaluate", 352 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptEvaluate",
347 base::TimeTicks::Now() - start_timing_); 353 base::TimeTicks::Now() - start_timing_);
348 } 354 }
349 DCHECK(!start_callback_.is_null()); 355 DCHECK(!start_callback_.is_null());
350 start_callback_.Run(success ? SERVICE_WORKER_OK 356 start_callback_.Run(success ? SERVICE_WORKER_OK
351 : SERVICE_WORKER_ERROR_START_WORKER_FAILED); 357 : SERVICE_WORKER_ERROR_START_WORKER_FAILED);
352 start_callback_.Reset(); 358 start_callback_.Reset();
353 } 359 }
354 360
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 433
428 void EmbeddedWorkerInstance::AddListener(Listener* listener) { 434 void EmbeddedWorkerInstance::AddListener(Listener* listener) {
429 listener_list_.AddObserver(listener); 435 listener_list_.AddObserver(listener);
430 } 436 }
431 437
432 void EmbeddedWorkerInstance::RemoveListener(Listener* listener) { 438 void EmbeddedWorkerInstance::RemoveListener(Listener* listener) {
433 listener_list_.RemoveObserver(listener); 439 listener_list_.RemoveObserver(listener);
434 } 440 }
435 441
436 void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() { 442 void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() {
443 starting_phase_ = SCRIPT_DOWNLOAD;
437 network_accessed_for_script_ = true; 444 network_accessed_for_script_ = true;
438 } 445 }
439 446
447 // static
448 std::string EmbeddedWorkerInstance::StatusToString(Status status) {
449 switch (status) {
450 case STOPPED:
451 return "STOPPED";
452 case STARTING:
453 return "STARTING";
454 case RUNNING:
455 return "RUNNING";
456 case STOPPING:
457 return "STOPPING";
458 }
459 NOTREACHED() << status;
460 return std::string();
461 }
462
463 // static
464 std::string EmbeddedWorkerInstance::StartingPhaseToString(StartingPhase phase) {
465 switch (phase) {
466 case NOT_STARTING:
467 return "Not in STARTING status";
468 case ALLOCATE_PROCESS:
469 return "Allocate process";
470 case REGISTER_TO_DEVTOOLS:
471 return "Register to DevTools";
472 case SEND_START_WORKER:
473 return "Send StartWorker message to renderer";
474 case SCRIPT_DOWNLOAD:
kinuko 2015/03/02 03:19:33 nit: This one looks slightly inconsistent from oth
falken 2015/03/02 04:19:16 Adjusted the names a bit, how's this?
475 return "Script download";
476 case SCRIPT_LOADED:
477 return "Script loaded";
478 case SCRIPT_EVALUATED:
479 return "Script evaluated";
480 case STARTING_PHASE_MAX_VALUE:
481 NOTREACHED();
482 }
483 NOTREACHED() << phase;
484 return std::string();
485 }
486
440 } // namespace content 487 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698