Chromium Code Reviews| Index: content/browser/service_worker/service_worker_version.cc |
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
| index b66de89d7b39c8c659293f3e73946562b24875ea..0e854b3f43e398f721ea71cb0781a6bc57c19879 100644 |
| --- a/content/browser/service_worker/service_worker_version.cc |
| +++ b/content/browser/service_worker/service_worker_version.cc |
| @@ -317,8 +317,6 @@ ServiceWorkerVersion::ServiceWorkerVersion( |
| context_(context), |
| script_cache_map_(this, context), |
| ping_state_(NOT_PINGING), |
| - is_doomed_(false), |
| - skip_waiting_(false), |
| weak_factory_(this) { |
| DCHECK(context_); |
| DCHECK(registration); |
| @@ -782,12 +780,18 @@ void ServiceWorkerVersion::Doom() { |
| void ServiceWorkerVersion::SetDevToolsAttached(bool attached) { |
| embedded_worker()->set_devtools_attached(attached); |
| if (attached) { |
| - // Set to null time so we don't record the startup time metric. |
| + // Don't record the startup time metric once DevTools is attached. |
| ClearTick(&start_time_); |
| + skip_recording_startup_time_ = true; |
| return; |
| } |
| - if (!timeout_timer_.IsRunning()) |
| - StartTimeoutTimer(); |
| + if (!start_callbacks_.empty()) { |
| + // Reactivate the timer for start timeout. |
| + DCHECK(timeout_timer_.IsRunning()); |
| + DCHECK(running_status() == STARTING || running_status() == STOPPING) |
| + << running_status(); |
| + RestartTick(&start_time_); |
| + } |
| } |
| void ServiceWorkerVersion::SetMainScriptHttpResponseInfo( |
| @@ -879,17 +883,8 @@ void ServiceWorkerVersion::OnStopped( |
| cache_listener_.reset(); |
| // Restart worker if we have any start callbacks and the worker isn't doomed. |
| - if (should_restart) { |
| - if (embedded_worker_->devtools_attached()) |
| - ClearTick(&start_time_); |
| - else |
| - RestartTick(&start_time_); |
| - cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); |
| - embedded_worker_->Start( |
| - version_id_, scope_, script_url_, false /* pause_after_download */, |
| - base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| - weak_factory_.GetWeakPtr())); |
| - } |
| + if (should_restart) |
| + StartWorkerInternal(false /* pause_after_download */); |
| } |
| void ServiceWorkerVersion::OnReportException( |
| @@ -1425,6 +1420,7 @@ void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( |
| ServiceWorkerStatusCode status, |
| const scoped_refptr<ServiceWorkerRegistration>& protect) { |
| if (status != SERVICE_WORKER_OK || is_doomed()) { |
| + RecordStartWorkerResult(status); |
|
falken
2015/03/23 00:52:31
Do we know start_time_ is null here? I think we mi
nhiroki
2015/03/23 01:38:51
Hmmm... I don't really understand why we need to t
|
| RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
| return; |
| } |
| @@ -1436,23 +1432,32 @@ void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( |
| case STOPPING: |
| case STOPPED: |
| case STARTING: |
| - if (!timeout_timer_.IsRunning()) |
| - StartTimeoutTimer(); |
| - // Start callbacks keep the live registration. |
| - start_callbacks_.push_back( |
| - base::Bind(&RunStartWorkerCallback, callback, protect)); |
| - if (running_status() == STOPPED) { |
| - DCHECK(!cache_listener_.get()); |
| - cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); |
| - embedded_worker_->Start( |
| - version_id_, scope_, script_url_, pause_after_download, |
| - base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| + if (start_callbacks_.empty()) { |
| + start_callbacks_.push_back( |
| + base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult, |
| weak_factory_.GetWeakPtr())); |
| } |
| + // Keep the live registration while starting the worker. |
| + start_callbacks_.push_back( |
| + base::Bind(&RunStartWorkerCallback, callback, protect)); |
| + StartWorkerInternal(pause_after_download); |
| return; |
| } |
| } |
| +void ServiceWorkerVersion::StartWorkerInternal(bool pause_after_download) { |
| + if (!timeout_timer_.IsRunning()) |
| + StartTimeoutTimer(); |
| + if (running_status() == STOPPED) { |
| + DCHECK(!cache_listener_.get()); |
| + cache_listener_.reset(new ServiceWorkerCacheListener(this, context_)); |
| + embedded_worker_->Start( |
| + version_id_, scope_, script_url_, pause_after_download, |
| + base::Bind(&ServiceWorkerVersion::OnStartSentAndScriptEvaluated, |
| + weak_factory_.GetWeakPtr())); |
| + } |
| +} |
| + |
| void ServiceWorkerVersion::DidClaimClients( |
| int request_id, ServiceWorkerStatusCode status) { |
| if (status == SERVICE_WORKER_ERROR_STATE) { |
| @@ -1485,13 +1490,14 @@ void ServiceWorkerVersion::DidGetClients( |
| void ServiceWorkerVersion::StartTimeoutTimer() { |
| DCHECK(!timeout_timer_.IsRunning()); |
| - if (embedded_worker_->devtools_attached()) |
| + if (embedded_worker_->devtools_attached()) { |
| + // Don't record the startup time metric once DevTools is attached. |
| ClearTick(&start_time_); |
| - else |
| + skip_recording_startup_time_ = true; |
| + } else { |
| RestartTick(&start_time_); |
| - start_callbacks_.push_back( |
| - base::Bind(&ServiceWorkerVersion::RecordStartWorkerResult, |
| - weak_factory_.GetWeakPtr())); |
| + skip_recording_startup_time_ = false; |
| + } |
| ClearTick(&idle_time_); |
| ClearTick(&ping_time_); |
| @@ -1514,7 +1520,8 @@ void ServiceWorkerVersion::OnTimeoutTimer() { |
| // Starting a worker hasn't finished within a certain period. |
| if (GetTickDuration(start_time_) > |
| base::TimeDelta::FromMinutes(kStartWorkerTimeoutMinutes)) { |
| - DCHECK_NE(RUNNING, running_status()); |
| + DCHECK(running_status() == STARTING || running_status() == STOPPING) |
| + << running_status(); |
| scoped_refptr<ServiceWorkerVersion> protect(this); |
| RunCallbacks(this, &start_callbacks_, SERVICE_WORKER_ERROR_TIMEOUT); |
| if (running_status() == STARTING) |
| @@ -1608,7 +1615,8 @@ void ServiceWorkerVersion::RecordStartWorkerResult( |
| UMA_HISTOGRAM_ENUMERATION("ServiceWorker.StartWorker.Status", status, |
| SERVICE_WORKER_ERROR_MAX_VALUE); |
| - if (status == SERVICE_WORKER_OK && !start_time.is_null()) { |
| + if (status == SERVICE_WORKER_OK && !start_time.is_null() && |
| + !skip_recording_startup_time_) { |
| UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.StartWorker.Time", |
| GetTickDuration(start_time)); |
| } |