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

Side by Side Diff: chrome/browser/devtools/devtools_network_transaction.cc

Issue 324953002: DevToolsNetworkController: support "limit throughput" network condition. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Resolved TODO Created 6 years, 6 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/devtools/devtools_network_transaction.h" 5 #include "chrome/browser/devtools/devtools_network_transaction.h"
6 6
7 #include "chrome/browser/devtools/devtools_network_controller.h" 7 #include "chrome/browser/devtools/devtools_network_controller.h"
8 #include "net/base/net_errors.h" 8 #include "net/base/net_errors.h"
9 #include "net/base/upload_progress.h" 9 #include "net/base/upload_progress.h"
10 #include "net/http/http_network_transaction.h" 10 #include "net/http/http_network_transaction.h"
11 #include "net/http/http_request_info.h" 11 #include "net/http/http_request_info.h"
12 12
13 DevToolsNetworkTransaction::DevToolsNetworkTransaction( 13 DevToolsNetworkTransaction::DevToolsNetworkTransaction(
14 DevToolsNetworkController* controller, 14 DevToolsNetworkController* controller,
15 scoped_ptr<net::HttpTransaction> network_transaction) 15 scoped_ptr<net::HttpTransaction> network_transaction)
16 : controller_(controller), 16 : controller_(controller),
17 network_transaction_(network_transaction.Pass()), 17 network_transaction_(network_transaction.Pass()),
18 request_(NULL), 18 request_(NULL),
19 failed_(false), 19 failed_(false),
20 callback_type_(NONE),
20 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback, 21 proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback,
21 base::Unretained(this))) { 22 base::Unretained(this))) {
22 DCHECK(controller); 23 DCHECK(controller);
23 controller->AddTransaction(this); 24 controller->AddTransaction(this);
24 } 25 }
25 26
26 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() { 27 DevToolsNetworkTransaction::~DevToolsNetworkTransaction() {
27 controller_->RemoveTransaction(this); 28 controller_->RemoveTransaction(this);
28 } 29 }
29 30
31 void DevToolsNetworkTransaction::Throttle(int result) {
32 throttled_result_ = result;
33 int64_t penalty = 0;
34 if (callback_type_ == START)
35 penalty += network_transaction_->GetTotalReceivedBytes();
36 if (result > 0)
37 penalty += result;
38 controller_->ThrottleTransaction(this, penalty);
vsevik 2014/06/11 08:10:34 We should make sure we do not callback synchronous
eustas 2014/06/11 10:54:26 Done.
39 }
40
30 void DevToolsNetworkTransaction::OnCallback(int rv) { 41 void DevToolsNetworkTransaction::OnCallback(int rv) {
31 if (failed_) 42 if (failed_)
32 return; 43 return;
33 DCHECK(!callback_.is_null()); 44 DCHECK(!callback_.is_null());
45 if (callback_type_ == START || callback_type_ == READ) {
46 if (controller_->ShouldThrottle(request_)) {
47 Throttle(rv);
48 return;
49 }
50 }
34 net::CompletionCallback callback = callback_; 51 net::CompletionCallback callback = callback_;
35 callback_.Reset(); 52 callback_.Reset();
53 callback_type_ = NONE;
36 callback.Run(rv); 54 callback.Run(rv);
37 } 55 }
38 56
57 int DevToolsNetworkTransaction::SetupCallback(
vsevik 2014/06/11 08:10:34 DCHECK(callback_type_ == NONE); if (result == net
eustas 2014/06/11 10:54:26 Done.
58 net::CompletionCallback callback,
59 int result,
60 CallbackType callback_type) {
61 if (callback_type == START || (callback_type == READ && result > 0)) {
vsevik 2014/06/10 17:24:20 Is it possible that result != net::ERR_IO_PENDING
vsevik 2014/06/11 08:10:34 Should we also throttle the result < 0 case here?
eustas 2014/06/11 10:54:26 Yes, SPDY "push" streams can cause OK = 0 result.
eustas 2014/06/11 10:54:26 Yes, even ERROR start may have caused network traf
62 if (controller_->ShouldThrottle(request_)) {
63 if (result != net::ERR_IO_PENDING) {
64 callback_type_ = callback_type;
65 callback_ = callback;
66 Throttle(result);
vsevik 2014/06/10 17:24:20 Is it OK that we could callback before returning f
eustas 2014/06/11 10:54:26 Done.
67 return net::ERR_IO_PENDING;
68 }
69 }
70 }
71
72 if (result == net::ERR_IO_PENDING) {
73 callback_type_ = callback_type;
74 callback_ = callback;
75 } else {
76 callback_type_ = NONE;
vsevik 2014/06/11 08:10:34 This is redundant, let's DCHECK(callback_type_ ==
eustas 2014/06/11 10:54:26 Done.
77 }
78 return result;
79 }
80
39 void DevToolsNetworkTransaction::Fail() { 81 void DevToolsNetworkTransaction::Fail() {
40 DCHECK(request_); 82 DCHECK(request_);
41 DCHECK(!failed_); 83 DCHECK(!failed_);
42 failed_ = true; 84 failed_ = true;
43 network_transaction_->SetBeforeNetworkStartCallback( 85 network_transaction_->SetBeforeNetworkStartCallback(
44 BeforeNetworkStartCallback()); 86 BeforeNetworkStartCallback());
45 if (callback_.is_null()) 87 if (callback_.is_null())
46 return; 88 return;
47 net::CompletionCallback callback = callback_; 89 net::CompletionCallback callback = callback_;
48 callback_.Reset(); 90 callback_.Reset();
91 callback_type_ = NONE;
49 callback.Run(net::ERR_INTERNET_DISCONNECTED); 92 callback.Run(net::ERR_INTERNET_DISCONNECTED);
50 } 93 }
51 94
52 int DevToolsNetworkTransaction::Start( 95 int DevToolsNetworkTransaction::Start(
53 const net::HttpRequestInfo* request, 96 const net::HttpRequestInfo* request,
54 const net::CompletionCallback& callback, 97 const net::CompletionCallback& callback,
55 const net::BoundNetLog& net_log) { 98 const net::BoundNetLog& net_log) {
56 DCHECK(request); 99 DCHECK(request);
57 request_ = request; 100 request_ = request;
58 101
59 if (controller_->ShouldFail(request_)) { 102 if (controller_->ShouldFail(request_)) {
60 failed_ = true; 103 failed_ = true;
61 network_transaction_->SetBeforeNetworkStartCallback( 104 network_transaction_->SetBeforeNetworkStartCallback(
62 BeforeNetworkStartCallback()); 105 BeforeNetworkStartCallback());
63 return net::ERR_INTERNET_DISCONNECTED; 106 return net::ERR_INTERNET_DISCONNECTED;
64 } 107 }
65 int rv = network_transaction_->Start(request, proxy_callback_, net_log); 108 int rv = network_transaction_->Start(request, proxy_callback_, net_log);
66 if (rv == net::ERR_IO_PENDING) 109 return SetupCallback(callback, rv, START);
67 callback_ = callback;
68 return rv;
69 } 110 }
70 111
71 int DevToolsNetworkTransaction::RestartIgnoringLastError( 112 int DevToolsNetworkTransaction::RestartIgnoringLastError(
72 const net::CompletionCallback& callback) { 113 const net::CompletionCallback& callback) {
73 if (failed_) 114 if (failed_)
74 return net::ERR_INTERNET_DISCONNECTED; 115 return net::ERR_INTERNET_DISCONNECTED;
75 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_); 116 int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_);
76 if (rv == net::ERR_IO_PENDING) 117 return SetupCallback(callback, rv, RESTART_IGNORING_LAST_ERROR);
vsevik 2014/06/10 17:24:20 Is it somehow enforced that several of all these m
eustas 2014/06/11 10:54:26 It is required by transaction contract, but not en
77 callback_ = callback;
78 return rv;
79 } 118 }
80 119
81 int DevToolsNetworkTransaction::RestartWithCertificate( 120 int DevToolsNetworkTransaction::RestartWithCertificate(
82 net::X509Certificate* client_cert, 121 net::X509Certificate* client_cert,
83 const net::CompletionCallback& callback) { 122 const net::CompletionCallback& callback) {
84 if (failed_) 123 if (failed_)
85 return net::ERR_INTERNET_DISCONNECTED; 124 return net::ERR_INTERNET_DISCONNECTED;
86 int rv = network_transaction_->RestartWithCertificate( 125 int rv = network_transaction_->RestartWithCertificate(
87 client_cert, proxy_callback_); 126 client_cert, proxy_callback_);
88 if (rv == net::ERR_IO_PENDING) 127 return SetupCallback(callback, rv, RESTART_WITH_CERTIFICATE);
89 callback_ = callback;
90 return rv;
91 } 128 }
92 129
93 int DevToolsNetworkTransaction::RestartWithAuth( 130 int DevToolsNetworkTransaction::RestartWithAuth(
94 const net::AuthCredentials& credentials, 131 const net::AuthCredentials& credentials,
95 const net::CompletionCallback& callback) { 132 const net::CompletionCallback& callback) {
96 if (failed_) 133 if (failed_)
97 return net::ERR_INTERNET_DISCONNECTED; 134 return net::ERR_INTERNET_DISCONNECTED;
98 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_); 135 int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_);
99 if (rv == net::ERR_IO_PENDING) 136 return SetupCallback(callback, rv, RESTART_WITH_AUTH);
100 callback_ = callback;
101 return rv;
102 } 137 }
103 138
104 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() { 139 bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() {
105 return network_transaction_->IsReadyToRestartForAuth(); 140 return network_transaction_->IsReadyToRestartForAuth();
106 } 141 }
107 142
108 int DevToolsNetworkTransaction::Read( 143 int DevToolsNetworkTransaction::Read(
109 net::IOBuffer* buf, 144 net::IOBuffer* buf,
110 int buf_len, 145 int buf_len,
111 const net::CompletionCallback& callback) { 146 const net::CompletionCallback& callback) {
112 if (failed_) 147 if (failed_)
113 return net::ERR_INTERNET_DISCONNECTED; 148 return net::ERR_INTERNET_DISCONNECTED;
114 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_); 149 int rv = network_transaction_->Read(buf, buf_len, proxy_callback_);
115 if (rv == net::ERR_IO_PENDING) 150 return SetupCallback(callback, rv, READ);
116 callback_ = callback;
117 return rv;
118 } 151 }
119 152
120 void DevToolsNetworkTransaction::StopCaching() { 153 void DevToolsNetworkTransaction::StopCaching() {
121 network_transaction_->StopCaching(); 154 network_transaction_->StopCaching();
122 } 155 }
123 156
124 bool DevToolsNetworkTransaction::GetFullRequestHeaders( 157 bool DevToolsNetworkTransaction::GetFullRequestHeaders(
125 net::HttpRequestHeaders* headers) const { 158 net::HttpRequestHeaders* headers) const {
126 return network_transaction_->GetFullRequestHeaders(headers); 159 return network_transaction_->GetFullRequestHeaders(headers);
127 } 160 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback( 202 void DevToolsNetworkTransaction::SetBeforeNetworkStartCallback(
170 const BeforeNetworkStartCallback& callback) { 203 const BeforeNetworkStartCallback& callback) {
171 network_transaction_->SetBeforeNetworkStartCallback(callback); 204 network_transaction_->SetBeforeNetworkStartCallback(callback);
172 } 205 }
173 206
174 int DevToolsNetworkTransaction::ResumeNetworkStart() { 207 int DevToolsNetworkTransaction::ResumeNetworkStart() {
175 if (failed_) 208 if (failed_)
176 return net::ERR_INTERNET_DISCONNECTED; 209 return net::ERR_INTERNET_DISCONNECTED;
177 return network_transaction_->ResumeNetworkStart(); 210 return network_transaction_->ResumeNetworkStart();
178 } 211 }
212
213 void DevToolsNetworkTransaction::FireThrottledCallback() {
214 DCHECK(!callback_.is_null());
215 DCHECK(callback_type_ == READ || callback_type_ == START);
216 net::CompletionCallback callback = callback_;
217 callback_.Reset();
218 callback_type_ = NONE;
219 callback.Run(throttled_result_);
220 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698