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