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 #include "content/browser/loader/async_resource_handler.h" | 5 #include "content/browser/loader/async_resource_handler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 : net::WrappedIOBuffer(memory), | 71 : net::WrappedIOBuffer(memory), |
72 backing_(backing) { | 72 backing_(backing) { |
73 } | 73 } |
74 private: | 74 private: |
75 virtual ~DependentIOBuffer() {} | 75 virtual ~DependentIOBuffer() {} |
76 scoped_refptr<ResourceBuffer> backing_; | 76 scoped_refptr<ResourceBuffer> backing_; |
77 }; | 77 }; |
78 | 78 |
79 AsyncResourceHandler::AsyncResourceHandler( | 79 AsyncResourceHandler::AsyncResourceHandler( |
80 ResourceMessageFilter* filter, | 80 ResourceMessageFilter* filter, |
81 int routing_id, | |
82 net::URLRequest* request, | 81 net::URLRequest* request, |
83 ResourceDispatcherHostImpl* rdh) | 82 ResourceDispatcherHostImpl* rdh) |
84 : ResourceMessageDelegate(request), | 83 : ResourceMessageDelegate(request), |
85 filter_(filter), | 84 filter_(filter), |
86 routing_id_(routing_id), | |
87 request_(request), | 85 request_(request), |
88 rdh_(rdh), | 86 rdh_(rdh), |
89 pending_data_count_(0), | 87 pending_data_count_(0), |
90 allocation_size_(0), | 88 allocation_size_(0), |
91 did_defer_(false), | 89 did_defer_(false), |
92 has_checked_for_sufficient_resources_(false), | 90 has_checked_for_sufficient_resources_(false), |
93 sent_received_response_msg_(false), | 91 sent_received_response_msg_(false), |
94 sent_first_data_msg_(false) { | 92 sent_first_data_msg_(false) { |
95 InitializeResourceBufferConstants(); | 93 InitializeResourceBufferConstants(); |
96 } | 94 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 | 130 |
133 buffer_->RecycleLeastRecentlyAllocated(); | 131 buffer_->RecycleLeastRecentlyAllocated(); |
134 if (buffer_->CanAllocate()) | 132 if (buffer_->CanAllocate()) |
135 ResumeIfDeferred(); | 133 ResumeIfDeferred(); |
136 } | 134 } |
137 } | 135 } |
138 | 136 |
139 bool AsyncResourceHandler::OnUploadProgress(int request_id, | 137 bool AsyncResourceHandler::OnUploadProgress(int request_id, |
140 uint64 position, | 138 uint64 position, |
141 uint64 size) { | 139 uint64 size) { |
142 return filter_->Send(new ResourceMsg_UploadProgress(routing_id_, request_id, | 140 return filter_->Send(new ResourceMsg_UploadProgress(request_id, position, |
143 position, size)); | 141 size)); |
144 } | 142 } |
145 | 143 |
146 bool AsyncResourceHandler::OnRequestRedirected(int request_id, | 144 bool AsyncResourceHandler::OnRequestRedirected(int request_id, |
147 const GURL& new_url, | 145 const GURL& new_url, |
148 ResourceResponse* response, | 146 ResourceResponse* response, |
149 bool* defer) { | 147 bool* defer) { |
150 *defer = did_defer_ = true; | 148 *defer = did_defer_ = true; |
151 | 149 |
152 if (rdh_->delegate()) { | 150 if (rdh_->delegate()) { |
153 rdh_->delegate()->OnRequestRedirected(new_url, request_, | 151 rdh_->delegate()->OnRequestRedirected(new_url, request_, |
154 filter_->resource_context(), | 152 filter_->resource_context(), |
155 response); | 153 response); |
156 } | 154 } |
157 | 155 |
158 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); | 156 DevToolsNetLogObserver::PopulateResponseInfo(request_, response); |
159 response->head.request_start = request_->creation_time(); | 157 response->head.request_start = request_->creation_time(); |
160 response->head.response_start = TimeTicks::Now(); | 158 response->head.response_start = TimeTicks::Now(); |
161 return filter_->Send(new ResourceMsg_ReceivedRedirect( | 159 return filter_->Send(new ResourceMsg_ReceivedRedirect( |
162 routing_id_, request_id, new_url, response->head)); | 160 request_id, new_url, response->head)); |
163 } | 161 } |
164 | 162 |
165 bool AsyncResourceHandler::OnResponseStarted(int request_id, | 163 bool AsyncResourceHandler::OnResponseStarted(int request_id, |
166 ResourceResponse* response, | 164 ResourceResponse* response, |
167 bool* defer) { | 165 bool* defer) { |
168 // For changes to the main frame, inform the renderer of the new URL's | 166 // For changes to the main frame, inform the renderer of the new URL's |
169 // per-host settings before the request actually commits. This way the | 167 // per-host settings before the request actually commits. This way the |
170 // renderer will be able to set these precisely at the time the | 168 // renderer will be able to set these precisely at the time the |
171 // request commits, avoiding the possibility of e.g. zooming the old content | 169 // request commits, avoiding the possibility of e.g. zooming the old content |
172 // or of having to layout the new content twice. | 170 // or of having to layout the new content twice. |
(...skipping 14 matching lines...) Expand all Loading... |
187 const GURL& request_url = request_->url(); | 185 const GURL& request_url = request_->url(); |
188 filter_->Send(new ViewMsg_SetZoomLevelForLoadingURL( | 186 filter_->Send(new ViewMsg_SetZoomLevelForLoadingURL( |
189 info->GetRouteID(), | 187 info->GetRouteID(), |
190 request_url, host_zoom_map->GetZoomLevelForHostAndScheme( | 188 request_url, host_zoom_map->GetZoomLevelForHostAndScheme( |
191 request_url.scheme(), | 189 request_url.scheme(), |
192 net::GetHostOrSpecFromURL(request_url)))); | 190 net::GetHostOrSpecFromURL(request_url)))); |
193 } | 191 } |
194 | 192 |
195 response->head.request_start = request_->creation_time(); | 193 response->head.request_start = request_->creation_time(); |
196 response->head.response_start = TimeTicks::Now(); | 194 response->head.response_start = TimeTicks::Now(); |
197 filter_->Send(new ResourceMsg_ReceivedResponse( | 195 filter_->Send(new ResourceMsg_ReceivedResponse(request_id, response->head)); |
198 routing_id_, request_id, response->head)); | |
199 sent_received_response_msg_ = true; | 196 sent_received_response_msg_ = true; |
200 | 197 |
201 if (request_->response_info().metadata.get()) { | 198 if (request_->response_info().metadata.get()) { |
202 std::vector<char> copy(request_->response_info().metadata->data(), | 199 std::vector<char> copy(request_->response_info().metadata->data(), |
203 request_->response_info().metadata->data() + | 200 request_->response_info().metadata->data() + |
204 request_->response_info().metadata->size()); | 201 request_->response_info().metadata->size()); |
205 filter_->Send(new ResourceMsg_ReceivedCachedMetadata( | 202 filter_->Send(new ResourceMsg_ReceivedCachedMetadata(request_id, copy)); |
206 routing_id_, request_id, copy)); | |
207 } | 203 } |
208 | 204 |
209 return true; | 205 return true; |
210 } | 206 } |
211 | 207 |
212 bool AsyncResourceHandler::OnWillStart(int request_id, | 208 bool AsyncResourceHandler::OnWillStart(int request_id, |
213 const GURL& url, | 209 const GURL& url, |
214 bool* defer) { | 210 bool* defer) { |
215 return true; | 211 return true; |
216 } | 212 } |
(...skipping 30 matching lines...) Expand all Loading... |
247 bytes_read, 0, kMaxAllocationSize, 100); | 243 bytes_read, 0, kMaxAllocationSize, 100); |
248 UMA_HISTOGRAM_PERCENTAGE( | 244 UMA_HISTOGRAM_PERCENTAGE( |
249 "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", | 245 "Net.AsyncResourceHandler_SharedIOBuffer_UsedPercentage", |
250 CalcUsedPercentage(bytes_read, allocation_size_)); | 246 CalcUsedPercentage(bytes_read, allocation_size_)); |
251 | 247 |
252 if (!sent_first_data_msg_) { | 248 if (!sent_first_data_msg_) { |
253 base::SharedMemoryHandle handle; | 249 base::SharedMemoryHandle handle; |
254 int size; | 250 int size; |
255 if (!buffer_->ShareToProcess(filter_->PeerHandle(), &handle, &size)) | 251 if (!buffer_->ShareToProcess(filter_->PeerHandle(), &handle, &size)) |
256 return false; | 252 return false; |
257 filter_->Send( | 253 filter_->Send(new ResourceMsg_SetDataBuffer( |
258 new ResourceMsg_SetDataBuffer(routing_id_, request_id, handle, size, | 254 request_id, handle, size, filter_->peer_pid())); |
259 filter_->peer_pid())); | |
260 sent_first_data_msg_ = true; | 255 sent_first_data_msg_ = true; |
261 } | 256 } |
262 | 257 |
263 int data_offset = buffer_->GetLastAllocationOffset(); | 258 int data_offset = buffer_->GetLastAllocationOffset(); |
264 int encoded_data_length = | 259 int encoded_data_length = |
265 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); | 260 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); |
266 | 261 |
267 filter_->Send( | 262 filter_->Send(new ResourceMsg_DataReceived( |
268 new ResourceMsg_DataReceived(routing_id_, request_id, data_offset, | 263 request_id, data_offset, bytes_read, encoded_data_length)); |
269 bytes_read, encoded_data_length)); | |
270 ++pending_data_count_; | 264 ++pending_data_count_; |
271 UMA_HISTOGRAM_CUSTOM_COUNTS( | 265 UMA_HISTOGRAM_CUSTOM_COUNTS( |
272 "Net.AsyncResourceHandler_PendingDataCount", | 266 "Net.AsyncResourceHandler_PendingDataCount", |
273 pending_data_count_, 0, 100, 100); | 267 pending_data_count_, 0, 100, 100); |
274 | 268 |
275 if (!buffer_->CanAllocate()) { | 269 if (!buffer_->CanAllocate()) { |
276 UMA_HISTOGRAM_CUSTOM_COUNTS( | 270 UMA_HISTOGRAM_CUSTOM_COUNTS( |
277 "Net.AsyncResourceHandler_PendingDataCount_WhenFull", | 271 "Net.AsyncResourceHandler_PendingDataCount_WhenFull", |
278 pending_data_count_, 0, 100, 100); | 272 pending_data_count_, 0, 100, 100); |
279 *defer = did_defer_ = true; | 273 *defer = did_defer_ = true; |
280 } | 274 } |
281 | 275 |
282 return true; | 276 return true; |
283 } | 277 } |
284 | 278 |
285 void AsyncResourceHandler::OnDataDownloaded( | 279 void AsyncResourceHandler::OnDataDownloaded( |
286 int request_id, int bytes_downloaded) { | 280 int request_id, int bytes_downloaded) { |
287 int encoded_data_length = | 281 int encoded_data_length = |
288 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); | 282 DevToolsNetLogObserver::GetAndResetEncodedDataLength(request_); |
289 | 283 |
290 filter_->Send(new ResourceMsg_DataDownloaded( | 284 filter_->Send(new ResourceMsg_DataDownloaded( |
291 routing_id_, request_id, bytes_downloaded, encoded_data_length)); | 285 request_id, bytes_downloaded, encoded_data_length)); |
292 } | 286 } |
293 | 287 |
294 bool AsyncResourceHandler::OnResponseCompleted( | 288 bool AsyncResourceHandler::OnResponseCompleted( |
295 int request_id, | 289 int request_id, |
296 const net::URLRequestStatus& status, | 290 const net::URLRequestStatus& status, |
297 const std::string& security_info) { | 291 const std::string& security_info) { |
298 // If we crash here, figure out what URL the renderer was requesting. | 292 // If we crash here, figure out what URL the renderer was requesting. |
299 // http://crbug.com/107692 | 293 // http://crbug.com/107692 |
300 char url_buf[128]; | 294 char url_buf[128]; |
301 base::strlcpy(url_buf, request_->url().spec().c_str(), arraysize(url_buf)); | 295 base::strlcpy(url_buf, request_->url().spec().c_str(), arraysize(url_buf)); |
(...skipping 22 matching lines...) Expand all Loading... |
324 // TODO(mkosiba): Fix up cases where we create a URLRequestStatus | 318 // TODO(mkosiba): Fix up cases where we create a URLRequestStatus |
325 // with a status() != SUCCESS and an error_code() == net::OK. | 319 // with a status() != SUCCESS and an error_code() == net::OK. |
326 if (status.status() == net::URLRequestStatus::CANCELED && | 320 if (status.status() == net::URLRequestStatus::CANCELED && |
327 error_code == net::OK) { | 321 error_code == net::OK) { |
328 error_code = net::ERR_ABORTED; | 322 error_code = net::ERR_ABORTED; |
329 } else if (status.status() == net::URLRequestStatus::FAILED && | 323 } else if (status.status() == net::URLRequestStatus::FAILED && |
330 error_code == net::OK) { | 324 error_code == net::OK) { |
331 error_code = net::ERR_FAILED; | 325 error_code = net::ERR_FAILED; |
332 } | 326 } |
333 | 327 |
334 filter_->Send(new ResourceMsg_RequestComplete(routing_id_, | 328 filter_->Send(new ResourceMsg_RequestComplete(request_id, |
335 request_id, | |
336 error_code, | 329 error_code, |
337 was_ignored_by_handler, | 330 was_ignored_by_handler, |
338 security_info, | 331 security_info, |
339 completion_time)); | 332 completion_time)); |
340 return true; | 333 return true; |
341 } | 334 } |
342 | 335 |
343 bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { | 336 bool AsyncResourceHandler::EnsureResourceBufferIsInitialized() { |
344 if (buffer_.get() && buffer_->IsInitialized()) | 337 if (buffer_.get() && buffer_->IsInitialized()) |
345 return true; | 338 return true; |
(...skipping 13 matching lines...) Expand all Loading... |
359 } | 352 } |
360 | 353 |
361 void AsyncResourceHandler::ResumeIfDeferred() { | 354 void AsyncResourceHandler::ResumeIfDeferred() { |
362 if (did_defer_) { | 355 if (did_defer_) { |
363 did_defer_ = false; | 356 did_defer_ = false; |
364 controller()->Resume(); | 357 controller()->Resume(); |
365 } | 358 } |
366 } | 359 } |
367 | 360 |
368 } // namespace content | 361 } // namespace content |
OLD | NEW |