| OLD | NEW |
| 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 // An implementation of WebURLLoader in terms of ResourceLoaderBridge. | 5 // An implementation of WebURLLoader in terms of ResourceLoaderBridge. |
| 6 | 6 |
| 7 #include "content/child/web_url_loader_impl.h" | 7 #include "content/child/web_url_loader_impl.h" |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 | 232 |
| 233 void Cancel(); | 233 void Cancel(); |
| 234 void SetDefersLoading(bool value); | 234 void SetDefersLoading(bool value); |
| 235 void DidChangePriority(WebURLRequest::Priority new_priority, | 235 void DidChangePriority(WebURLRequest::Priority new_priority, |
| 236 int intra_priority_value); | 236 int intra_priority_value); |
| 237 void Start(const WebURLRequest& request, | 237 void Start(const WebURLRequest& request, |
| 238 SyncLoadResponse* sync_load_response); | 238 SyncLoadResponse* sync_load_response); |
| 239 | 239 |
| 240 // RequestPeer methods: | 240 // RequestPeer methods: |
| 241 virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; | 241 virtual void OnUploadProgress(uint64 position, uint64 size) OVERRIDE; |
| 242 virtual bool OnReceivedRedirect( | 242 virtual bool OnReceivedRedirect(const GURL& new_url, |
| 243 const GURL& new_url, | 243 const GURL& new_first_party_for_cookies, |
| 244 const ResourceResponseInfo& info, | 244 const ResourceResponseInfo& info) OVERRIDE; |
| 245 bool* has_new_first_party_for_cookies, | |
| 246 GURL* new_first_party_for_cookies) OVERRIDE; | |
| 247 virtual void OnReceivedResponse(const ResourceResponseInfo& info) OVERRIDE; | 245 virtual void OnReceivedResponse(const ResourceResponseInfo& info) OVERRIDE; |
| 248 virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE; | 246 virtual void OnDownloadedData(int len, int encoded_data_length) OVERRIDE; |
| 249 virtual void OnReceivedData(const char* data, | 247 virtual void OnReceivedData(const char* data, |
| 250 int data_length, | 248 int data_length, |
| 251 int encoded_data_length) OVERRIDE; | 249 int encoded_data_length) OVERRIDE; |
| 252 virtual void OnReceivedCachedMetadata(const char* data, int len) OVERRIDE; | 250 virtual void OnReceivedCachedMetadata(const char* data, int len) OVERRIDE; |
| 253 virtual void OnCompletedRequest( | 251 virtual void OnCompletedRequest( |
| 254 int error_code, | 252 int error_code, |
| 255 bool was_ignored_by_handler, | 253 bool was_ignored_by_handler, |
| 256 bool stale_copy_in_cache, | 254 bool stale_copy_in_cache, |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 } | 465 } |
| 468 } | 466 } |
| 469 | 467 |
| 470 void WebURLLoaderImpl::Context::OnUploadProgress(uint64 position, uint64 size) { | 468 void WebURLLoaderImpl::Context::OnUploadProgress(uint64 position, uint64 size) { |
| 471 if (client_) | 469 if (client_) |
| 472 client_->didSendData(loader_, position, size); | 470 client_->didSendData(loader_, position, size); |
| 473 } | 471 } |
| 474 | 472 |
| 475 bool WebURLLoaderImpl::Context::OnReceivedRedirect( | 473 bool WebURLLoaderImpl::Context::OnReceivedRedirect( |
| 476 const GURL& new_url, | 474 const GURL& new_url, |
| 477 const ResourceResponseInfo& info, | 475 const GURL& new_first_party_for_cookies, |
| 478 bool* has_new_first_party_for_cookies, | 476 const ResourceResponseInfo& info) { |
| 479 GURL* new_first_party_for_cookies) { | |
| 480 if (!client_) | 477 if (!client_) |
| 481 return false; | 478 return false; |
| 482 | 479 |
| 483 WebURLResponse response; | 480 WebURLResponse response; |
| 484 response.initialize(); | 481 response.initialize(); |
| 485 PopulateURLResponse(request_.url(), info, &response); | 482 PopulateURLResponse(request_.url(), info, &response); |
| 486 | 483 |
| 487 // TODO(darin): We lack sufficient information to construct the actual | 484 // TODO(darin): We lack sufficient information to construct the actual |
| 488 // request that resulted from the redirect. | 485 // request that resulted from the redirect. |
| 489 WebURLRequest new_request(new_url); | 486 WebURLRequest new_request(new_url); |
| 490 new_request.setFirstPartyForCookies(request_.firstPartyForCookies()); | 487 new_request.setFirstPartyForCookies(new_first_party_for_cookies); |
| 491 new_request.setDownloadToFile(request_.downloadToFile()); | 488 new_request.setDownloadToFile(request_.downloadToFile()); |
| 492 | 489 |
| 493 WebString referrer_string = WebString::fromUTF8("Referer"); | 490 WebString referrer_string = WebString::fromUTF8("Referer"); |
| 494 WebString referrer = WebSecurityPolicy::generateReferrerHeader( | 491 WebString referrer = WebSecurityPolicy::generateReferrerHeader( |
| 495 referrer_policy_, | 492 referrer_policy_, |
| 496 new_url, | 493 new_url, |
| 497 request_.httpHeaderField(referrer_string)); | 494 request_.httpHeaderField(referrer_string)); |
| 498 if (!referrer.isEmpty()) | 495 if (!referrer.isEmpty()) |
| 499 new_request.setHTTPReferrer(referrer, referrer_policy_); | 496 new_request.setHTTPReferrer(referrer, referrer_policy_); |
| 500 | 497 |
| 501 std::string method = request_.httpMethod().utf8(); | 498 std::string method = request_.httpMethod().utf8(); |
| 502 std::string new_method = net::URLRequest::ComputeMethodForRedirect( | 499 std::string new_method = net::URLRequest::ComputeMethodForRedirect( |
| 503 method, response.httpStatusCode()); | 500 method, response.httpStatusCode()); |
| 504 new_request.setHTTPMethod(WebString::fromUTF8(new_method)); | 501 new_request.setHTTPMethod(WebString::fromUTF8(new_method)); |
| 505 if (new_method == method) | 502 if (new_method == method) |
| 506 new_request.setHTTPBody(request_.httpBody()); | 503 new_request.setHTTPBody(request_.httpBody()); |
| 507 | 504 |
| 508 client_->willSendRequest(loader_, new_request, response); | 505 client_->willSendRequest(loader_, new_request, response); |
| 509 request_ = new_request; | 506 request_ = new_request; |
| 510 *has_new_first_party_for_cookies = true; | |
| 511 *new_first_party_for_cookies = request_.firstPartyForCookies(); | |
| 512 | 507 |
| 513 // Only follow the redirect if WebKit left the URL unmodified. | 508 // Only follow the redirect if WebKit left the URL unmodified. |
| 514 if (new_url == GURL(new_request.url())) | 509 if (new_url == GURL(new_request.url())) { |
| 510 // First-party cookie logic moved from DocumentLoader in Blink to |
| 511 // CrossSiteResourceHandler in the browser. Assert that Blink didn't try to |
| 512 // change it to something else. |
| 513 DCHECK_EQ(new_first_party_for_cookies.spec(), |
| 514 request_.firstPartyForCookies().string().utf8()); |
| 515 return true; | 515 return true; |
| 516 } |
| 516 | 517 |
| 517 // We assume that WebKit only changes the URL to suppress a redirect, and we | 518 // We assume that WebKit only changes the URL to suppress a redirect, and we |
| 518 // assume that it does so by setting it to be invalid. | 519 // assume that it does so by setting it to be invalid. |
| 519 DCHECK(!new_request.url().isValid()); | 520 DCHECK(!new_request.url().isValid()); |
| 520 return false; | 521 return false; |
| 521 } | 522 } |
| 522 | 523 |
| 523 void WebURLLoaderImpl::Context::OnReceivedResponse( | 524 void WebURLLoaderImpl::Context::OnReceivedResponse( |
| 524 const ResourceResponseInfo& info) { | 525 const ResourceResponseInfo& info) { |
| 525 if (!client_) | 526 if (!client_) |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 void WebURLLoaderImpl::setDefersLoading(bool value) { | 870 void WebURLLoaderImpl::setDefersLoading(bool value) { |
| 870 context_->SetDefersLoading(value); | 871 context_->SetDefersLoading(value); |
| 871 } | 872 } |
| 872 | 873 |
| 873 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority, | 874 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority, |
| 874 int intra_priority_value) { | 875 int intra_priority_value) { |
| 875 context_->DidChangePriority(new_priority, intra_priority_value); | 876 context_->DidChangePriority(new_priority, intra_priority_value); |
| 876 } | 877 } |
| 877 | 878 |
| 878 } // namespace content | 879 } // namespace content |
| OLD | NEW |