| 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 0c5202d16a8cb8a6d64b3058dda15312207eec81..9103b8328798b050a9e18999257952c2285feb72 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -452,7 +452,7 @@ void ServiceWorkerVersion::StartWorker(
|
| bool pause_after_download,
|
| const StatusCallback& callback) {
|
| if (!context_) {
|
| - RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| + RunSoon(base::Bind(callback, SERVICE_WORKER_ERROR_ABORT));
|
| return;
|
| }
|
|
|
| @@ -942,7 +942,8 @@ void ServiceWorkerVersion::OnStopped(
|
| if (!should_restart) {
|
| // Let all start callbacks fail.
|
| RunCallbacks(this, &start_callbacks_,
|
| - SERVICE_WORKER_ERROR_START_WORKER_FAILED);
|
| + DeduceStartWorkerFailureReason(
|
| + SERVICE_WORKER_ERROR_START_WORKER_FAILED));
|
| }
|
|
|
| // Let all message callbacks fail (this will also fire and clear all
|
| @@ -1047,8 +1048,10 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) {
|
|
|
| void ServiceWorkerVersion::OnStartSentAndScriptEvaluated(
|
| ServiceWorkerStatusCode status) {
|
| - if (status != SERVICE_WORKER_OK)
|
| - RunCallbacks(this, &start_callbacks_, status);
|
| + if (status != SERVICE_WORKER_OK) {
|
| + RunCallbacks(this, &start_callbacks_,
|
| + DeduceStartWorkerFailureReason(status));
|
| + }
|
| }
|
|
|
| void ServiceWorkerVersion::DispatchInstallEventAfterStartWorker(
|
| @@ -1862,4 +1865,26 @@ void ServiceWorkerVersion::SetAllRequestTimes(const base::TimeTicks& ticks) {
|
| requests_ = new_requests;
|
| }
|
|
|
| +ServiceWorkerStatusCode ServiceWorkerVersion::DeduceStartWorkerFailureReason(
|
| + ServiceWorkerStatusCode default_code) {
|
| + if (ping_state_ == PING_TIMED_OUT)
|
| + return SERVICE_WORKER_ERROR_TIMEOUT;
|
| +
|
| + const net::URLRequestStatus& main_script_status =
|
| + script_cache_map()->main_script_status();
|
| + if (main_script_status.status() != net::URLRequestStatus::SUCCESS) {
|
| + switch (main_script_status.error()) {
|
| + case net::ERR_INSECURE_RESPONSE:
|
| + case net::ERR_UNSAFE_REDIRECT:
|
| + return SERVICE_WORKER_ERROR_SECURITY;
|
| + case net::ERR_ABORTED:
|
| + return SERVICE_WORKER_ERROR_ABORT;
|
| + default:
|
| + return SERVICE_WORKER_ERROR_NETWORK;
|
| + }
|
| + }
|
| +
|
| + return default_code;
|
| +}
|
| +
|
| } // namespace content
|
|
|