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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/devtools/devtools_network_transaction.cc
diff --git a/chrome/browser/devtools/devtools_network_transaction.cc b/chrome/browser/devtools/devtools_network_transaction.cc
index bba196c6bc7b3920021e1c9e995cff7ae9d6a821..ff9f37e9a4f1aaaaf7092440563c2c638c4fc27f 100644
--- a/chrome/browser/devtools/devtools_network_transaction.cc
+++ b/chrome/browser/devtools/devtools_network_transaction.cc
@@ -17,6 +17,7 @@ DevToolsNetworkTransaction::DevToolsNetworkTransaction(
network_transaction_(network_transaction.Pass()),
request_(NULL),
failed_(false),
+ callback_type_(NONE),
proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback,
base::Unretained(this))) {
DCHECK(controller);
@@ -27,15 +28,56 @@ DevToolsNetworkTransaction::~DevToolsNetworkTransaction() {
controller_->RemoveTransaction(this);
}
+void DevToolsNetworkTransaction::Throttle(int result) {
+ throttled_result_ = result;
+ int64_t penalty = 0;
+ if (callback_type_ == START)
+ penalty += network_transaction_->GetTotalReceivedBytes();
+ if (result > 0)
+ penalty += result;
+ 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.
+}
+
void DevToolsNetworkTransaction::OnCallback(int rv) {
if (failed_)
return;
DCHECK(!callback_.is_null());
+ if (callback_type_ == START || callback_type_ == READ) {
+ if (controller_->ShouldThrottle(request_)) {
+ Throttle(rv);
+ return;
+ }
+ }
net::CompletionCallback callback = callback_;
callback_.Reset();
+ callback_type_ = NONE;
callback.Run(rv);
}
+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.
+ net::CompletionCallback callback,
+ int result,
+ CallbackType callback_type) {
+ 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
+ if (controller_->ShouldThrottle(request_)) {
+ if (result != net::ERR_IO_PENDING) {
+ callback_type_ = callback_type;
+ callback_ = callback;
+ 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.
+ return net::ERR_IO_PENDING;
+ }
+ }
+ }
+
+ if (result == net::ERR_IO_PENDING) {
+ callback_type_ = callback_type;
+ callback_ = callback;
+ } else {
+ 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.
+ }
+ return result;
+}
+
void DevToolsNetworkTransaction::Fail() {
DCHECK(request_);
DCHECK(!failed_);
@@ -46,6 +88,7 @@ void DevToolsNetworkTransaction::Fail() {
return;
net::CompletionCallback callback = callback_;
callback_.Reset();
+ callback_type_ = NONE;
callback.Run(net::ERR_INTERNET_DISCONNECTED);
}
@@ -63,9 +106,7 @@ int DevToolsNetworkTransaction::Start(
return net::ERR_INTERNET_DISCONNECTED;
}
int rv = network_transaction_->Start(request, proxy_callback_, net_log);
- if (rv == net::ERR_IO_PENDING)
- callback_ = callback;
- return rv;
+ return SetupCallback(callback, rv, START);
}
int DevToolsNetworkTransaction::RestartIgnoringLastError(
@@ -73,9 +114,7 @@ int DevToolsNetworkTransaction::RestartIgnoringLastError(
if (failed_)
return net::ERR_INTERNET_DISCONNECTED;
int rv = network_transaction_->RestartIgnoringLastError(proxy_callback_);
- if (rv == net::ERR_IO_PENDING)
- callback_ = callback;
- return rv;
+ 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
}
int DevToolsNetworkTransaction::RestartWithCertificate(
@@ -85,9 +124,7 @@ int DevToolsNetworkTransaction::RestartWithCertificate(
return net::ERR_INTERNET_DISCONNECTED;
int rv = network_transaction_->RestartWithCertificate(
client_cert, proxy_callback_);
- if (rv == net::ERR_IO_PENDING)
- callback_ = callback;
- return rv;
+ return SetupCallback(callback, rv, RESTART_WITH_CERTIFICATE);
}
int DevToolsNetworkTransaction::RestartWithAuth(
@@ -96,9 +133,7 @@ int DevToolsNetworkTransaction::RestartWithAuth(
if (failed_)
return net::ERR_INTERNET_DISCONNECTED;
int rv = network_transaction_->RestartWithAuth(credentials, proxy_callback_);
- if (rv == net::ERR_IO_PENDING)
- callback_ = callback;
- return rv;
+ return SetupCallback(callback, rv, RESTART_WITH_AUTH);
}
bool DevToolsNetworkTransaction::IsReadyToRestartForAuth() {
@@ -112,9 +147,7 @@ int DevToolsNetworkTransaction::Read(
if (failed_)
return net::ERR_INTERNET_DISCONNECTED;
int rv = network_transaction_->Read(buf, buf_len, proxy_callback_);
- if (rv == net::ERR_IO_PENDING)
- callback_ = callback;
- return rv;
+ return SetupCallback(callback, rv, READ);
}
void DevToolsNetworkTransaction::StopCaching() {
@@ -176,3 +209,12 @@ int DevToolsNetworkTransaction::ResumeNetworkStart() {
return net::ERR_INTERNET_DISCONNECTED;
return network_transaction_->ResumeNetworkStart();
}
+
+void DevToolsNetworkTransaction::FireThrottledCallback() {
+ DCHECK(!callback_.is_null());
+ DCHECK(callback_type_ == READ || callback_type_ == START);
+ net::CompletionCallback callback = callback_;
+ callback_.Reset();
+ callback_type_ = NONE;
+ callback.Run(throttled_result_);
+}

Powered by Google App Engine
This is Rietveld 408576698