Index: content/browser/loader/async_resource_handler.cc |
diff --git a/content/browser/loader/async_resource_handler.cc b/content/browser/loader/async_resource_handler.cc |
index 321b0de619bf68d689a4476e6487286ff235210e..4c7b2fb6ff93e5cc7f3176dfd2ce4db873caa8c8 100644 |
--- a/content/browser/loader/async_resource_handler.cc |
+++ b/content/browser/loader/async_resource_handler.cc |
@@ -29,6 +29,7 @@ |
#include "content/public/browser/resource_dispatcher_host_delegate.h" |
#include "content/public/common/content_features.h" |
#include "content/public/common/resource_response.h" |
+#include "ipc/ipc_message_macros.h" |
#include "net/base/io_buffer.h" |
#include "net/base/load_flags.h" |
#include "net/log/net_log.h" |
@@ -72,6 +73,14 @@ void InitializeResourceBufferConstants() { |
GetNumericArg("resource-buffer-max-allocation-size", &kMaxAllocationSize); |
} |
+// Updates |*cached| to |updated| and returns the difference from the old |
+// value. |
+int TrackDifference(int64_t updated, int64_t* cached) { |
+ int difference = updated - *cached; |
+ *cached = updated; |
+ return difference; |
+} |
+ |
} // namespace |
// Used when kOptimizeLoadingIPCForSmallResources is enabled. |
@@ -117,6 +126,7 @@ class AsyncResourceHandler::InliningHelper { |
// Returns true if the received data is sent to the consumer. |
bool SendInlinedDataIfApplicable(int bytes_read, |
int encoded_data_length, |
+ int encoded_body_length, |
IPC::Sender* sender, |
int request_id) { |
DCHECK(sender); |
@@ -129,7 +139,7 @@ class AsyncResourceHandler::InliningHelper { |
leading_chunk_buffer_ = nullptr; |
sender->Send(new ResourceMsg_InlinedDataChunkReceived( |
- request_id, data, encoded_data_length)); |
+ request_id, data, encoded_data_length, encoded_body_length)); |
return true; |
} |
@@ -206,7 +216,8 @@ AsyncResourceHandler::AsyncResourceHandler( |
inlining_helper_(new InliningHelper), |
last_upload_position_(0), |
waiting_for_upload_progress_ack_(false), |
- reported_transfer_size_(0) { |
+ reported_transfer_size_(0), |
+ reported_encoded_body_length_(0) { |
InitializeResourceBufferConstants(); |
} |
@@ -440,10 +451,12 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
return false; |
int encoded_data_length = CalculateEncodedDataLengthToReport(); |
+ int encoded_body_length = CalculateEncodedBodyLengthToReport(); |
// Return early if InliningHelper handled the received data. |
if (inlining_helper_->SendInlinedDataIfApplicable( |
- bytes_read, encoded_data_length, filter, GetRequestID())) |
+ bytes_read, encoded_data_length, encoded_body_length, filter, |
+ GetRequestID())) |
return true; |
buffer_->ShrinkLastAllocation(bytes_read); |
@@ -461,8 +474,9 @@ bool AsyncResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
int data_offset = buffer_->GetLastAllocationOffset(); |
- filter->Send(new ResourceMsg_DataReceived( |
- GetRequestID(), data_offset, bytes_read, encoded_data_length)); |
+ filter->Send(new ResourceMsg_DataReceived(GetRequestID(), data_offset, |
+ bytes_read, encoded_data_length, |
+ encoded_body_length)); |
++pending_data_count_; |
if (!buffer_->CanAllocate()) { |
@@ -576,10 +590,13 @@ bool AsyncResourceHandler::CheckForSufficientResource() { |
} |
int AsyncResourceHandler::CalculateEncodedDataLengthToReport() { |
- int64_t current_transfer_size = request()->GetTotalReceivedBytes(); |
- int encoded_data_length = current_transfer_size - reported_transfer_size_; |
- reported_transfer_size_ = current_transfer_size; |
- return encoded_data_length; |
+ return TrackDifference(request()->GetTotalReceivedBytes(), |
+ &reported_transfer_size_); |
+} |
+ |
+int AsyncResourceHandler::CalculateEncodedBodyLengthToReport() { |
+ return TrackDifference(request()->GetRawBodyBytes(), |
+ &reported_encoded_body_length_); |
} |
void AsyncResourceHandler::RecordHistogram() { |