summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhoro <horo@chromium.org>2014-10-01 00:56:28 -0700
committerCommit bot <commit-bot@chromium.org>2014-10-01 07:57:10 +0000
commit00320571a4696025c2216a4f1fe193f13c5f2355 (patch)
treef52554e586f078630ec1ef3abb756967e2f7a230
parentda0493f1ee142e6724a1407450d3c1f7f5c7e176 (diff)
downloadchromium_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}
-rw-r--r--content/browser/loader/resource_loader.cc1
-rw-r--r--content/browser/service_worker/service_worker_context_request_handler.cc2
-rw-r--r--content/browser/service_worker/service_worker_context_request_handler.h1
-rw-r--r--content/browser/service_worker/service_worker_controllee_request_handler.cc3
-rw-r--r--content/browser/service_worker/service_worker_controllee_request_handler.h1
-rw-r--r--content/browser/service_worker/service_worker_request_handler.h1
-rw-r--r--content/browser/service_worker/service_worker_url_request_job.cc16
-rw-r--r--content/browser/service_worker/service_worker_url_request_job.h2
-rw-r--r--content/child/web_url_loader_impl.cc2
-rw-r--r--content/common/resource_messages.h1
-rw-r--r--content/public/common/resource_response_info.cc3
-rw-r--r--content/public/common/resource_response_info.h6
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;