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

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: Addressed comments + refactoring 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..7260b5710aae325da5df86c3b19d8df13d4bf803 100644
--- a/chrome/browser/devtools/devtools_network_transaction.cc
+++ b/chrome/browser/devtools/devtools_network_transaction.cc
@@ -17,6 +17,8 @@ DevToolsNetworkTransaction::DevToolsNetworkTransaction(
network_transaction_(network_transaction.Pass()),
request_(NULL),
failed_(false),
+ throttled_byte_count_(0),
+ callback_type_(NONE),
proxy_callback_(base::Bind(&DevToolsNetworkTransaction::OnCallback,
base::Unretained(this))) {
DCHECK(controller);
@@ -27,15 +29,66 @@ DevToolsNetworkTransaction::~DevToolsNetworkTransaction() {
controller_->RemoveTransaction(this);
}
+void DevToolsNetworkTransaction::Throttle(int result) {
+ throttled_result_ = result;
+
+ if (callback_type_ == START)
+ throttled_byte_count_ += network_transaction_->GetTotalReceivedBytes();
+ if (result > 0)
+ throttled_byte_count_ += result;
+
+ controller_->ThrottleTransaction(this);
+}
+
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(
+ net::CompletionCallback callback,
+ int result,
+ CallbackType callback_type) {
+ DCHECK(callback_type_ == NONE);
+
+ if (result == net::ERR_IO_PENDING) {
+ callback_type_ = callback_type;
+ callback_ = callback;
+ return result;
+ }
+
+ if (!controller_->ShouldThrottle(request_))
+ return result;
+
+ // Only START and READ operation throttling is supported.
+ if (callback_type != START && callback_type != READ)
+ return result;
+
+ // In case of error |throttled_byte_count_| is unknown.
+ if (result < 0)
+ return result;
+
+ // URLRequestJob relies on synchronous end-of-stream notification.
+ if (callback_type == READ && result == 0)
+ return result;
+
+ callback_type_ = callback_type;
+ callback_ = callback;
+ Throttle(result);
+ return net::ERR_IO_PENDING;
+}
+
void DevToolsNetworkTransaction::Fail() {
DCHECK(request_);
DCHECK(!failed_);
@@ -46,6 +99,7 @@ void DevToolsNetworkTransaction::Fail() {
return;
net::CompletionCallback callback = callback_;
callback_.Reset();
+ callback_type_ = NONE;
callback.Run(net::ERR_INTERNET_DISCONNECTED);
}
@@ -63,9 +117,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 +125,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);
}
int DevToolsNetworkTransaction::RestartWithCertificate(
@@ -85,9 +135,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 +144,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 +158,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 +220,16 @@ int DevToolsNetworkTransaction::ResumeNetworkStart() {
return net::ERR_INTERNET_DISCONNECTED;
return network_transaction_->ResumeNetworkStart();
}
+
+void DevToolsNetworkTransaction::DecreaseThrottledByteCount(int64_t delta) {
+ throttled_byte_count_ -= delta;
vsevik 2014/06/11 14:29:39 nit: inline
eustas 2014/06/11 14:42:47 Done.
+}
+
+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