| 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_ = 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |