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