Chromium Code Reviews| OLD | NEW | 
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 | 
| OLD | NEW |