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 11 matching lines...) Expand all Loading... |
22 #include "content/browser/loader/resource_buffer.h" | 22 #include "content/browser/loader/resource_buffer.h" |
23 #include "content/browser/loader/resource_dispatcher_host_impl.h" | 23 #include "content/browser/loader/resource_dispatcher_host_impl.h" |
24 #include "content/browser/loader/resource_message_filter.h" | 24 #include "content/browser/loader/resource_message_filter.h" |
25 #include "content/browser/loader/resource_request_info_impl.h" | 25 #include "content/browser/loader/resource_request_info_impl.h" |
26 #include "content/common/resource_messages.h" | 26 #include "content/common/resource_messages.h" |
27 #include "content/common/resource_request_completion_status.h" | 27 #include "content/common/resource_request_completion_status.h" |
28 #include "content/common/view_messages.h" | 28 #include "content/common/view_messages.h" |
29 #include "content/public/browser/resource_dispatcher_host_delegate.h" | 29 #include "content/public/browser/resource_dispatcher_host_delegate.h" |
30 #include "content/public/common/content_features.h" | 30 #include "content/public/common/content_features.h" |
31 #include "content/public/common/resource_response.h" | 31 #include "content/public/common/resource_response.h" |
| 32 #include "ipc/ipc_message_macros.h" |
32 #include "net/base/io_buffer.h" | 33 #include "net/base/io_buffer.h" |
33 #include "net/base/load_flags.h" | 34 #include "net/base/load_flags.h" |
34 #include "net/log/net_log.h" | 35 #include "net/log/net_log.h" |
35 #include "net/url_request/redirect_info.h" | 36 #include "net/url_request/redirect_info.h" |
36 | 37 |
37 using base::TimeDelta; | 38 using base::TimeDelta; |
38 using base::TimeTicks; | 39 using base::TimeTicks; |
39 | 40 |
40 namespace content { | 41 namespace content { |
41 namespace { | 42 namespace { |
(...skipping 23 matching lines...) Expand all Loading... |
65 static bool did_init = false; | 66 static bool did_init = false; |
66 if (did_init) | 67 if (did_init) |
67 return; | 68 return; |
68 did_init = true; | 69 did_init = true; |
69 | 70 |
70 GetNumericArg("resource-buffer-size", &kBufferSize); | 71 GetNumericArg("resource-buffer-size", &kBufferSize); |
71 GetNumericArg("resource-buffer-min-allocation-size", &kMinAllocationSize); | 72 GetNumericArg("resource-buffer-min-allocation-size", &kMinAllocationSize); |
72 GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); | 73 GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); |
73 } | 74 } |
74 | 75 |
| 76 // Updates |*cached| to |updated| and returns the difference from the old |
| 77 // value. |
| 78 int TrackDifference(int64_t updated, int64_t* cached) { |
| 79 int difference = updated - *cached; |
| 80 *cached = updated; |
| 81 return difference; |
| 82 } |
| 83 |
75 } // namespace | 84 } // namespace |
76 | 85 |
77 // Used when kOptimizeLoadingIPCForSmallResources is enabled. | 86 // Used when kOptimizeLoadingIPCForSmallResources is enabled. |
78 // The instance hooks the buffer allocation of AsyncResourceHandler, and | 87 // The instance hooks the buffer allocation of AsyncResourceHandler, and |
79 // determine if we should use SharedMemory or should inline the data into | 88 // determine if we should use SharedMemory or should inline the data into |
80 // the IPC message. | 89 // the IPC message. |
81 class AsyncResourceHandler::InliningHelper { | 90 class AsyncResourceHandler::InliningHelper { |
82 public: | 91 public: |
83 | 92 |
84 InliningHelper() {} | 93 InliningHelper() {} |
(...skipping 25 matching lines...) Expand all Loading... |
110 | 119 |
111 leading_chunk_buffer_ = new net::IOBuffer(kInlinedLeadingChunkSize); | 120 leading_chunk_buffer_ = new net::IOBuffer(kInlinedLeadingChunkSize); |
112 *buf = leading_chunk_buffer_; | 121 *buf = leading_chunk_buffer_; |
113 *buf_size = kInlinedLeadingChunkSize; | 122 *buf_size = kInlinedLeadingChunkSize; |
114 return true; | 123 return true; |
115 } | 124 } |
116 | 125 |
117 // Returns true if the received data is sent to the consumer. | 126 // Returns true if the received data is sent to the consumer. |
118 bool SendInlinedDataIfApplicable(int bytes_read, | 127 bool SendInlinedDataIfApplicable(int bytes_read, |
119 int encoded_data_length, | 128 int encoded_data_length, |
| 129 int encoded_body_length, |
120 IPC::Sender* sender, | 130 IPC::Sender* sender, |
121 int request_id) { | 131 int request_id) { |
122 DCHECK(sender); | 132 DCHECK(sender); |
123 if (!leading_chunk_buffer_) | 133 if (!leading_chunk_buffer_) |
124 return false; | 134 return false; |
125 | 135 |
126 std::vector<char> data( | 136 std::vector<char> data( |
127 leading_chunk_buffer_->data(), | 137 leading_chunk_buffer_->data(), |
128 leading_chunk_buffer_->data() + bytes_read); | 138 leading_chunk_buffer_->data() + bytes_read); |
129 leading_chunk_buffer_ = nullptr; | 139 leading_chunk_buffer_ = nullptr; |
130 | 140 |
131 sender->Send(new ResourceMsg_InlinedDataChunkReceived( | 141 sender->Send(new ResourceMsg_InlinedDataChunkReceived( |
132 request_id, data, encoded_data_length)); | 142 request_id, data, encoded_data_length, encoded_body_length)); |
133 return true; | 143 return true; |
134 } | 144 } |
135 | 145 |
136 void RecordHistogram(int64_t elapsed_time) { | 146 void RecordHistogram(int64_t elapsed_time) { |
137 if (inlining_applicable_) { | 147 if (inlining_applicable_) { |
138 UMA_HISTOGRAM_CUSTOM_COUNTS( | 148 UMA_HISTOGRAM_CUSTOM_COUNTS( |
139 "Net.ResourceLoader.ResponseStartToEnd.InliningApplicable", | 149 "Net.ResourceLoader.ResponseStartToEnd.InliningApplicable", |
140 elapsed_time, 1, 100000, 100); | 150 elapsed_time, 1, 100000, 100); |
141 } | 151 } |
142 } | 152 } |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 rdh_(rdh), | 209 rdh_(rdh), |
200 pending_data_count_(0), | 210 pending_data_count_(0), |
201 allocation_size_(0), | 211 allocation_size_(0), |
202 did_defer_(false), | 212 did_defer_(false), |
203 has_checked_for_sufficient_resources_(false), | 213 has_checked_for_sufficient_resources_(false), |
204 sent_received_response_msg_(false), | 214 sent_received_response_msg_(false), |
205 sent_data_buffer_msg_(false), | 215 sent_data_buffer_msg_(false), |
206 inlining_helper_(new InliningHelper), | 216 inlining_helper_(new InliningHelper), |
207 last_upload_position_(0), | 217 last_upload_position_(0), |
208 waiting_for_upload_progress_ack_(false), | 218 waiting_for_upload_progress_ack_(false), |
209 reported_transfer_size_(0) { | 219 reported_transfer_size_(0), |
| 220 reported_encoded_body_length_(0) { |
210 InitializeResourceBufferConstants(); | 221 InitializeResourceBufferConstants(); |
211 } | 222 } |
212 | 223 |
213 AsyncResourceHandler::~AsyncResourceHandler() { | 224 AsyncResourceHandler::~AsyncResourceHandler() { |
214 if (has_checked_for_sufficient_resources_) | 225 if (has_checked_for_sufficient_resources_) |
215 rdh_->FinishedWithResourcesForRequest(request()); | 226 rdh_->FinishedWithResourcesForRequest(request()); |
216 } | 227 } |
217 | 228 |
218 bool AsyncResourceHandler::OnMessageReceived(const IPC::Message& message) { | 229 bool AsyncResourceHandler::OnMessageReceived(const IPC::Message& message) { |
219 bool handled = true; | 230 bool handled = true; |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
433 DCHECK_GE(bytes_read, 0); | 444 DCHECK_GE(bytes_read, 0); |
434 | 445 |
435 if (!bytes_read) | 446 if (!bytes_read) |
436 return true; | 447 return true; |
437 | 448 |
438 ResourceMessageFilter* filter = GetFilter(); | 449 ResourceMessageFilter* filter = GetFilter(); |
439 if (!filter) | 450 if (!filter) |
440 return false; | 451 return false; |
441 | 452 |
442 int encoded_data_length = CalculateEncodedDataLengthToReport(); | 453 int encoded_data_length = CalculateEncodedDataLengthToReport(); |
| 454 int encoded_body_length = CalculateEncodedBodyLengthToReport(); |
443 | 455 |
444 // Return early if InliningHelper handled the received data. | 456 // Return early if InliningHelper handled the received data. |
445 if (inlining_helper_->SendInlinedDataIfApplicable( | 457 if (inlining_helper_->SendInlinedDataIfApplicable( |
446 bytes_read, encoded_data_length, filter, GetRequestID())) | 458 bytes_read, encoded_data_length, encoded_body_length, filter, |
| 459 GetRequestID())) |
447 return true; | 460 return true; |
448 | 461 |
449 buffer_->ShrinkLastAllocation(bytes_read); | 462 buffer_->ShrinkLastAllocation(bytes_read); |
450 | 463 |
451 if (!sent_data_buffer_msg_) { | 464 if (!sent_data_buffer_msg_) { |
452 base::SharedMemoryHandle handle = base::SharedMemory::DuplicateHandle( | 465 base::SharedMemoryHandle handle = base::SharedMemory::DuplicateHandle( |
453 buffer_->GetSharedMemory().handle()); | 466 buffer_->GetSharedMemory().handle()); |
454 if (!base::SharedMemory::IsHandleValid(handle)) | 467 if (!base::SharedMemory::IsHandleValid(handle)) |
455 return false; | 468 return false; |
456 filter->Send(new ResourceMsg_SetDataBuffer( | 469 filter->Send(new ResourceMsg_SetDataBuffer( |
457 GetRequestID(), handle, buffer_->GetSharedMemory().mapped_size(), | 470 GetRequestID(), handle, buffer_->GetSharedMemory().mapped_size(), |
458 filter->peer_pid())); | 471 filter->peer_pid())); |
459 sent_data_buffer_msg_ = true; | 472 sent_data_buffer_msg_ = true; |
460 } | 473 } |
461 | 474 |
462 int data_offset = buffer_->GetLastAllocationOffset(); | 475 int data_offset = buffer_->GetLastAllocationOffset(); |
463 | 476 |
464 filter->Send(new ResourceMsg_DataReceived( | 477 filter->Send(new ResourceMsg_DataReceived(GetRequestID(), data_offset, |
465 GetRequestID(), data_offset, bytes_read, encoded_data_length)); | 478 bytes_read, encoded_data_length, |
| 479 encoded_body_length)); |
466 ++pending_data_count_; | 480 ++pending_data_count_; |
467 | 481 |
468 if (!buffer_->CanAllocate()) { | 482 if (!buffer_->CanAllocate()) { |
469 *defer = did_defer_ = true; | 483 *defer = did_defer_ = true; |
470 OnDefer(); | 484 OnDefer(); |
471 } | 485 } |
472 | 486 |
473 return true; | 487 return true; |
474 } | 488 } |
475 | 489 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 has_checked_for_sufficient_resources_ = true; | 583 has_checked_for_sufficient_resources_ = true; |
570 | 584 |
571 if (rdh_->HasSufficientResourcesForRequest(request())) | 585 if (rdh_->HasSufficientResourcesForRequest(request())) |
572 return true; | 586 return true; |
573 | 587 |
574 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); | 588 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); |
575 return false; | 589 return false; |
576 } | 590 } |
577 | 591 |
578 int AsyncResourceHandler::CalculateEncodedDataLengthToReport() { | 592 int AsyncResourceHandler::CalculateEncodedDataLengthToReport() { |
579 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); | 593 return TrackDifference(request()->GetTotalReceivedBytes(), |
580 int encoded_data_length = current_transfer_size - reported_transfer_size_; | 594 &reported_transfer_size_); |
581 reported_transfer_size_ = current_transfer_size; | 595 } |
582 return encoded_data_length; | 596 |
| 597 int AsyncResourceHandler::CalculateEncodedBodyLengthToReport() { |
| 598 return TrackDifference(request()->GetRawBodyBytes(), |
| 599 &reported_encoded_body_length_); |
583 } | 600 } |
584 | 601 |
585 void AsyncResourceHandler::RecordHistogram() { | 602 void AsyncResourceHandler::RecordHistogram() { |
586 int64_t elapsed_time = | 603 int64_t elapsed_time = |
587 (base::TimeTicks::Now() - response_started_ticks_).InMicroseconds(); | 604 (base::TimeTicks::Now() - response_started_ticks_).InMicroseconds(); |
588 int64_t encoded_length = request()->GetTotalReceivedBytes(); | 605 int64_t encoded_length = request()->GetTotalReceivedBytes(); |
589 if (encoded_length < 2 * 1024) { | 606 if (encoded_length < 2 * 1024) { |
590 // The resource was smaller than the smallest required buffer size. | 607 // The resource was smaller than the smallest required buffer size. |
591 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_2kB", | 608 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_2kB", |
592 elapsed_time, 1, 100000, 100); | 609 elapsed_time, 1, 100000, 100); |
593 } else if (encoded_length < 32 * 1024) { | 610 } else if (encoded_length < 32 * 1024) { |
594 // The resource was smaller than single chunk. | 611 // The resource was smaller than single chunk. |
595 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_32kB", | 612 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_32kB", |
596 elapsed_time, 1, 100000, 100); | 613 elapsed_time, 1, 100000, 100); |
597 } else if (encoded_length < 512 * 1024) { | 614 } else if (encoded_length < 512 * 1024) { |
598 // The resource was smaller than single chunk. | 615 // The resource was smaller than single chunk. |
599 UMA_HISTOGRAM_CUSTOM_COUNTS( | 616 UMA_HISTOGRAM_CUSTOM_COUNTS( |
600 "Net.ResourceLoader.ResponseStartToEnd.LT_512kB", | 617 "Net.ResourceLoader.ResponseStartToEnd.LT_512kB", |
601 elapsed_time, 1, 100000, 100); | 618 elapsed_time, 1, 100000, 100); |
602 } else { | 619 } else { |
603 UMA_HISTOGRAM_CUSTOM_COUNTS( | 620 UMA_HISTOGRAM_CUSTOM_COUNTS( |
604 "Net.ResourceLoader.ResponseStartToEnd.Over_512kB", | 621 "Net.ResourceLoader.ResponseStartToEnd.Over_512kB", |
605 elapsed_time, 1, 100000, 100); | 622 elapsed_time, 1, 100000, 100); |
606 } | 623 } |
607 | 624 |
608 inlining_helper_->RecordHistogram(elapsed_time); | 625 inlining_helper_->RecordHistogram(elapsed_time); |
609 } | 626 } |
610 | 627 |
611 } // namespace content | 628 } // namespace content |
OLD | NEW |