Index: content/browser/loader/throttling_resource_handler.cc |
diff --git a/content/browser/loader/throttling_resource_handler.cc b/content/browser/loader/throttling_resource_handler.cc |
index 36c595fbf1b9aaabbf2cc8841f5702c2fcd602cb..0de6177842469d8ad983d064a694b3638d9a09a5 100644 |
--- a/content/browser/loader/throttling_resource_handler.cc |
+++ b/content/browser/loader/throttling_resource_handler.cc |
@@ -84,6 +84,31 @@ bool ThrottlingResourceHandler::OnWillStart(int request_id, |
return next_handler_->OnWillStart(request_id, url, defer); |
} |
+bool ThrottlingResourceHandler::OnBeforeNetworkStart(int request_id, |
+ const GURL& url, |
+ bool* defer) { |
+ DCHECK(!cancelled_by_resource_throttle_); |
+ |
+ *defer = false; |
+ while (next_index_ < throttles_.size()) { |
+ int index = next_index_; |
+ throttles_[index]->OnBeforeNetworkStart(defer); |
+ next_index_++; |
+ if (cancelled_by_resource_throttle_) |
+ return false; |
+ if (*defer) { |
+ OnRequestDefered(index); |
+ deferred_stage_ = DEFERRED_NETWORK_START; |
+ deferred_url_ = url; |
+ return true; // Do not cancel. |
+ } |
+ } |
+ |
+ next_index_ = 0; // Reset for next time. |
+ |
+ return next_handler_->OnBeforeNetworkStart(request_id, url, defer); |
+} |
+ |
bool ThrottlingResourceHandler::OnResponseStarted(int request_id, |
ResourceResponse* response, |
bool* defer) { |
@@ -137,6 +162,9 @@ void ThrottlingResourceHandler::Resume() { |
case DEFERRED_START: |
ResumeStart(); |
break; |
+ case DEFERRED_NETWORK_START: |
+ ResumeNetworkStart(); |
+ break; |
case DEFERRED_REDIRECT: |
ResumeRedirect(); |
break; |
@@ -160,6 +188,20 @@ void ThrottlingResourceHandler::ResumeStart() { |
} |
} |
+void ThrottlingResourceHandler::ResumeNetworkStart() { |
+ DCHECK(!cancelled_by_resource_throttle_); |
+ |
+ GURL url = deferred_url_; |
+ deferred_url_ = GURL(); |
+ |
+ bool defer = false; |
+ if (!OnBeforeNetworkStart(GetRequestID(), url, &defer)) { |
+ controller()->Cancel(); |
+ } else if (!defer) { |
+ controller()->Resume(); |
+ } |
+} |
+ |
void ThrottlingResourceHandler::ResumeRedirect() { |
DCHECK(!cancelled_by_resource_throttle_); |