Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: content/browser/loader/async_resource_handler.cc

Issue 2092993002: Browser process changes for Resource Timing sizes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix content_features.cc header include Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698