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

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: Method renames 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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 DCHECK_GE(bytes_read, 0); 443 DCHECK_GE(bytes_read, 0);
433 444
434 if (!bytes_read) 445 if (!bytes_read)
435 return true; 446 return true;
436 447
437 ResourceMessageFilter* filter = GetFilter(); 448 ResourceMessageFilter* filter = GetFilter();
438 if (!filter) 449 if (!filter)
439 return false; 450 return false;
440 451
441 int encoded_data_length = CalculateEncodedDataLengthToReport(); 452 int encoded_data_length = CalculateEncodedDataLengthToReport();
453 int encoded_body_length = CalculateEncodedBodyLengthToReport();
442 454
443 // Return early if InliningHelper handled the received data. 455 // Return early if InliningHelper handled the received data.
444 if (inlining_helper_->SendInlinedDataIfApplicable( 456 if (inlining_helper_->SendInlinedDataIfApplicable(
445 bytes_read, encoded_data_length, filter, GetRequestID())) 457 bytes_read, encoded_data_length, encoded_body_length, filter,
458 GetRequestID()))
446 return true; 459 return true;
447 460
448 buffer_->ShrinkLastAllocation(bytes_read); 461 buffer_->ShrinkLastAllocation(bytes_read);
449 462
450 if (!sent_data_buffer_msg_) { 463 if (!sent_data_buffer_msg_) {
451 base::SharedMemoryHandle handle = base::SharedMemory::DuplicateHandle( 464 base::SharedMemoryHandle handle = base::SharedMemory::DuplicateHandle(
452 buffer_->GetSharedMemory().handle()); 465 buffer_->GetSharedMemory().handle());
453 if (!base::SharedMemory::IsHandleValid(handle)) 466 if (!base::SharedMemory::IsHandleValid(handle))
454 return false; 467 return false;
455 filter->Send(new ResourceMsg_SetDataBuffer( 468 filter->Send(new ResourceMsg_SetDataBuffer(
456 GetRequestID(), handle, buffer_->GetSharedMemory().mapped_size(), 469 GetRequestID(), handle, buffer_->GetSharedMemory().mapped_size(),
457 filter->peer_pid())); 470 filter->peer_pid()));
458 sent_data_buffer_msg_ = true; 471 sent_data_buffer_msg_ = true;
459 } 472 }
460 473
461 int data_offset = buffer_->GetLastAllocationOffset(); 474 int data_offset = buffer_->GetLastAllocationOffset();
462 475
463 filter->Send(new ResourceMsg_DataReceived( 476 filter->Send(new ResourceMsg_DataReceived(GetRequestID(), data_offset,
464 GetRequestID(), data_offset, bytes_read, encoded_data_length)); 477 bytes_read, encoded_data_length,
478 encoded_body_length));
465 ++pending_data_count_; 479 ++pending_data_count_;
466 480
467 if (!buffer_->CanAllocate()) { 481 if (!buffer_->CanAllocate()) {
468 *defer = did_defer_ = true; 482 *defer = did_defer_ = true;
469 OnDefer(); 483 OnDefer();
470 } 484 }
471 485
472 return true; 486 return true;
473 } 487 }
474 488
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 has_checked_for_sufficient_resources_ = true; 582 has_checked_for_sufficient_resources_ = true;
569 583
570 if (rdh_->HasSufficientResourcesForRequest(request())) 584 if (rdh_->HasSufficientResourcesForRequest(request()))
571 return true; 585 return true;
572 586
573 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES); 587 controller()->CancelWithError(net::ERR_INSUFFICIENT_RESOURCES);
574 return false; 588 return false;
575 } 589 }
576 590
577 int AsyncResourceHandler::CalculateEncodedDataLengthToReport() { 591 int AsyncResourceHandler::CalculateEncodedDataLengthToReport() {
578 int64_t current_transfer_size = request()->GetTotalReceivedBytes(); 592 return TrackDifference(request()->GetTotalReceivedBytes(),
579 int encoded_data_length = current_transfer_size - reported_transfer_size_; 593 &reported_transfer_size_);
580 reported_transfer_size_ = current_transfer_size; 594 }
581 return encoded_data_length; 595
596 int AsyncResourceHandler::CalculateEncodedBodyLengthToReport() {
597 return TrackDifference(request()->GetRawBodyBytes(),
598 &reported_encoded_body_length_);
582 } 599 }
583 600
584 void AsyncResourceHandler::RecordHistogram() { 601 void AsyncResourceHandler::RecordHistogram() {
585 int64_t elapsed_time = 602 int64_t elapsed_time =
586 (base::TimeTicks::Now() - response_started_ticks_).InMicroseconds(); 603 (base::TimeTicks::Now() - response_started_ticks_).InMicroseconds();
587 int64_t encoded_length = request()->GetTotalReceivedBytes(); 604 int64_t encoded_length = request()->GetTotalReceivedBytes();
588 if (encoded_length < 2 * 1024) { 605 if (encoded_length < 2 * 1024) {
589 // The resource was smaller than the smallest required buffer size. 606 // The resource was smaller than the smallest required buffer size.
590 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_2kB", 607 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_2kB",
591 elapsed_time, 1, 100000, 100); 608 elapsed_time, 1, 100000, 100);
592 } else if (encoded_length < 32 * 1024) { 609 } else if (encoded_length < 32 * 1024) {
593 // The resource was smaller than single chunk. 610 // The resource was smaller than single chunk.
594 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_32kB", 611 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.ResourceLoader.ResponseStartToEnd.LT_32kB",
595 elapsed_time, 1, 100000, 100); 612 elapsed_time, 1, 100000, 100);
596 } else if (encoded_length < 512 * 1024) { 613 } else if (encoded_length < 512 * 1024) {
597 // The resource was smaller than single chunk. 614 // The resource was smaller than single chunk.
598 UMA_HISTOGRAM_CUSTOM_COUNTS( 615 UMA_HISTOGRAM_CUSTOM_COUNTS(
599 "Net.ResourceLoader.ResponseStartToEnd.LT_512kB", 616 "Net.ResourceLoader.ResponseStartToEnd.LT_512kB",
600 elapsed_time, 1, 100000, 100); 617 elapsed_time, 1, 100000, 100);
601 } else { 618 } else {
602 UMA_HISTOGRAM_CUSTOM_COUNTS( 619 UMA_HISTOGRAM_CUSTOM_COUNTS(
603 "Net.ResourceLoader.ResponseStartToEnd.Over_512kB", 620 "Net.ResourceLoader.ResponseStartToEnd.Over_512kB",
604 elapsed_time, 1, 100000, 100); 621 elapsed_time, 1, 100000, 100);
605 } 622 }
606 623
607 inlining_helper_->RecordHistogram(elapsed_time); 624 inlining_helper_->RecordHistogram(elapsed_time);
608 } 625 }
609 626
610 } // namespace content 627 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/loader/async_resource_handler.h ('k') | content/browser/loader/async_resource_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698