| 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 #include "content/child/web_url_loader_impl.h" | 5 #include "content/child/web_url_loader_impl.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 void OnReceivedResponse(const ResourceResponseInfo& info); | 379 void OnReceivedResponse(const ResourceResponseInfo& info); |
| 380 void OnDownloadedData(int len, int encoded_data_length); | 380 void OnDownloadedData(int len, int encoded_data_length); |
| 381 void OnReceivedData(std::unique_ptr<ReceivedData> data); | 381 void OnReceivedData(std::unique_ptr<ReceivedData> data); |
| 382 void OnTransferSizeUpdated(int transfer_size_diff); | 382 void OnTransferSizeUpdated(int transfer_size_diff); |
| 383 void OnReceivedCachedMetadata(const char* data, int len); | 383 void OnReceivedCachedMetadata(const char* data, int len); |
| 384 void OnCompletedRequest(int error_code, | 384 void OnCompletedRequest(int error_code, |
| 385 bool was_ignored_by_handler, | 385 bool was_ignored_by_handler, |
| 386 bool stale_copy_in_cache, | 386 bool stale_copy_in_cache, |
| 387 const base::TimeTicks& completion_time, | 387 const base::TimeTicks& completion_time, |
| 388 int64_t total_transfer_size, | 388 int64_t total_transfer_size, |
| 389 int64_t encoded_body_size); | 389 int64_t encoded_body_size, |
| 390 int64_t decoded_body_size); |
| 390 | 391 |
| 391 private: | 392 private: |
| 392 friend class base::RefCounted<Context>; | 393 friend class base::RefCounted<Context>; |
| 393 ~Context(); | 394 ~Context(); |
| 394 | 395 |
| 395 // Called when the body data stream is detached from the reader side. | 396 // Called when the body data stream is detached from the reader side. |
| 396 void CancelBodyStreaming(); | 397 void CancelBodyStreaming(); |
| 397 // We can optimize the handling of data URLs in most cases. | 398 // We can optimize the handling of data URLs in most cases. |
| 398 bool CanHandleDataURLRequestLocally() const; | 399 bool CanHandleDataURLRequestLocally() const; |
| 399 void HandleDataURL(); | 400 void HandleDataURL(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 428 void OnReceivedResponse(const ResourceResponseInfo& info) override; | 429 void OnReceivedResponse(const ResourceResponseInfo& info) override; |
| 429 void OnDownloadedData(int len, int encoded_data_length) override; | 430 void OnDownloadedData(int len, int encoded_data_length) override; |
| 430 void OnReceivedData(std::unique_ptr<ReceivedData> data) override; | 431 void OnReceivedData(std::unique_ptr<ReceivedData> data) override; |
| 431 void OnTransferSizeUpdated(int transfer_size_diff) override; | 432 void OnTransferSizeUpdated(int transfer_size_diff) override; |
| 432 void OnReceivedCachedMetadata(const char* data, int len) override; | 433 void OnReceivedCachedMetadata(const char* data, int len) override; |
| 433 void OnCompletedRequest(int error_code, | 434 void OnCompletedRequest(int error_code, |
| 434 bool was_ignored_by_handler, | 435 bool was_ignored_by_handler, |
| 435 bool stale_copy_in_cache, | 436 bool stale_copy_in_cache, |
| 436 const base::TimeTicks& completion_time, | 437 const base::TimeTicks& completion_time, |
| 437 int64_t total_transfer_size, | 438 int64_t total_transfer_size, |
| 438 int64_t encoded_body_size) override; | 439 int64_t encoded_body_size, |
| 440 int64_t decoded_body_size) override; |
| 439 | 441 |
| 440 private: | 442 private: |
| 441 scoped_refptr<Context> context_; | 443 scoped_refptr<Context> context_; |
| 442 DISALLOW_COPY_AND_ASSIGN(RequestPeerImpl); | 444 DISALLOW_COPY_AND_ASSIGN(RequestPeerImpl); |
| 443 }; | 445 }; |
| 444 | 446 |
| 445 // WebURLLoaderImpl::Context -------------------------------------------------- | 447 // WebURLLoaderImpl::Context -------------------------------------------------- |
| 446 | 448 |
| 447 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader, | 449 WebURLLoaderImpl::Context::Context(WebURLLoaderImpl* loader, |
| 448 ResourceDispatcher* resource_dispatcher, | 450 ResourceDispatcher* resource_dispatcher, |
| (...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 857 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); | 859 this, TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT); |
| 858 client_->DidReceiveCachedMetadata(data, len); | 860 client_->DidReceiveCachedMetadata(data, len); |
| 859 } | 861 } |
| 860 | 862 |
| 861 void WebURLLoaderImpl::Context::OnCompletedRequest( | 863 void WebURLLoaderImpl::Context::OnCompletedRequest( |
| 862 int error_code, | 864 int error_code, |
| 863 bool was_ignored_by_handler, | 865 bool was_ignored_by_handler, |
| 864 bool stale_copy_in_cache, | 866 bool stale_copy_in_cache, |
| 865 const base::TimeTicks& completion_time, | 867 const base::TimeTicks& completion_time, |
| 866 int64_t total_transfer_size, | 868 int64_t total_transfer_size, |
| 867 int64_t encoded_body_size) { | 869 int64_t encoded_body_size, |
| 870 int64_t decoded_body_size) { |
| 868 if (stream_override_ && stream_override_->stream_url.is_empty()) { | 871 if (stream_override_ && stream_override_->stream_url.is_empty()) { |
| 869 // TODO(kinuko|scottmg|jam): This is wrong. https://crbug.com/705744. | 872 // TODO(kinuko|scottmg|jam): This is wrong. https://crbug.com/705744. |
| 870 total_transfer_size = stream_override_->total_transferred; | 873 total_transfer_size = stream_override_->total_transferred; |
| 871 encoded_body_size = stream_override_->total_transferred; | 874 encoded_body_size = stream_override_->total_transferred; |
| 872 } | 875 } |
| 873 | 876 |
| 874 if (ftp_listing_delegate_) { | 877 if (ftp_listing_delegate_) { |
| 875 ftp_listing_delegate_->OnCompletedRequest(); | 878 ftp_listing_delegate_->OnCompletedRequest(); |
| 876 ftp_listing_delegate_.reset(NULL); | 879 ftp_listing_delegate_.reset(NULL); |
| 877 } | 880 } |
| 878 | 881 |
| 879 if (body_stream_writer_ && error_code != net::OK) | 882 if (body_stream_writer_ && error_code != net::OK) |
| 880 body_stream_writer_->Fail(); | 883 body_stream_writer_->Fail(); |
| 881 body_stream_writer_.reset(); | 884 body_stream_writer_.reset(); |
| 882 | 885 |
| 883 if (client_) { | 886 if (client_) { |
| 884 TRACE_EVENT_WITH_FLOW0( | 887 TRACE_EVENT_WITH_FLOW0( |
| 885 "loading", "WebURLLoaderImpl::Context::OnCompletedRequest", | 888 "loading", "WebURLLoaderImpl::Context::OnCompletedRequest", |
| 886 this, TRACE_EVENT_FLAG_FLOW_IN); | 889 this, TRACE_EVENT_FLAG_FLOW_IN); |
| 887 | 890 |
| 888 if (error_code != net::OK) { | 891 if (error_code != net::OK) { |
| 889 client_->DidFail(CreateWebURLError(request_.Url(), stale_copy_in_cache, | 892 client_->DidFail(CreateWebURLError(request_.Url(), stale_copy_in_cache, |
| 890 error_code, was_ignored_by_handler), | 893 error_code, was_ignored_by_handler), |
| 891 total_transfer_size, encoded_body_size); | 894 total_transfer_size, encoded_body_size, |
| 895 decoded_body_size); |
| 892 } else { | 896 } else { |
| 893 // PlzNavigate: compute the accurate transfer size for navigations. | 897 // PlzNavigate: compute the accurate transfer size for navigations. |
| 894 if (stream_override_) { | 898 if (stream_override_) { |
| 895 DCHECK(IsBrowserSideNavigationEnabled()); | 899 DCHECK(IsBrowserSideNavigationEnabled()); |
| 896 total_transfer_size += stream_override_->total_transfer_size_delta; | 900 total_transfer_size += stream_override_->total_transfer_size_delta; |
| 897 } | 901 } |
| 898 | 902 |
| 899 client_->DidFinishLoading((completion_time - TimeTicks()).InSecondsF(), | 903 client_->DidFinishLoading((completion_time - TimeTicks()).InSecondsF(), |
| 900 total_transfer_size, encoded_body_size); | 904 total_transfer_size, encoded_body_size, |
| 905 decoded_body_size); |
| 901 } | 906 } |
| 902 } | 907 } |
| 903 } | 908 } |
| 904 | 909 |
| 905 WebURLLoaderImpl::Context::~Context() { | 910 WebURLLoaderImpl::Context::~Context() { |
| 906 // We must be already cancelled at this point. | 911 // We must be already cancelled at this point. |
| 907 DCHECK_LT(request_id_, 0); | 912 DCHECK_LT(request_id_, 0); |
| 908 } | 913 } |
| 909 | 914 |
| 910 void WebURLLoaderImpl::Context::CancelBodyStreaming() { | 915 void WebURLLoaderImpl::Context::CancelBodyStreaming() { |
| 911 scoped_refptr<Context> protect(this); | 916 scoped_refptr<Context> protect(this); |
| 912 | 917 |
| 913 // Notify renderer clients that the request is canceled. | 918 // Notify renderer clients that the request is canceled. |
| 914 if (ftp_listing_delegate_) { | 919 if (ftp_listing_delegate_) { |
| 915 ftp_listing_delegate_->OnCompletedRequest(); | 920 ftp_listing_delegate_->OnCompletedRequest(); |
| 916 ftp_listing_delegate_.reset(NULL); | 921 ftp_listing_delegate_.reset(NULL); |
| 917 } | 922 } |
| 918 | 923 |
| 919 if (body_stream_writer_) { | 924 if (body_stream_writer_) { |
| 920 body_stream_writer_->Fail(); | 925 body_stream_writer_->Fail(); |
| 921 body_stream_writer_.reset(); | 926 body_stream_writer_.reset(); |
| 922 } | 927 } |
| 923 if (client_) { | 928 if (client_) { |
| 924 // TODO(yhirano): Set |stale_copy_in_cache| appropriately if possible. | 929 // TODO(yhirano): Set |stale_copy_in_cache| appropriately if possible. |
| 925 client_->DidFail(CreateWebURLError(request_.Url(), false, net::ERR_ABORTED), | 930 client_->DidFail(CreateWebURLError(request_.Url(), false, net::ERR_ABORTED), |
| 926 WebURLLoaderClient::kUnknownEncodedDataLength, 0); | 931 WebURLLoaderClient::kUnknownEncodedDataLength, 0, 0); |
| 927 } | 932 } |
| 928 | 933 |
| 929 // Notify the browser process that the request is canceled. | 934 // Notify the browser process that the request is canceled. |
| 930 Cancel(); | 935 Cancel(); |
| 931 } | 936 } |
| 932 | 937 |
| 933 bool WebURLLoaderImpl::Context::CanHandleDataURLRequestLocally() const { | 938 bool WebURLLoaderImpl::Context::CanHandleDataURLRequestLocally() const { |
| 934 if (!request_.Url().ProtocolIs(url::kDataScheme)) | 939 if (!request_.Url().ProtocolIs(url::kDataScheme)) |
| 935 return false; | 940 return false; |
| 936 | 941 |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 988 int error_code = GetInfoFromDataURL(request_.Url(), &info, &data); | 993 int error_code = GetInfoFromDataURL(request_.Url(), &info, &data); |
| 989 | 994 |
| 990 if (error_code == net::OK) { | 995 if (error_code == net::OK) { |
| 991 OnReceivedResponse(info); | 996 OnReceivedResponse(info); |
| 992 auto size = data.size(); | 997 auto size = data.size(); |
| 993 if (size != 0) | 998 if (size != 0) |
| 994 OnReceivedData(base::MakeUnique<FixedReceivedData>(data.data(), size)); | 999 OnReceivedData(base::MakeUnique<FixedReceivedData>(data.data(), size)); |
| 995 } | 1000 } |
| 996 | 1001 |
| 997 OnCompletedRequest(error_code, false, false, base::TimeTicks::Now(), 0, | 1002 OnCompletedRequest(error_code, false, false, base::TimeTicks::Now(), 0, |
| 998 data.size()); | 1003 data.size(), data.size()); |
| 999 } | 1004 } |
| 1000 | 1005 |
| 1001 // WebURLLoaderImpl::RequestPeerImpl ------------------------------------------ | 1006 // WebURLLoaderImpl::RequestPeerImpl ------------------------------------------ |
| 1002 | 1007 |
| 1003 WebURLLoaderImpl::RequestPeerImpl::RequestPeerImpl(Context* context) | 1008 WebURLLoaderImpl::RequestPeerImpl::RequestPeerImpl(Context* context) |
| 1004 : context_(context) {} | 1009 : context_(context) {} |
| 1005 | 1010 |
| 1006 void WebURLLoaderImpl::RequestPeerImpl::OnUploadProgress(uint64_t position, | 1011 void WebURLLoaderImpl::RequestPeerImpl::OnUploadProgress(uint64_t position, |
| 1007 uint64_t size) { | 1012 uint64_t size) { |
| 1008 context_->OnUploadProgress(position, size); | 1013 context_->OnUploadProgress(position, size); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1040 int len) { | 1045 int len) { |
| 1041 context_->OnReceivedCachedMetadata(data, len); | 1046 context_->OnReceivedCachedMetadata(data, len); |
| 1042 } | 1047 } |
| 1043 | 1048 |
| 1044 void WebURLLoaderImpl::RequestPeerImpl::OnCompletedRequest( | 1049 void WebURLLoaderImpl::RequestPeerImpl::OnCompletedRequest( |
| 1045 int error_code, | 1050 int error_code, |
| 1046 bool was_ignored_by_handler, | 1051 bool was_ignored_by_handler, |
| 1047 bool stale_copy_in_cache, | 1052 bool stale_copy_in_cache, |
| 1048 const base::TimeTicks& completion_time, | 1053 const base::TimeTicks& completion_time, |
| 1049 int64_t total_transfer_size, | 1054 int64_t total_transfer_size, |
| 1050 int64_t encoded_body_size) { | 1055 int64_t encoded_body_size, |
| 1051 context_->OnCompletedRequest(error_code, was_ignored_by_handler, | 1056 int64_t decoded_body_size) { |
| 1052 stale_copy_in_cache, completion_time, | 1057 context_->OnCompletedRequest( |
| 1053 total_transfer_size, encoded_body_size); | 1058 error_code, was_ignored_by_handler, stale_copy_in_cache, completion_time, |
| 1059 total_transfer_size, encoded_body_size, decoded_body_size); |
| 1054 } | 1060 } |
| 1055 | 1061 |
| 1056 // WebURLLoaderImpl ----------------------------------------------------------- | 1062 // WebURLLoaderImpl ----------------------------------------------------------- |
| 1057 | 1063 |
| 1058 WebURLLoaderImpl::WebURLLoaderImpl(ResourceDispatcher* resource_dispatcher, | 1064 WebURLLoaderImpl::WebURLLoaderImpl(ResourceDispatcher* resource_dispatcher, |
| 1059 mojom::URLLoaderFactory* url_loader_factory) | 1065 mojom::URLLoaderFactory* url_loader_factory) |
| 1060 : context_(new Context(this, resource_dispatcher, url_loader_factory)) {} | 1066 : context_(new Context(this, resource_dispatcher, url_loader_factory)) {} |
| 1061 | 1067 |
| 1062 WebURLLoaderImpl::~WebURLLoaderImpl() { | 1068 WebURLLoaderImpl::~WebURLLoaderImpl() { |
| 1063 Cancel(); | 1069 Cancel(); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 if (error_code != net::OK) { | 1248 if (error_code != net::OK) { |
| 1243 response.SetURL(final_url); | 1249 response.SetURL(final_url); |
| 1244 error.domain = WebString::FromASCII(net::kErrorDomain); | 1250 error.domain = WebString::FromASCII(net::kErrorDomain); |
| 1245 error.reason = error_code; | 1251 error.reason = error_code; |
| 1246 error.unreachable_url = final_url; | 1252 error.unreachable_url = final_url; |
| 1247 return; | 1253 return; |
| 1248 } | 1254 } |
| 1249 | 1255 |
| 1250 PopulateURLResponse(final_url, sync_load_response, &response, | 1256 PopulateURLResponse(final_url, sync_load_response, &response, |
| 1251 request.ReportRawHeaders()); | 1257 request.ReportRawHeaders()); |
| 1252 response.AddToDecodedBodyLength(sync_load_response.data.size()); | |
| 1253 encoded_data_length = sync_load_response.encoded_data_length; | 1258 encoded_data_length = sync_load_response.encoded_data_length; |
| 1254 encoded_body_length = sync_load_response.encoded_body_length; | 1259 encoded_body_length = sync_load_response.encoded_body_length; |
| 1255 | 1260 |
| 1256 data.Assign(sync_load_response.data.data(), sync_load_response.data.size()); | 1261 data.Assign(sync_load_response.data.data(), sync_load_response.data.size()); |
| 1257 } | 1262 } |
| 1258 | 1263 |
| 1259 void WebURLLoaderImpl::LoadAsynchronously(const WebURLRequest& request, | 1264 void WebURLLoaderImpl::LoadAsynchronously(const WebURLRequest& request, |
| 1260 WebURLLoaderClient* client) { | 1265 WebURLLoaderClient* client) { |
| 1261 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::loadAsynchronously", | 1266 TRACE_EVENT_WITH_FLOW0("loading", "WebURLLoaderImpl::loadAsynchronously", |
| 1262 this, TRACE_EVENT_FLAG_FLOW_OUT); | 1267 this, TRACE_EVENT_FLAG_FLOW_OUT); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1278 int intra_priority_value) { | 1283 int intra_priority_value) { |
| 1279 context_->DidChangePriority(new_priority, intra_priority_value); | 1284 context_->DidChangePriority(new_priority, intra_priority_value); |
| 1280 } | 1285 } |
| 1281 | 1286 |
| 1282 void WebURLLoaderImpl::SetLoadingTaskRunner( | 1287 void WebURLLoaderImpl::SetLoadingTaskRunner( |
| 1283 base::SingleThreadTaskRunner* loading_task_runner) { | 1288 base::SingleThreadTaskRunner* loading_task_runner) { |
| 1284 context_->SetTaskRunner(loading_task_runner); | 1289 context_->SetTaskRunner(loading_task_runner); |
| 1285 } | 1290 } |
| 1286 | 1291 |
| 1287 } // namespace content | 1292 } // namespace content |
| OLD | NEW |