Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(615)

Side by Side Diff: content/child/web_url_loader_impl.cc

Issue 2393633006: Send net's ReferrerPolicy back to Blink while following redirects (Closed)
Patch Set: Remove unnecessary referrer calculation in DocumentThreadableLoader Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/child/web_url_loader_impl.h ('k') | net/url_request/url_request.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/child/web_url_loader_impl.h" 5 #include "content/child/web_url_loader_impl.h"
6 6
7 #include <openssl/ssl.h> 7 #include <openssl/ssl.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 case WebURLRequest::PriorityVeryLow: 151 case WebURLRequest::PriorityVeryLow:
152 return net::IDLE; 152 return net::IDLE;
153 153
154 case WebURLRequest::PriorityUnresolved: 154 case WebURLRequest::PriorityUnresolved:
155 default: 155 default:
156 NOTREACHED(); 156 NOTREACHED();
157 return net::LOW; 157 return net::LOW;
158 } 158 }
159 } 159 }
160 160
161 blink::WebReferrerPolicy NetReferrerPolicyToBlinkReferrerPolicy(
162 net::URLRequest::ReferrerPolicy net_policy) {
163 switch (net_policy) {
164 case net::URLRequest::CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE:
165 return blink::WebReferrerPolicyNoReferrerWhenDowngrade;
166 case net::URLRequest::
167 REDUCE_REFERRER_GRANULARITY_ON_TRANSITION_CROSS_ORIGIN:
168 return blink::
169 WebReferrerPolicyNoReferrerWhenDowngradeOriginWhenCrossOrigin;
170 case net::URLRequest::ORIGIN_ONLY_ON_TRANSITION_CROSS_ORIGIN:
171 return blink::WebReferrerPolicyOriginWhenCrossOrigin;
172 case net::URLRequest::NEVER_CLEAR_REFERRER:
173 return blink::WebReferrerPolicyAlways;
174 case net::URLRequest::ORIGIN:
175 return blink::WebReferrerPolicyOrigin;
176 case net::URLRequest::NO_REFERRER:
177 return blink::WebReferrerPolicyNever;
178 case net::URLRequest::MAX_REFERRER_POLICY:
179 NOTREACHED();
180 return blink::WebReferrerPolicyDefault;
181 }
182 NOTREACHED();
183 return blink::WebReferrerPolicyDefault;
184 }
185
161 // Extracts info from a data scheme URL |url| into |info| and |data|. Returns 186 // Extracts info from a data scheme URL |url| into |info| and |data|. Returns
162 // net::OK if successful. Returns a net error code otherwise. 187 // net::OK if successful. Returns a net error code otherwise.
163 int GetInfoFromDataURL(const GURL& url, 188 int GetInfoFromDataURL(const GURL& url,
164 ResourceResponseInfo* info, 189 ResourceResponseInfo* info,
165 std::string* data) { 190 std::string* data) {
166 // Assure same time for all time fields of data: URLs. 191 // Assure same time for all time fields of data: URLs.
167 Time now = Time::Now(); 192 Time now = Time::Now();
168 info->load_timing.request_start = TimeTicks::Now(); 193 info->load_timing.request_start = TimeTicks::Now();
169 info->load_timing.request_start_time = now; 194 info->load_timing.request_start_time = now;
170 info->request_time = now; 195 info->request_time = now;
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 void CancelBodyStreaming(); 401 void CancelBodyStreaming();
377 // We can optimize the handling of data URLs in most cases. 402 // We can optimize the handling of data URLs in most cases.
378 bool CanHandleDataURLRequestLocally() const; 403 bool CanHandleDataURLRequestLocally() const;
379 void HandleDataURL(); 404 void HandleDataURL();
380 405
381 WebURLLoaderImpl* loader_; 406 WebURLLoaderImpl* loader_;
382 WebURLRequest request_; 407 WebURLRequest request_;
383 WebURLLoaderClient* client_; 408 WebURLLoaderClient* client_;
384 ResourceDispatcher* resource_dispatcher_; 409 ResourceDispatcher* resource_dispatcher_;
385 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 410 scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
386 WebReferrerPolicy referrer_policy_;
387 std::unique_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_; 411 std::unique_ptr<FtpDirectoryListingResponseDelegate> ftp_listing_delegate_;
388 std::unique_ptr<StreamOverrideParameters> stream_override_; 412 std::unique_ptr<StreamOverrideParameters> stream_override_;
389 std::unique_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_; 413 std::unique_ptr<SharedMemoryDataConsumerHandle::Writer> body_stream_writer_;
390 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA}; 414 enum DeferState {NOT_DEFERRING, SHOULD_DEFER, DEFERRED_DATA};
391 DeferState defers_loading_; 415 DeferState defers_loading_;
392 int request_id_; 416 int request_id_;
393 417
394 mojom::URLLoaderFactory* url_loader_factory_; 418 mojom::URLLoaderFactory* url_loader_factory_;
395 }; 419 };
396 420
(...skipping 25 matching lines...) Expand all
422 446
423 // WebURLLoaderImpl::Context -------------------------------------------------- 447 // WebURLLoaderImpl::Context --------------------------------------------------
424 448
425 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader, 449 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader,
426 ResourceDispatcher* resource_dispatcher, 450 ResourceDispatcher* resource_dispatcher,
427 mojom::URLLoaderFactory* url_loader_factory) 451 mojom::URLLoaderFactory* url_loader_factory)
428 : loader_(loader), 452 : loader_(loader),
429 client_(NULL), 453 client_(NULL),
430 resource_dispatcher_(resource_dispatcher), 454 resource_dispatcher_(resource_dispatcher),
431 task_runner_(base::ThreadTaskRunnerHandle::Get()), 455 task_runner_(base::ThreadTaskRunnerHandle::Get()),
432 referrer_policy_(blink::WebReferrerPolicyDefault),
433 defers_loading_(NOT_DEFERRING), 456 defers_loading_(NOT_DEFERRING),
434 request_id_(-1), 457 request_id_(-1),
435 url_loader_factory_(url_loader_factory) {} 458 url_loader_factory_(url_loader_factory) {}
436 459
437 void WebURLLoaderImpl::Context::Cancel() { 460 void WebURLLoaderImpl::Context::Cancel() {
438 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::Context::Cancel", this, 461 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::Context::Cancel", this,
439 TRACE_EVENT_FLAG_FLOW_IN); 462 TRACE_EVENT_FLAG_FLOW_IN);
440 if (resource_dispatcher_ && // NULL in unittest. 463 if (resource_dispatcher_ && // NULL in unittest.
441 request_id_ != -1) { 464 request_id_ != -1) {
442 resource_dispatcher_->Cancel(request_id_); 465 resource_dispatcher_->Cancel(request_id_);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
525 // Check credentials flag is set when credentials mode is include. 548 // Check credentials flag is set when credentials mode is include.
526 549
527 std::unique_ptr<ResourceRequest> resource_request(new ResourceRequest); 550 std::unique_ptr<ResourceRequest> resource_request(new ResourceRequest);
528 551
529 resource_request->method = method; 552 resource_request->method = method;
530 resource_request->url = url; 553 resource_request->url = url;
531 resource_request->first_party_for_cookies = request.firstPartyForCookies(); 554 resource_request->first_party_for_cookies = request.firstPartyForCookies();
532 resource_request->request_initiator = request.requestorOrigin(); 555 resource_request->request_initiator = request.requestorOrigin();
533 resource_request->referrer = referrer_url; 556 resource_request->referrer = referrer_url;
534 557
535 referrer_policy_ = request.referrerPolicy(); 558 resource_request->referrer_policy = request.referrerPolicy();
536 resource_request->referrer_policy = referrer_policy_;
537 559
538 resource_request->headers = GetWebURLRequestHeaders(request); 560 resource_request->headers = GetWebURLRequestHeaders(request);
539 resource_request->load_flags = GetLoadFlagsForWebURLRequest(request); 561 resource_request->load_flags = GetLoadFlagsForWebURLRequest(request);
540 // origin_pid only needs to be non-zero if the request originates outside 562 // origin_pid only needs to be non-zero if the request originates outside
541 // the render process, so we can use requestorProcessID even for requests 563 // the render process, so we can use requestorProcessID even for requests
542 // from in-process plugins. 564 // from in-process plugins.
543 resource_request->origin_pid = request.requestorProcessID(); 565 resource_request->origin_pid = request.requestorProcessID();
544 resource_request->resource_type = WebURLRequestToResourceType(request); 566 resource_request->resource_type = WebURLRequestToResourceType(request);
545 resource_request->priority = 567 resource_request->priority =
546 ConvertWebKitPriorityToNetPriority(request.getPriority()); 568 ConvertWebKitPriorityToNetPriority(request.getPriority());
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
630 TRACE_EVENT_WITH_FLOW0( 652 TRACE_EVENT_WITH_FLOW0(
631 "loading", "WebURLLoaderImpl::Context::OnReceivedRedirect", 653 "loading", "WebURLLoaderImpl::Context::OnReceivedRedirect",
632 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); 654 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
633 655
634 WebURLResponse response; 656 WebURLResponse response;
635 PopulateURLResponse(request_.url(), info, &response, 657 PopulateURLResponse(request_.url(), info, &response,
636 request_.reportRawHeaders()); 658 request_.reportRawHeaders());
637 659
638 WebURLRequest new_request; 660 WebURLRequest new_request;
639 PopulateURLRequestForRedirect( 661 PopulateURLRequestForRedirect(
640 request_, redirect_info, referrer_policy_, 662 request_, redirect_info,
641 info.was_fetched_via_service_worker 663 info.was_fetched_via_service_worker
642 ? blink::WebURLRequest::SkipServiceWorker::None 664 ? blink::WebURLRequest::SkipServiceWorker::None
643 : blink::WebURLRequest::SkipServiceWorker::All, 665 : blink::WebURLRequest::SkipServiceWorker::All,
644 &new_request); 666 &new_request);
645 667
646 client_->willFollowRedirect(loader_, new_request, response); 668 client_->willFollowRedirect(loader_, new_request, response);
647 request_ = new_request; 669 request_ = new_request;
648 670
649 // Only follow the redirect if WebKit left the URL unmodified. 671 // Only follow the redirect if WebKit left the URL unmodified.
650 if (redirect_info.new_url == GURL(new_request.url())) { 672 if (redirect_info.new_url == GURL(new_request.url())) {
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 std::string name; 1156 std::string name;
1135 while (headers->EnumerateHeaderLines(&iter, &name, &value)) { 1157 while (headers->EnumerateHeaderLines(&iter, &name, &value)) {
1136 response->addHTTPHeaderField(WebString::fromLatin1(name), 1158 response->addHTTPHeaderField(WebString::fromLatin1(name),
1137 WebString::fromLatin1(value)); 1159 WebString::fromLatin1(value));
1138 } 1160 }
1139 } 1161 }
1140 1162
1141 void WebURLLoaderImpl::PopulateURLRequestForRedirect( 1163 void WebURLLoaderImpl::PopulateURLRequestForRedirect(
1142 const blink::WebURLRequest& request, 1164 const blink::WebURLRequest& request,
1143 const net::RedirectInfo& redirect_info, 1165 const net::RedirectInfo& redirect_info,
1144 blink::WebReferrerPolicy referrer_policy,
1145 blink::WebURLRequest::SkipServiceWorker skip_service_worker, 1166 blink::WebURLRequest::SkipServiceWorker skip_service_worker,
1146 blink::WebURLRequest* new_request) { 1167 blink::WebURLRequest* new_request) {
1147 // TODO(darin): We lack sufficient information to construct the actual 1168 // TODO(darin): We lack sufficient information to construct the actual
1148 // request that resulted from the redirect. 1169 // request that resulted from the redirect.
1149 new_request->setURL(redirect_info.new_url); 1170 new_request->setURL(redirect_info.new_url);
1150 new_request->setFirstPartyForCookies( 1171 new_request->setFirstPartyForCookies(
1151 redirect_info.new_first_party_for_cookies); 1172 redirect_info.new_first_party_for_cookies);
1152 new_request->setDownloadToFile(request.downloadToFile()); 1173 new_request->setDownloadToFile(request.downloadToFile());
1153 new_request->setUseStreamOnResponse(request.useStreamOnResponse()); 1174 new_request->setUseStreamOnResponse(request.useStreamOnResponse());
1154 new_request->setRequestContext(request.getRequestContext()); 1175 new_request->setRequestContext(request.getRequestContext());
1155 new_request->setFrameType(request.getFrameType()); 1176 new_request->setFrameType(request.getFrameType());
1156 new_request->setSkipServiceWorker(skip_service_worker); 1177 new_request->setSkipServiceWorker(skip_service_worker);
1157 new_request->setShouldResetAppCache(request.shouldResetAppCache()); 1178 new_request->setShouldResetAppCache(request.shouldResetAppCache());
1158 new_request->setFetchRequestMode(request.getFetchRequestMode()); 1179 new_request->setFetchRequestMode(request.getFetchRequestMode());
1159 new_request->setFetchCredentialsMode(request.getFetchCredentialsMode()); 1180 new_request->setFetchCredentialsMode(request.getFetchCredentialsMode());
1160 1181
1161 new_request->setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer), 1182 new_request->setHTTPReferrer(WebString::fromUTF8(redirect_info.new_referrer),
1162 referrer_policy); 1183 NetReferrerPolicyToBlinkReferrerPolicy(
1184 redirect_info.new_referrer_policy));
1163 new_request->setPriority(request.getPriority()); 1185 new_request->setPriority(request.getPriority());
1164 1186
1165 std::string old_method = request.httpMethod().utf8(); 1187 std::string old_method = request.httpMethod().utf8();
1166 new_request->setHTTPMethod(WebString::fromUTF8(redirect_info.new_method)); 1188 new_request->setHTTPMethod(WebString::fromUTF8(redirect_info.new_method));
1167 if (redirect_info.new_method == old_method) 1189 if (redirect_info.new_method == old_method)
1168 new_request->setHTTPBody(request.httpBody()); 1190 new_request->setHTTPBody(request.httpBody());
1169 } 1191 }
1170 1192
1171 void WebURLLoaderImpl::loadSynchronously(const WebURLRequest& request, 1193 void WebURLLoaderImpl::loadSynchronously(const WebURLRequest& request,
1172 WebURLResponse& response, 1194 WebURLResponse& response,
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
1269 response->clearHTTPHeaderField(webStringName); 1291 response->clearHTTPHeaderField(webStringName);
1270 while (response_headers->EnumerateHeader(&iterator, name, &value)) { 1292 while (response_headers->EnumerateHeader(&iterator, name, &value)) {
1271 response->addHTTPHeaderField(webStringName, 1293 response->addHTTPHeaderField(webStringName,
1272 WebString::fromLatin1(value)); 1294 WebString::fromLatin1(value));
1273 } 1295 }
1274 } 1296 }
1275 return true; 1297 return true;
1276 } 1298 }
1277 1299
1278 } // namespace content 1300 } // namespace content
OLDNEW
« no previous file with comments | « content/child/web_url_loader_impl.h ('k') | net/url_request/url_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698