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

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: sync again 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_ = ALLOCATING_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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
207 thread_id_, embedded_worker_id_, message)); 208 thread_id_, embedded_worker_id_, message));
208 } 209 }
209 210
210 EmbeddedWorkerInstance::EmbeddedWorkerInstance( 211 EmbeddedWorkerInstance::EmbeddedWorkerInstance(
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),
218 starting_phase_(NOT_STARTING),
217 process_id_(-1), 219 process_id_(-1),
218 thread_id_(kInvalidEmbeddedWorkerThreadId), 220 thread_id_(kInvalidEmbeddedWorkerThreadId),
219 devtools_attached_(false), 221 devtools_attached_(false),
220 network_accessed_for_script_(false), 222 network_accessed_for_script_(false),
221 weak_factory_(this) { 223 weak_factory_(this) {
222 } 224 }
223 225
224 // static 226 // static
225 void EmbeddedWorkerInstance::RunProcessAllocated( 227 void EmbeddedWorkerInstance::RunProcessAllocated(
226 base::WeakPtr<EmbeddedWorkerInstance> instance, 228 base::WeakPtr<EmbeddedWorkerInstance> instance,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
259 status_ = STOPPED; 261 status_ = STOPPED;
260 callback.Run(status); 262 callback.Run(status);
261 return; 263 return;
262 } 264 }
263 const int64 service_worker_version_id = params->service_worker_version_id; 265 const int64 service_worker_version_id = params->service_worker_version_id;
264 process_id_ = process_id; 266 process_id_ = process_id;
265 GURL script_url(params->script_url); 267 GURL script_url(params->script_url);
266 268
267 // Register this worker to DevToolsManager on UI thread, then continue to 269 // Register this worker to DevToolsManager on UI thread, then continue to
268 // call SendStartWorker on IO thread. 270 // call SendStartWorker on IO thread.
271 starting_phase_ = REGISTERING_TO_DEVTOOLS;
269 BrowserThread::PostTask( 272 BrowserThread::PostTask(
270 BrowserThread::UI, 273 BrowserThread::UI,
271 FROM_HERE, 274 FROM_HERE,
272 base::Bind(RegisterToWorkerDevToolsManagerOnUI, 275 base::Bind(RegisterToWorkerDevToolsManagerOnUI,
273 process_id_, 276 process_id_,
274 context_.get(), 277 context_.get(),
275 context_, 278 context_,
276 service_worker_version_id, 279 service_worker_version_id,
277 script_url, 280 script_url,
278 base::Bind(&EmbeddedWorkerInstance::SendStartWorker, 281 base::Bind(&EmbeddedWorkerInstance::SendStartWorker,
(...skipping 19 matching lines...) Expand all
298 // wait_for_debugger flag is set. So we set the NULL time here. 301 // wait_for_debugger flag is set. So we set the NULL time here.
299 start_timing_ = base::TimeTicks(); 302 start_timing_ = base::TimeTicks();
300 } else { 303 } else {
301 DCHECK(!start_timing_.is_null()); 304 DCHECK(!start_timing_.is_null());
302 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ProcessAllocation", 305 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ProcessAllocation",
303 base::TimeTicks::Now() - start_timing_); 306 base::TimeTicks::Now() - start_timing_);
304 // Reset |start_timing_| to measure the time excluding the process 307 // Reset |start_timing_| to measure the time excluding the process
305 // allocation time. 308 // allocation time.
306 start_timing_ = base::TimeTicks::Now(); 309 start_timing_ = base::TimeTicks::Now();
307 } 310 }
311
312 starting_phase_ = SENT_START_WORKER;
308 ServiceWorkerStatusCode status = 313 ServiceWorkerStatusCode status =
309 registry_->SendStartWorker(params.Pass(), process_id_); 314 registry_->SendStartWorker(params.Pass(), process_id_);
310 if (status != SERVICE_WORKER_OK) { 315 if (status != SERVICE_WORKER_OK) {
311 callback.Run(status); 316 callback.Run(status);
312 return; 317 return;
313 } 318 }
314 DCHECK(start_callback_.is_null()); 319 DCHECK(start_callback_.is_null());
315 start_callback_ = callback; 320 start_callback_ = callback;
316 } 321 }
317 322
318 void EmbeddedWorkerInstance::OnReadyForInspection() { 323 void EmbeddedWorkerInstance::OnReadyForInspection() {
319 if (devtools_proxy_) 324 if (devtools_proxy_)
320 devtools_proxy_->NotifyWorkerReadyForInspection(); 325 devtools_proxy_->NotifyWorkerReadyForInspection();
321 } 326 }
322 327
323 void EmbeddedWorkerInstance::OnScriptLoaded(int thread_id) { 328 void EmbeddedWorkerInstance::OnScriptLoaded(int thread_id) {
329 starting_phase_ = SCRIPT_LOADED;
324 if (!start_timing_.is_null()) { 330 if (!start_timing_.is_null()) {
325 if (network_accessed_for_script_) { 331 if (network_accessed_for_script_) {
326 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptLoadWithNetworkAccess", 332 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptLoadWithNetworkAccess",
327 base::TimeTicks::Now() - start_timing_); 333 base::TimeTicks::Now() - start_timing_);
328 } else { 334 } else {
329 UMA_HISTOGRAM_TIMES( 335 UMA_HISTOGRAM_TIMES(
330 "EmbeddedWorkerInstance.ScriptLoadWithoutNetworkAccess", 336 "EmbeddedWorkerInstance.ScriptLoadWithoutNetworkAccess",
331 base::TimeTicks::Now() - start_timing_); 337 base::TimeTicks::Now() - start_timing_);
332 } 338 }
333 // Reset |start_timing_| to measure the time excluding the process 339 // Reset |start_timing_| to measure the time excluding the process
334 // allocation time and the script loading time. 340 // allocation time and the script loading time.
335 start_timing_ = base::TimeTicks::Now(); 341 start_timing_ = base::TimeTicks::Now();
336 } 342 }
337 thread_id_ = thread_id; 343 thread_id_ = thread_id;
338 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded()); 344 FOR_EACH_OBSERVER(Listener, listener_list_, OnScriptLoaded());
339 } 345 }
340 346
341 void EmbeddedWorkerInstance::OnScriptLoadFailed() { 347 void EmbeddedWorkerInstance::OnScriptLoadFailed() {
342 } 348 }
343 349
344 void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) { 350 void EmbeddedWorkerInstance::OnScriptEvaluated(bool success) {
351 starting_phase_ = SCRIPT_EVALUATED;
345 if (success && !start_timing_.is_null()) { 352 if (success && !start_timing_.is_null()) {
346 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptEvaluate", 353 UMA_HISTOGRAM_TIMES("EmbeddedWorkerInstance.ScriptEvaluate",
347 base::TimeTicks::Now() - start_timing_); 354 base::TimeTicks::Now() - start_timing_);
348 } 355 }
349 DCHECK(!start_callback_.is_null()); 356 DCHECK(!start_callback_.is_null());
350 start_callback_.Run(success ? SERVICE_WORKER_OK 357 start_callback_.Run(success ? SERVICE_WORKER_OK
351 : SERVICE_WORKER_ERROR_START_WORKER_FAILED); 358 : SERVICE_WORKER_ERROR_START_WORKER_FAILED);
352 start_callback_.Reset(); 359 start_callback_.Reset();
353 } 360 }
354 361
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 434
428 void EmbeddedWorkerInstance::AddListener(Listener* listener) { 435 void EmbeddedWorkerInstance::AddListener(Listener* listener) {
429 listener_list_.AddObserver(listener); 436 listener_list_.AddObserver(listener);
430 } 437 }
431 438
432 void EmbeddedWorkerInstance::RemoveListener(Listener* listener) { 439 void EmbeddedWorkerInstance::RemoveListener(Listener* listener) {
433 listener_list_.RemoveObserver(listener); 440 listener_list_.RemoveObserver(listener);
434 } 441 }
435 442
436 void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() { 443 void EmbeddedWorkerInstance::OnNetworkAccessedForScriptLoad() {
444 starting_phase_ = SCRIPT_DOWNLOADING;
437 network_accessed_for_script_ = true; 445 network_accessed_for_script_ = true;
438 } 446 }
439 447
448 // static
449 std::string EmbeddedWorkerInstance::StatusToString(Status status) {
450 switch (status) {
451 case STOPPED:
452 return "STOPPED";
453 case STARTING:
454 return "STARTING";
455 case RUNNING:
456 return "RUNNING";
457 case STOPPING:
458 return "STOPPING";
459 }
460 NOTREACHED() << status;
461 return std::string();
462 }
463
464 // static
465 std::string EmbeddedWorkerInstance::StartingPhaseToString(StartingPhase phase) {
466 switch (phase) {
467 case NOT_STARTING:
468 return "Not in STARTING status";
469 case ALLOCATING_PROCESS:
470 return "Allocating process";
471 case REGISTERING_TO_DEVTOOLS:
472 return "Registering to DevTools";
473 case SENT_START_WORKER:
474 return "Sent StartWorker message to renderer";
475 case SCRIPT_DOWNLOADING:
476 return "Script downloading";
477 case SCRIPT_LOADED:
478 return "Script loaded";
479 case SCRIPT_EVALUATED:
480 return "Script evaluated";
481 case STARTING_PHASE_MAX_VALUE:
482 NOTREACHED();
483 }
484 NOTREACHED() << phase;
485 return std::string();
486 }
487
440 } // namespace content 488 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698