| 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 |