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 de905b6743208129d0de8414e1e25a44786cd5c8..6db79fa4d61930af3cfcb59285ae54af44ef5f69 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -348,12 +348,14 @@ bool IsInstalled(ServiceWorkerVersion::Status status) { |
switch (status) { |
case ServiceWorkerVersion::NEW: |
case ServiceWorkerVersion::INSTALLING: |
- case ServiceWorkerVersion::REDUNDANT: |
return false; |
case ServiceWorkerVersion::INSTALLED: |
case ServiceWorkerVersion::ACTIVATING: |
case ServiceWorkerVersion::ACTIVATED: |
return true; |
+ case ServiceWorkerVersion::REDUNDANT: |
+ NOTREACHED() << "Cannot use REDUNDANT here."; |
+ return false; |
} |
NOTREACHED() << "Unexpected status: " << status; |
return false; |
@@ -455,6 +457,11 @@ void ServiceWorkerVersion::StartWorker( |
RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT)); |
return; |
} |
+ if (status_ == REDUNDANT) { |
+ RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
+ return; |
+ } |
+ prestart_status_ = status_; |
// Ensure the live registration during starting worker so that the worker can |
// get associated with it in SWDispatcherHost::OnSetHostedVersionId(). |
@@ -840,6 +847,11 @@ void ServiceWorkerVersion::ReportError(ServiceWorkerStatusCode status, |
} |
} |
+void ServiceWorkerVersion::SetStartWorkerStatusCode( |
+ ServiceWorkerStatusCode status) { |
+ start_worker_status_ = status; |
+} |
+ |
void ServiceWorkerVersion::Doom() { |
DCHECK(!HasControllee()); |
SetStatus(REDUNDANT); |
@@ -1517,11 +1529,16 @@ void ServiceWorkerVersion::DidEnsureLiveRegistrationForStartWorker( |
const StatusCallback& callback, |
ServiceWorkerStatusCode status, |
const scoped_refptr<ServiceWorkerRegistration>& protect) { |
- if (status != SERVICE_WORKER_OK || is_redundant()) { |
+ if (status != SERVICE_WORKER_OK) { |
RecordStartWorkerResult(status); |
RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
return; |
} |
+ if (is_redundant()) { |
+ RecordStartWorkerResult(SERVICE_WORKER_ERROR_NOT_FOUND); |
+ RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED)); |
+ return; |
+ } |
switch (running_status()) { |
case RUNNING: |
@@ -1745,17 +1762,13 @@ void ServiceWorkerVersion::RecordStartWorkerResult( |
base::TimeTicks start_time = start_time_; |
ClearTick(&start_time_); |
- // Failing to start a redundant worker isn't interesting and very common when |
- // update dooms because the script is byte-to-byte identical. |
- if (is_redundant()) |
- return; |
- |
- ServiceWorkerMetrics::RecordStartWorkerStatus(status, IsInstalled(status_)); |
+ ServiceWorkerMetrics::RecordStartWorkerStatus(status, |
+ IsInstalled(prestart_status_)); |
if (status == SERVICE_WORKER_OK && !start_time.is_null() && |
!skip_recording_startup_time_) { |
ServiceWorkerMetrics::RecordStartWorkerTime(GetTickDuration(start_time), |
- IsInstalled(status_)); |
+ IsInstalled(prestart_status_)); |
} |
if (status != SERVICE_WORKER_ERROR_TIMEOUT) |
@@ -1854,6 +1867,9 @@ ServiceWorkerStatusCode ServiceWorkerVersion::DeduceStartWorkerFailureReason( |
if (ping_state_ == PING_TIMED_OUT) |
return SERVICE_WORKER_ERROR_TIMEOUT; |
+ if (start_worker_status_ != SERVICE_WORKER_OK) |
+ return start_worker_status_; |
+ |
const net::URLRequestStatus& main_script_status = |
script_cache_map()->main_script_status(); |
if (main_script_status.status() != net::URLRequestStatus::SUCCESS) { |