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_); |
+} |