diff options
author | horo <horo@chromium.org> | 2014-10-01 00:56:28 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-01 07:57:10 +0000 |
commit | 00320571a4696025c2216a4f1fe193f13c5f2355 (patch) | |
tree | f52554e586f078630ec1ef3abb756967e2f7a230 /content | |
parent | da0493f1ee142e6724a1407450d3c1f7f5c7e176 (diff) | |
download | chromium_src-00320571a4696025c2216a4f1fe193f13c5f2355.zip chromium_src-00320571a4696025c2216a4f1fe193f13c5f2355.tar.gz chromium_src-00320571a4696025c2216a4f1fe193f13c5f2355.tar.bz2 |
[ServiceWorker] Add was_fallback_required flag to ResourceResponseInfo. [2/2 chromium]
This flag is set when the request whose mode is CORS or CORS-with-forced-preflight is sent to a ServiceWorker but FetchEvent.respondWith is not called.
It is because the CORS preflight logic is implemented in the renderer.
So we can't simply fallback to the network in the browser process.
[1/2] blink: https://codereview.chromium.org/602073002/
[2/2] chromium: https://codereview.chromium.org/603913002/
This change depends on https://codereview.chromium.org/588153002/.
BUG=416371, 408507
Review URL: https://codereview.chromium.org/603913002
Cr-Commit-Position: refs/heads/master@{#297610}
Diffstat (limited to 'content')
12 files changed, 38 insertions, 1 deletions
diff --git a/content/browser/loader/resource_loader.cc b/content/browser/loader/resource_loader.cc index 1997f892..863c592 100644 --- a/content/browser/loader/resource_loader.cc +++ b/content/browser/loader/resource_loader.cc @@ -60,6 +60,7 @@ void PopulateResourceResponse(ResourceRequestInfoImpl* info, ServiceWorkerRequestHandler::GetHandler(request)) { handler->GetExtraResponseInfo( &response->head.was_fetched_via_service_worker, + &response->head.was_fallback_required_by_service_worker, &response->head.original_url_via_service_worker, &response->head.service_worker_fetch_start, &response->head.service_worker_fetch_ready, diff --git a/content/browser/service_worker/service_worker_context_request_handler.cc b/content/browser/service_worker/service_worker_context_request_handler.cc index 81e84eb..93bacd26 100644 --- a/content/browser/service_worker/service_worker_context_request_handler.cc +++ b/content/browser/service_worker/service_worker_context_request_handler.cc @@ -90,11 +90,13 @@ net::URLRequestJob* ServiceWorkerContextRequestHandler::MaybeCreateJob( void ServiceWorkerContextRequestHandler::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 { *was_fetched_via_service_worker = false; + *was_fallback_required_by_service_worker = false; *original_url_via_service_worker = GURL(); } diff --git a/content/browser/service_worker/service_worker_context_request_handler.h b/content/browser/service_worker/service_worker_context_request_handler.h index bd5ec82..439f7b2 100644 --- a/content/browser/service_worker/service_worker_context_request_handler.h +++ b/content/browser/service_worker/service_worker_context_request_handler.h @@ -30,6 +30,7 @@ class CONTENT_EXPORT ServiceWorkerContextRequestHandler virtual void 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, diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.cc b/content/browser/service_worker/service_worker_controllee_request_handler.cc index c4f1ed6..ecf112d 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.cc +++ b/content/browser/service_worker/service_worker_controllee_request_handler.cc @@ -102,16 +102,19 @@ net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob( void ServiceWorkerControlleeRequestHandler::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 (!job_.get()) { *was_fetched_via_service_worker = false; + *was_fallback_required_by_service_worker = false; *original_url_via_service_worker = GURL(); return; } job_->GetExtraResponseInfo(was_fetched_via_service_worker, + was_fallback_required_by_service_worker, original_url_via_service_worker, fetch_start_time, fetch_ready_time, diff --git a/content/browser/service_worker/service_worker_controllee_request_handler.h b/content/browser/service_worker/service_worker_controllee_request_handler.h index 61051ba..c0e4f17 100644 --- a/content/browser/service_worker/service_worker_controllee_request_handler.h +++ b/content/browser/service_worker/service_worker_controllee_request_handler.h @@ -42,6 +42,7 @@ class CONTENT_EXPORT ServiceWorkerControlleeRequestHandler virtual void 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, diff --git a/content/browser/service_worker/service_worker_request_handler.h b/content/browser/service_worker/service_worker_request_handler.h index ef7a50f..fbd2af8 100644 --- a/content/browser/service_worker/service_worker_request_handler.h +++ b/content/browser/service_worker/service_worker_request_handler.h @@ -71,6 +71,7 @@ class CONTENT_EXPORT ServiceWorkerRequestHandler virtual void 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, 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 630075c..1919884 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; diff --git a/content/browser/service_worker/service_worker_url_request_job.h b/content/browser/service_worker/service_worker_url_request_job.h index 599586a..24c6332 100644 --- a/content/browser/service_worker/service_worker_url_request_job.h +++ b/content/browser/service_worker/service_worker_url_request_job.h @@ -90,6 +90,7 @@ class CONTENT_EXPORT ServiceWorkerURLRequestJob const net::HttpResponseInfo* http_info() const; void 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, @@ -160,6 +161,7 @@ class CONTENT_EXPORT ServiceWorkerURLRequestJob base::WeakPtr<storage::BlobStorageContext> blob_storage_context_; scoped_ptr<net::URLRequest> blob_request_; FetchRequestMode request_mode_; + bool fall_back_required_; // ResourceRequestBody has a collection of BlobDataHandles attached to it // using the userdata mechanism. So we have to keep it not to free the blobs. scoped_refptr<ResourceRequestBody> body_; diff --git a/content/child/web_url_loader_impl.cc b/content/child/web_url_loader_impl.cc index 797ef69..a9f1bc6 100644 --- a/content/child/web_url_loader_impl.cc +++ b/content/child/web_url_loader_impl.cc @@ -784,6 +784,8 @@ void WebURLLoaderImpl::PopulateURLResponse(const GURL& url, response->setConnectionReused(info.load_timing.socket_reused); response->setDownloadFilePath(info.download_file_path.AsUTF16Unsafe()); response->setWasFetchedViaServiceWorker(info.was_fetched_via_service_worker); + response->setWasFallbackRequiredByServiceWorker( + info.was_fallback_required_by_service_worker); WebURLResponseExtraDataImpl* extra_data = new WebURLResponseExtraDataImpl(info.npn_negotiated_protocol); response->setExtraData(extra_data); diff --git a/content/common/resource_messages.h b/content/common/resource_messages.h index d1ae748..4afd3b2 100644 --- a/content/common/resource_messages.h +++ b/content/common/resource_messages.h @@ -123,6 +123,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::ResourceResponseInfo) IPC_STRUCT_TRAITS_MEMBER(npn_negotiated_protocol) IPC_STRUCT_TRAITS_MEMBER(socket_address) IPC_STRUCT_TRAITS_MEMBER(was_fetched_via_service_worker) + IPC_STRUCT_TRAITS_MEMBER(was_fallback_required_by_service_worker) IPC_STRUCT_TRAITS_MEMBER(original_url_via_service_worker) IPC_STRUCT_TRAITS_MEMBER(service_worker_fetch_start) IPC_STRUCT_TRAITS_MEMBER(service_worker_fetch_ready) diff --git a/content/public/common/resource_response_info.cc b/content/public/common/resource_response_info.cc index 8e1f4de..4ce9e37 100644 --- a/content/public/common/resource_response_info.cc +++ b/content/public/common/resource_response_info.cc @@ -18,7 +18,8 @@ ResourceResponseInfo::ResourceResponseInfo() was_alternate_protocol_available(false), connection_info(net::HttpResponseInfo::CONNECTION_INFO_UNKNOWN), was_fetched_via_proxy(false), - was_fetched_via_service_worker(false) { + was_fetched_via_service_worker(false), + was_fallback_required_by_service_worker(false) { } ResourceResponseInfo::~ResourceResponseInfo() { diff --git a/content/public/common/resource_response_info.h b/content/public/common/resource_response_info.h index 49b781c..c947ffb 100644 --- a/content/public/common/resource_response_info.h +++ b/content/public/common/resource_response_info.h @@ -101,6 +101,12 @@ struct ResourceResponseInfo { // True if the response was fetched by a ServiceWorker. bool was_fetched_via_service_worker; + // True when the request whoes mode is |CORS| or |CORS-with-forced-preflight| + // is sent to a ServiceWorker but FetchEvent.respondWith is not called. So the + // renderer have to resend the request with skip service worker flag + // considering the CORS preflight logic. + bool was_fallback_required_by_service_worker; + // The original URL of the response which was fetched by the ServiceWorker. // This may be empty if the response was created inside the ServiceWorker. GURL original_url_via_service_worker; |