OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/glue/weburlloader_impl.h" | 7 #include "webkit/glue/weburlloader_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 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 bool GetInfoFromDataURL(const GURL& url, | 123 bool GetInfoFromDataURL(const GURL& url, |
124 ResourceResponseInfo* info, | 124 ResourceResponseInfo* info, |
125 std::string* data, | 125 std::string* data, |
126 int* error_code) { | 126 int* error_code) { |
127 std::string mime_type; | 127 std::string mime_type; |
128 std::string charset; | 128 std::string charset; |
129 if (net::DataURL::Parse(url, &mime_type, &charset, data)) { | 129 if (net::DataURL::Parse(url, &mime_type, &charset, data)) { |
130 *error_code = net::OK; | 130 *error_code = net::OK; |
131 // Assure same time for all time fields of data: URLs. | 131 // Assure same time for all time fields of data: URLs. |
132 Time now = Time::Now(); | 132 Time now = Time::Now(); |
133 info->load_timing.base_time = now; | 133 info->load_timing.request_start = TimeTicks::Now(); |
134 info->load_timing.base_ticks = TimeTicks::Now(); | 134 info->load_timing.request_start_time = now; |
135 info->request_time = now; | 135 info->request_time = now; |
136 info->response_time = now; | 136 info->response_time = now; |
137 info->headers = NULL; | 137 info->headers = NULL; |
138 info->mime_type.swap(mime_type); | 138 info->mime_type.swap(mime_type); |
139 info->charset.swap(charset); | 139 info->charset.swap(charset); |
140 info->security_info.clear(); | 140 info->security_info.clear(); |
141 info->content_length = data->length(); | 141 info->content_length = data->length(); |
142 info->encoded_data_length = 0; | 142 info->encoded_data_length = 0; |
143 | 143 |
144 return true; | 144 return true; |
145 } | 145 } |
146 | 146 |
147 *error_code = net::ERR_INVALID_URL; | 147 *error_code = net::ERR_INVALID_URL; |
148 return false; | 148 return false; |
149 } | 149 } |
150 | 150 |
151 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; | 151 typedef ResourceDevToolsInfo::HeadersVector HeadersVector; |
152 | 152 |
| 153 // Given a base time and a second time, returns the time from the base time to |
| 154 // the second time, in milliseconds. If the second time is null, returns -1. |
| 155 // The base time must not be null. |
| 156 int TimeTicksToOffset(base::TimeTicks base_time, base::TimeTicks time) { |
| 157 if (time.is_null()) |
| 158 return -1; |
| 159 DCHECK(!base_time.is_null()); |
| 160 return static_cast<int>((time - base_time).InMillisecondsRoundedUp()); |
| 161 } |
| 162 |
| 163 // Converts timing data from |load_timing| to the format used by WebKit. |
| 164 void PopulateURLLoadTiming(const net::LoadTimingInfo& load_timing, |
| 165 WebURLLoadTiming* url_timing) { |
| 166 DCHECK(!load_timing.request_start.is_null()); |
| 167 |
| 168 url_timing->initialize(); |
| 169 url_timing->setRequestTime( |
| 170 (load_timing.request_start - TimeTicks()).InSecondsF()); |
| 171 url_timing->setProxyStart(TimeTicksToOffset(load_timing.request_start, |
| 172 load_timing.proxy_resolve_start)); |
| 173 url_timing->setProxyEnd(TimeTicksToOffset(load_timing.request_start, |
| 174 load_timing.proxy_resolve_end)); |
| 175 url_timing->setDNSStart(TimeTicksToOffset( |
| 176 load_timing.request_start, |
| 177 load_timing.connect_timing.dns_start)); |
| 178 url_timing->setDNSEnd(TimeTicksToOffset(load_timing.request_start, |
| 179 load_timing.connect_timing.dns_end)); |
| 180 url_timing->setConnectStart( |
| 181 TimeTicksToOffset(load_timing.request_start, |
| 182 load_timing.connect_timing.connect_start)); |
| 183 url_timing->setConnectEnd( |
| 184 TimeTicksToOffset(load_timing.request_start, |
| 185 load_timing.connect_timing.connect_end)); |
| 186 url_timing->setSSLStart( |
| 187 TimeTicksToOffset(load_timing.request_start, |
| 188 load_timing.connect_timing.ssl_start)); |
| 189 url_timing->setSSLEnd(TimeTicksToOffset(load_timing.request_start, |
| 190 load_timing.connect_timing.ssl_end)); |
| 191 url_timing->setSendStart(TimeTicksToOffset(load_timing.request_start, |
| 192 load_timing.send_start)); |
| 193 url_timing->setSendEnd(TimeTicksToOffset(load_timing.request_start, |
| 194 load_timing.send_end)); |
| 195 url_timing->setReceiveHeadersEnd( |
| 196 TimeTicksToOffset(load_timing.request_start, |
| 197 load_timing.receive_headers_end)); |
| 198 } |
| 199 |
153 void PopulateURLResponse( | 200 void PopulateURLResponse( |
154 const GURL& url, | 201 const GURL& url, |
155 const ResourceResponseInfo& info, | 202 const ResourceResponseInfo& info, |
156 WebURLResponse* response) { | 203 WebURLResponse* response) { |
157 response->setURL(url); | 204 response->setURL(url); |
158 response->setResponseTime(info.response_time.ToDoubleT()); | 205 response->setResponseTime(info.response_time.ToDoubleT()); |
159 response->setMIMEType(WebString::fromUTF8(info.mime_type)); | 206 response->setMIMEType(WebString::fromUTF8(info.mime_type)); |
160 response->setTextEncodingName(WebString::fromUTF8(info.charset)); | 207 response->setTextEncodingName(WebString::fromUTF8(info.charset)); |
161 response->setExpectedContentLength(info.content_length); | 208 response->setExpectedContentLength(info.content_length); |
162 response->setSecurityInfo(info.security_info); | 209 response->setSecurityInfo(info.security_info); |
163 response->setAppCacheID(info.appcache_id); | 210 response->setAppCacheID(info.appcache_id); |
164 response->setAppCacheManifestURL(info.appcache_manifest_url); | 211 response->setAppCacheManifestURL(info.appcache_manifest_url); |
165 response->setWasCached(!info.load_timing.base_time.is_null() && | 212 response->setWasCached(!info.load_timing.request_start_time.is_null() && |
166 info.response_time < info.load_timing.base_time); | 213 info.response_time < info.load_timing.request_start_time); |
167 response->setRemoteIPAddress( | 214 response->setRemoteIPAddress( |
168 WebString::fromUTF8(info.socket_address.host())); | 215 WebString::fromUTF8(info.socket_address.host())); |
169 response->setRemotePort(info.socket_address.port()); | 216 response->setRemotePort(info.socket_address.port()); |
170 response->setConnectionID(info.connection_id); | 217 response->setConnectionID(info.load_timing.socket_log_id); |
171 response->setConnectionReused(info.connection_reused); | 218 response->setConnectionReused(info.load_timing.socket_reused); |
172 response->setDownloadFilePath( | 219 response->setDownloadFilePath( |
173 webkit_base::FilePathToWebString(info.download_file_path)); | 220 webkit_base::FilePathToWebString(info.download_file_path)); |
174 WebURLResponseExtraDataImpl* extra_data = | 221 WebURLResponseExtraDataImpl* extra_data = |
175 new WebURLResponseExtraDataImpl(info.npn_negotiated_protocol); | 222 new WebURLResponseExtraDataImpl(info.npn_negotiated_protocol); |
176 response->setExtraData(extra_data); | 223 response->setExtraData(extra_data); |
177 extra_data->set_was_fetched_via_spdy(info.was_fetched_via_spdy); | 224 extra_data->set_was_fetched_via_spdy(info.was_fetched_via_spdy); |
178 extra_data->set_was_npn_negotiated(info.was_npn_negotiated); | 225 extra_data->set_was_npn_negotiated(info.was_npn_negotiated); |
179 extra_data->set_was_alternate_protocol_available( | 226 extra_data->set_was_alternate_protocol_available( |
180 info.was_alternate_protocol_available); | 227 info.was_alternate_protocol_available); |
181 extra_data->set_was_fetched_via_proxy(info.was_fetched_via_proxy); | 228 extra_data->set_was_fetched_via_proxy(info.was_fetched_via_proxy); |
182 | 229 |
183 const ResourceLoadTimingInfo& timing_info = info.load_timing; | 230 // If there's no received headers end time, don't set load timing. This is |
184 if (!timing_info.base_time.is_null()) { | 231 // the case for non-HTTP requests, requests that don't go over the wire, and |
| 232 // certain error cases. |
| 233 if (!info.load_timing.receive_headers_end.is_null()) { |
185 WebURLLoadTiming timing; | 234 WebURLLoadTiming timing; |
186 timing.initialize(); | 235 PopulateURLLoadTiming(info.load_timing, &timing); |
187 timing.setRequestTime((timing_info.base_ticks - TimeTicks()).InSecondsF()); | |
188 timing.setProxyStart(timing_info.proxy_start); | |
189 timing.setProxyEnd(timing_info.proxy_end); | |
190 timing.setDNSStart(timing_info.dns_start); | |
191 timing.setDNSEnd(timing_info.dns_end); | |
192 timing.setConnectStart(timing_info.connect_start); | |
193 timing.setConnectEnd(timing_info.connect_end); | |
194 timing.setSSLStart(timing_info.ssl_start); | |
195 timing.setSSLEnd(timing_info.ssl_end); | |
196 timing.setSendStart(timing_info.send_start); | |
197 timing.setSendEnd(timing_info.send_end); | |
198 timing.setReceiveHeadersEnd(timing_info.receive_headers_end); | |
199 response->setLoadTiming(timing); | 236 response->setLoadTiming(timing); |
200 } | 237 } |
201 | 238 |
202 if (info.devtools_info.get()) { | 239 if (info.devtools_info.get()) { |
203 WebHTTPLoadInfo load_info; | 240 WebHTTPLoadInfo load_info; |
204 | 241 |
205 load_info.setHTTPStatusCode(info.devtools_info->http_status_code); | 242 load_info.setHTTPStatusCode(info.devtools_info->http_status_code); |
206 load_info.setHTTPStatusText(WebString::fromUTF8( | 243 load_info.setHTTPStatusText(WebString::fromUTF8( |
207 info.devtools_info->http_status_text)); | 244 info.devtools_info->http_status_text)); |
208 load_info.setEncodedDataLength(info.encoded_data_length); | 245 load_info.setEncodedDataLength(info.encoded_data_length); |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
817 | 854 |
818 void WebURLLoaderImpl::setDefersLoading(bool value) { | 855 void WebURLLoaderImpl::setDefersLoading(bool value) { |
819 context_->SetDefersLoading(value); | 856 context_->SetDefersLoading(value); |
820 } | 857 } |
821 | 858 |
822 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority) { | 859 void WebURLLoaderImpl::didChangePriority(WebURLRequest::Priority new_priority) { |
823 context_->DidChangePriority(new_priority); | 860 context_->DidChangePriority(new_priority); |
824 } | 861 } |
825 | 862 |
826 } // namespace webkit_glue | 863 } // namespace webkit_glue |
OLD | NEW |