Index: content/browser/service_worker/service_worker_url_request_job.cc |
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc |
index 630075c48d738ec59dfa44f8b9f26fd4ac4abb93..191988461791f9989fb890ecf8a2624aff876aa2 100644 |
--- a/content/browser/service_worker/service_worker_url_request_job.cc |
+++ b/content/browser/service_worker/service_worker_url_request_job.cc |
@@ -43,6 +43,7 @@ ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob( |
is_started_(false), |
blob_storage_context_(blob_storage_context), |
request_mode_(request_mode), |
+ fall_back_required_(false), |
body_(body), |
weak_factory_(this) { |
} |
@@ -195,16 +196,19 @@ const net::HttpResponseInfo* ServiceWorkerURLRequestJob::http_info() const { |
void ServiceWorkerURLRequestJob::GetExtraResponseInfo( |
bool* was_fetched_via_service_worker, |
+ bool* was_fallback_required_by_service_worker, |
GURL* original_url_via_service_worker, |
base::TimeTicks* fetch_start_time, |
base::TimeTicks* fetch_ready_time, |
base::TimeTicks* fetch_end_time) const { |
if (response_type_ != FORWARD_TO_SERVICE_WORKER) { |
*was_fetched_via_service_worker = false; |
+ *was_fallback_required_by_service_worker = false; |
*original_url_via_service_worker = GURL(); |
return; |
} |
*was_fetched_via_service_worker = true; |
+ *was_fallback_required_by_service_worker = fall_back_required_; |
*original_url_via_service_worker = response_url_; |
*fetch_start_time = fetch_start_time_; |
*fetch_ready_time = fetch_ready_time_; |
@@ -373,6 +377,18 @@ void ServiceWorkerURLRequestJob::DidDispatchFetchEvent( |
} |
if (fetch_result == SERVICE_WORKER_FETCH_EVENT_RESULT_FALLBACK) { |
+ // When the request_mode is |CORS| or |CORS-with-forced-preflight| we can't |
+ // simply fallback to the network in the browser process. It is because the |
+ // CORS preflight logic is implemented in the renderer. So we returns a |
+ // fall_back_required response to the renderer. |
+ if (request_mode_ == FETCH_REQUEST_MODE_CORS || |
+ request_mode_ == FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT) { |
+ fall_back_required_ = true; |
+ CreateResponseHeader( |
+ 400, "Service Worker Fallback Required", ServiceWorkerHeaderMap()); |
+ CommitResponseHeader(); |
+ return; |
+ } |
// Change the response type and restart the request to fallback to |
// the network. |
response_type_ = FALLBACK_TO_NETWORK; |