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 <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 using blink::WebURLLoaderClient; | 64 using blink::WebURLLoaderClient; |
65 using blink::WebURLRequest; | 65 using blink::WebURLRequest; |
66 using blink::WebURLResponse; | 66 using blink::WebURLResponse; |
67 | 67 |
68 namespace content { | 68 namespace content { |
69 | 69 |
70 // Utilities ------------------------------------------------------------------ | 70 // Utilities ------------------------------------------------------------------ |
71 | 71 |
72 namespace { | 72 namespace { |
73 | 73 |
74 const char kThrottledErrorDescription[] = | |
75 "Request throttled. Visit http://dev.chromium.org/throttling for more " | |
76 "information."; | |
77 const size_t kBodyStreamPipeCapacity = 4 * 1024; | 74 const size_t kBodyStreamPipeCapacity = 4 * 1024; |
78 | 75 |
79 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; | 76 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; |
80 | 77 |
81 // Converts timing data from |load_timing| to the format used by WebKit. | 78 // Converts timing data from |load_timing| to the format used by WebKit. |
82 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, | 79 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, |
83 WebURLLoadTiming* url_timing) { | 80 WebURLLoadTiming* url_timing) { |
84 DCHECK(!load_timing.request_start.is_null()); | 81 DCHECK(!load_timing.request_start.is_null()); |
85 | 82 |
86 const TimeTicks kNullTicks; | 83 const TimeTicks kNullTicks; |
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
685 int data_length, | 682 int data_length, |
686 int encoded_data_length) { | 683 int encoded_data_length) { |
687 if (!client_) | 684 if (!client_) |
688 return; | 685 return; |
689 | 686 |
690 if (request_.useStreamOnResponse()) { | 687 if (request_.useStreamOnResponse()) { |
691 // We don't support ftp_listening_delegate_ and multipart_delegate_ for now. | 688 // We don't support ftp_listening_delegate_ and multipart_delegate_ for now. |
692 // TODO(yhirano): Support ftp listening and multipart. | 689 // TODO(yhirano): Support ftp listening and multipart. |
693 MojoResult rv = WriteDataOnBodyStream(data, data_length); | 690 MojoResult rv = WriteDataOnBodyStream(data, data_length); |
694 if (rv != MOJO_RESULT_OK && client_) { | 691 if (rv != MOJO_RESULT_OK && client_) { |
695 client_->didFail(loader_, | 692 client_->didFail( |
696 loader_->CreateError(request_.url(), | 693 loader_, CreateWebURLError(request_.url(), false, net::ERR_FAILED)); |
697 false, | |
698 net::ERR_FAILED)); | |
699 } | 694 } |
700 } else if (ftp_listing_delegate_) { | 695 } else if (ftp_listing_delegate_) { |
701 // The FTP listing delegate will make the appropriate calls to | 696 // The FTP listing delegate will make the appropriate calls to |
702 // client_->didReceiveData and client_->didReceiveResponse. Since the | 697 // client_->didReceiveData and client_->didReceiveResponse. Since the |
703 // delegate may want to do work after sending data to the delegate, keep | 698 // delegate may want to do work after sending data to the delegate, keep |
704 // |this| and the delegate alive until it's finished handling the data. | 699 // |this| and the delegate alive until it's finished handling the data. |
705 scoped_refptr<Context> protect(this); | 700 scoped_refptr<Context> protect(this); |
706 ftp_listing_delegate_->OnReceivedData(data, data_length); | 701 ftp_listing_delegate_->OnReceivedData(data, data_length); |
707 } else if (multipart_delegate_) { | 702 } else if (multipart_delegate_) { |
708 // The multipart delegate will make the appropriate calls to | 703 // The multipart delegate will make the appropriate calls to |
(...skipping 29 matching lines...) Expand all Loading... |
738 if (ftp_listing_delegate_) { | 733 if (ftp_listing_delegate_) { |
739 ftp_listing_delegate_->OnCompletedRequest(); | 734 ftp_listing_delegate_->OnCompletedRequest(); |
740 ftp_listing_delegate_.reset(NULL); | 735 ftp_listing_delegate_.reset(NULL); |
741 } else if (multipart_delegate_) { | 736 } else if (multipart_delegate_) { |
742 multipart_delegate_->OnCompletedRequest(); | 737 multipart_delegate_->OnCompletedRequest(); |
743 multipart_delegate_.reset(NULL); | 738 multipart_delegate_.reset(NULL); |
744 } | 739 } |
745 | 740 |
746 if (client_) { | 741 if (client_) { |
747 if (error_code != net::OK) { | 742 if (error_code != net::OK) { |
748 client_->didFail(loader_, CreateError(request_.url(), | 743 client_->didFail( |
749 stale_copy_in_cache, | 744 loader_, |
750 error_code)); | 745 CreateWebURLError(request_.url(), stale_copy_in_cache, error_code)); |
751 } else { | 746 } else { |
752 if (request_.useStreamOnResponse()) { | 747 if (request_.useStreamOnResponse()) { |
753 got_all_stream_body_data_ = true; | 748 got_all_stream_body_data_ = true; |
754 if (body_stream_buffer_.empty()) { | 749 if (body_stream_buffer_.empty()) { |
755 // Close the handle to notify the end of data. | 750 // Close the handle to notify the end of data. |
756 body_stream_writer_.reset(); | 751 body_stream_writer_.reset(); |
757 client_->didFinishLoading( | 752 client_->didFinishLoading( |
758 loader_, (completion_time - TimeTicks()).InSecondsF(), | 753 loader_, (completion_time - TimeTicks()).InSecondsF(), |
759 total_transfer_size); | 754 total_transfer_size); |
760 } | 755 } |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
896 MOJO_DEADLINE_INDEFINITE, | 891 MOJO_DEADLINE_INDEFINITE, |
897 base::Bind(&WebURLLoaderImpl::Context::OnHandleGotWritable, | 892 base::Bind(&WebURLLoaderImpl::Context::OnHandleGotWritable, |
898 base::Unretained(this))); | 893 base::Unretained(this))); |
899 } | 894 } |
900 return rv; | 895 return rv; |
901 } | 896 } |
902 | 897 |
903 void WebURLLoaderImpl::Context::OnHandleGotWritable(MojoResult result) { | 898 void WebURLLoaderImpl::Context::OnHandleGotWritable(MojoResult result) { |
904 if (result != MOJO_RESULT_OK) { | 899 if (result != MOJO_RESULT_OK) { |
905 if (client_) { | 900 if (client_) { |
906 client_->didFail(loader_, | 901 client_->didFail( |
907 loader_->CreateError(request_.url(), | 902 loader_, CreateWebURLError(request_.url(), false, net::ERR_FAILED)); |
908 false, | |
909 net::ERR_FAILED)); | |
910 // |this| can be deleted here. | 903 // |this| can be deleted here. |
911 } | 904 } |
912 return; | 905 return; |
913 } | 906 } |
914 | 907 |
915 if (body_stream_buffer_.empty()) | 908 if (body_stream_buffer_.empty()) |
916 return; | 909 return; |
917 | 910 |
918 MojoResult rv = WriteDataOnBodyStream(nullptr, 0); | 911 MojoResult rv = WriteDataOnBodyStream(nullptr, 0); |
919 if (rv == MOJO_RESULT_OK) { | 912 if (rv == MOJO_RESULT_OK) { |
920 if (got_all_stream_body_data_ && body_stream_buffer_.empty()) { | 913 if (got_all_stream_body_data_ && body_stream_buffer_.empty()) { |
921 // Close the handle to notify the end of data. | 914 // Close the handle to notify the end of data. |
922 body_stream_writer_.reset(); | 915 body_stream_writer_.reset(); |
923 if (client_) { | 916 if (client_) { |
924 // TODO(yhirano): Pass appropriate arguments. | 917 // TODO(yhirano): Pass appropriate arguments. |
925 client_->didFinishLoading(loader_, 0, 0); | 918 client_->didFinishLoading(loader_, 0, 0); |
926 // |this| can be deleted here. | 919 // |this| can be deleted here. |
927 } | 920 } |
928 } | 921 } |
929 } else { | 922 } else { |
930 if (client_) { | 923 if (client_) { |
931 client_->didFail(loader_, loader_->CreateError(request_.url(), | 924 client_->didFail( |
932 false, | 925 loader_, CreateWebURLError(request_.url(), false, net::ERR_FAILED)); |
933 net::ERR_FAILED)); | |
934 // |this| can be deleted here. | 926 // |this| can be deleted here. |
935 } | 927 } |
936 } | 928 } |
937 } | 929 } |
938 | 930 |
939 // WebURLLoaderImpl ----------------------------------------------------------- | 931 // WebURLLoaderImpl ----------------------------------------------------------- |
940 | 932 |
941 WebURLLoaderImpl::WebURLLoaderImpl( | 933 WebURLLoaderImpl::WebURLLoaderImpl( |
942 ResourceDispatcher* resource_dispatcher, | 934 ResourceDispatcher* resource_dispatcher, |
943 scoped_refptr<base::SingleThreadTaskRunner> task_runner) | 935 scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
944 : context_(new Context(this, resource_dispatcher, task_runner)) { | 936 : context_(new Context(this, resource_dispatcher, task_runner)) { |
945 } | 937 } |
946 | 938 |
947 WebURLLoaderImpl::~WebURLLoaderImpl() { | 939 WebURLLoaderImpl::~WebURLLoaderImpl() { |
948 cancel(); | 940 cancel(); |
949 } | 941 } |
950 | 942 |
951 WebURLError WebURLLoaderImpl::CreateError(const WebURL& unreachable_url, | |
952 bool stale_copy_in_cache, | |
953 int reason) { | |
954 WebURLError error; | |
955 error.domain = WebString::fromUTF8(net::kErrorDomain); | |
956 error.reason = reason; | |
957 error.unreachableURL = unreachable_url; | |
958 error.staleCopyInCache = stale_copy_in_cache; | |
959 if (reason == net::ERR_ABORTED) { | |
960 error.isCancellation = true; | |
961 } else if (reason == net::ERR_TEMPORARILY_THROTTLED) { | |
962 error.localizedDescription = WebString::fromUTF8( | |
963 kThrottledErrorDescription); | |
964 } else { | |
965 error.localizedDescription = WebString::fromUTF8( | |
966 net::ErrorToString(reason)); | |
967 } | |
968 return error; | |
969 } | |
970 | |
971 void WebURLLoaderImpl::PopulateURLResponse(const GURL& url, | 943 void WebURLLoaderImpl::PopulateURLResponse(const GURL& url, |
972 const ResourceResponseInfo& info, | 944 const ResourceResponseInfo& info, |
973 WebURLResponse* response) { | 945 WebURLResponse* response) { |
974 response->setURL(url); | 946 response->setURL(url); |
975 response->setResponseTime(info.response_time.ToInternalValue()); | 947 response->setResponseTime(info.response_time.ToInternalValue()); |
976 response->setMIMEType(WebString::fromUTF8(info.mime_type)); | 948 response->setMIMEType(WebString::fromUTF8(info.mime_type)); |
977 response->setTextEncodingName(WebString::fromUTF8(info.charset)); | 949 response->setTextEncodingName(WebString::fromUTF8(info.charset)); |
978 response->setExpectedContentLength(info.content_length); | 950 response->setExpectedContentLength(info.content_length); |
979 response->setSecurityInfo(info.security_info); | 951 response->setSecurityInfo(info.security_info); |
980 response->setAppCacheID(info.appcache_id); | 952 response->setAppCacheID(info.appcache_id); |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 int intra_priority_value) { | 1112 int intra_priority_value) { |
1141 context_->DidChangePriority(new_priority, intra_priority_value); | 1113 context_->DidChangePriority(new_priority, intra_priority_value); |
1142 } | 1114 } |
1143 | 1115 |
1144 bool WebURLLoaderImpl::attachThreadedDataReceiver( | 1116 bool WebURLLoaderImpl::attachThreadedDataReceiver( |
1145 blink::WebThreadedDataReceiver* threaded_data_receiver) { | 1117 blink::WebThreadedDataReceiver* threaded_data_receiver) { |
1146 return context_->AttachThreadedDataReceiver(threaded_data_receiver); | 1118 return context_->AttachThreadedDataReceiver(threaded_data_receiver); |
1147 } | 1119 } |
1148 | 1120 |
1149 } // namespace content | 1121 } // namespace content |
OLD | NEW |