| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/mojo_async_resource_handler.h" | 5 #include "content/browser/loader/mojo_async_resource_handler.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, | 157 bool MojoAsyncResourceHandler::OnResponseStarted(ResourceResponse* response, |
| 158 bool* defer) { | 158 bool* defer) { |
| 159 const ResourceRequestInfoImpl* info = GetRequestInfo(); | 159 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 160 | 160 |
| 161 if (rdh_->delegate()) { | 161 if (rdh_->delegate()) { |
| 162 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), | 162 rdh_->delegate()->OnResponseStarted(request(), info->GetContext(), |
| 163 response); | 163 response); |
| 164 } | 164 } |
| 165 | 165 |
| 166 NetLogObserver::PopulateResponseInfo(request(), response); | 166 NetLogObserver::PopulateResponseInfo(request(), response); |
| 167 response->head.encoded_data_length = request()->raw_header_size(); |
| 168 reported_total_received_bytes_ = response->head.encoded_data_length; |
| 167 | 169 |
| 168 response->head.request_start = request()->creation_time(); | 170 response->head.request_start = request()->creation_time(); |
| 169 response->head.response_start = base::TimeTicks::Now(); | 171 response->head.response_start = base::TimeTicks::Now(); |
| 170 sent_received_response_message_ = true; | 172 sent_received_response_message_ = true; |
| 171 | 173 |
| 172 mojom::DownloadedTempFilePtr downloaded_file_ptr; | 174 mojom::DownloadedTempFilePtr downloaded_file_ptr; |
| 173 if (!response->head.download_file_path.empty()) { | 175 if (!response->head.download_file_path.empty()) { |
| 174 downloaded_file_ptr = DownloadedTempFileImpl::Create(info->GetChildID(), | 176 downloaded_file_ptr = DownloadedTempFileImpl::Create(info->GetChildID(), |
| 175 info->GetRequestID()); | 177 info->GetRequestID()); |
| 176 rdh_->RegisterDownloadedTempFile(info->GetChildID(), info->GetRequestID(), | 178 rdh_->RegisterDownloadedTempFile(info->GetChildID(), info->GetRequestID(), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 return true; | 240 return true; |
| 239 } | 241 } |
| 240 | 242 |
| 241 bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { | 243 bool MojoAsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
| 242 DCHECK_GE(bytes_read, 0); | 244 DCHECK_GE(bytes_read, 0); |
| 243 DCHECK(buffer_); | 245 DCHECK(buffer_); |
| 244 | 246 |
| 245 if (!bytes_read) | 247 if (!bytes_read) |
| 246 return true; | 248 return true; |
| 247 | 249 |
| 250 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 251 if (info->ShouldReportRawHeaders()) { |
| 252 auto transfer_size_diff = CalculateRecentlyReceivedBytes(); |
| 253 if (transfer_size_diff > 0) |
| 254 url_loader_client_->OnTransferSizeUpdated(transfer_size_diff); |
| 255 } |
| 256 |
| 248 if (is_using_io_buffer_not_from_writer_) { | 257 if (is_using_io_buffer_not_from_writer_) { |
| 249 // Couldn't allocate a buffer on the data pipe in OnWillRead. | 258 // Couldn't allocate a buffer on the data pipe in OnWillRead. |
| 250 DCHECK_EQ(0u, buffer_bytes_read_); | 259 DCHECK_EQ(0u, buffer_bytes_read_); |
| 251 buffer_bytes_read_ = bytes_read; | 260 buffer_bytes_read_ = bytes_read; |
| 252 if (!CopyReadDataToDataPipe(defer)) | 261 if (!CopyReadDataToDataPipe(defer)) |
| 253 return false; | 262 return false; |
| 254 if (*defer) { | 263 if (*defer) { |
| 255 request()->LogBlockedBy("MojoAsyncResourceHandler"); | 264 request()->LogBlockedBy("MojoAsyncResourceHandler"); |
| 256 did_defer_on_writing_ = true; | 265 did_defer_on_writing_ = true; |
| 257 } | 266 } |
| 258 return true; | 267 return true; |
| 259 } | 268 } |
| 260 | 269 |
| 261 if (EndWrite(bytes_read) != MOJO_RESULT_OK) | 270 if (EndWrite(bytes_read) != MOJO_RESULT_OK) |
| 262 return false; | 271 return false; |
| 263 // Allocate a buffer for the next OnWillRead call here, because OnWillRead | 272 // Allocate a buffer for the next OnWillRead call here, because OnWillRead |
| 264 // doesn't have |defer| parameter. | 273 // doesn't have |defer| parameter. |
| 265 if (!AllocateWriterIOBuffer(&buffer_, defer)) | 274 if (!AllocateWriterIOBuffer(&buffer_, defer)) |
| 266 return false; | 275 return false; |
| 267 if (*defer) { | 276 if (*defer) { |
| 268 request()->LogBlockedBy("MojoAsyncResourceHandler"); | 277 request()->LogBlockedBy("MojoAsyncResourceHandler"); |
| 269 did_defer_on_writing_ = true; | 278 did_defer_on_writing_ = true; |
| 270 } | 279 } |
| 271 return true; | 280 return true; |
| 272 } | 281 } |
| 273 | 282 |
| 274 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { | 283 void MojoAsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
| 275 int64_t total_received_bytes = request()->GetTotalReceivedBytes(); | 284 url_loader_client_->OnDataDownloaded(bytes_downloaded, |
| 276 int64_t bytes_to_report = | 285 CalculateRecentlyReceivedBytes()); |
| 277 total_received_bytes - reported_total_received_bytes_; | |
| 278 reported_total_received_bytes_ = total_received_bytes; | |
| 279 DCHECK_LE(0, bytes_to_report); | |
| 280 | |
| 281 url_loader_client_->OnDataDownloaded(bytes_downloaded, bytes_to_report); | |
| 282 } | 286 } |
| 283 | 287 |
| 284 void MojoAsyncResourceHandler::FollowRedirect() { | 288 void MojoAsyncResourceHandler::FollowRedirect() { |
| 285 if (!request()->status().is_success()) { | 289 if (!request()->status().is_success()) { |
| 286 DVLOG(1) << "FollowRedirect for invalid request"; | 290 DVLOG(1) << "FollowRedirect for invalid request"; |
| 287 return; | 291 return; |
| 288 } | 292 } |
| 289 if (!did_defer_on_redirect_) { | 293 if (!did_defer_on_redirect_) { |
| 290 DVLOG(1) << "Malformed FollowRedirect request"; | 294 DVLOG(1) << "Malformed FollowRedirect request"; |
| 291 ReportBadMessage("Malformed FollowRedirect request"); | 295 ReportBadMessage("Malformed FollowRedirect request"); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 request()->LogUnblocked(); | 447 request()->LogUnblocked(); |
| 444 controller()->Resume(); | 448 controller()->Resume(); |
| 445 } | 449 } |
| 446 | 450 |
| 447 void MojoAsyncResourceHandler::Cancel() { | 451 void MojoAsyncResourceHandler::Cancel() { |
| 448 const ResourceRequestInfoImpl* info = GetRequestInfo(); | 452 const ResourceRequestInfoImpl* info = GetRequestInfo(); |
| 449 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer( | 453 ResourceDispatcherHostImpl::Get()->CancelRequestFromRenderer( |
| 450 GlobalRequestID(info->GetChildID(), info->GetRequestID())); | 454 GlobalRequestID(info->GetChildID(), info->GetRequestID())); |
| 451 } | 455 } |
| 452 | 456 |
| 457 int64_t MojoAsyncResourceHandler::CalculateRecentlyReceivedBytes() { |
| 458 int64_t total_received_bytes = request()->GetTotalReceivedBytes(); |
| 459 int64_t bytes_to_report = |
| 460 total_received_bytes - reported_total_received_bytes_; |
| 461 reported_total_received_bytes_ = total_received_bytes; |
| 462 DCHECK_LE(0, bytes_to_report); |
| 463 return bytes_to_report; |
| 464 } |
| 465 |
| 453 void MojoAsyncResourceHandler::ReportBadMessage(const std::string& error) { | 466 void MojoAsyncResourceHandler::ReportBadMessage(const std::string& error) { |
| 454 mojo::ReportBadMessage(error); | 467 mojo::ReportBadMessage(error); |
| 455 } | 468 } |
| 456 | 469 |
| 457 void MojoAsyncResourceHandler::OnTransfer( | 470 void MojoAsyncResourceHandler::OnTransfer( |
| 458 mojom::URLLoaderAssociatedRequest mojo_request, | 471 mojom::URLLoaderAssociatedRequest mojo_request, |
| 459 mojom::URLLoaderClientAssociatedPtr url_loader_client) { | 472 mojom::URLLoaderClientAssociatedPtr url_loader_client) { |
| 460 binding_.Unbind(); | 473 binding_.Unbind(); |
| 461 binding_.Bind(std::move(mojo_request)); | 474 binding_.Bind(std::move(mojo_request)); |
| 462 binding_.set_connection_error_handler( | 475 binding_.set_connection_error_handler( |
| 463 base::Bind(&MojoAsyncResourceHandler::Cancel, base::Unretained(this))); | 476 base::Bind(&MojoAsyncResourceHandler::Cancel, base::Unretained(this))); |
| 464 url_loader_client_ = std::move(url_loader_client); | 477 url_loader_client_ = std::move(url_loader_client); |
| 465 } | 478 } |
| 466 | 479 |
| 467 } // namespace content | 480 } // namespace content |
| OLD | NEW |