Index: content/browser/frame_host/navigation_handle_impl.cc |
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc |
index 8904071971d98abe681d66e45323855444bb4f87..95ae0ff5bcd3b5855c8025ee114b5e8c204d4423 100644 |
--- a/content/browser/frame_host/navigation_handle_impl.cc |
+++ b/content/browser/frame_host/navigation_handle_impl.cc |
@@ -280,6 +280,27 @@ void NavigationHandleImpl::WillRedirectRequest( |
RunCompleteCallback(result); |
} |
+void NavigationHandleImpl::WillProcessResponse( |
+ RenderFrameHostImpl* render_frame_host, |
+ scoped_refptr<net::HttpResponseHeaders> response_headers, |
+ const ThrottleChecksFinishedCallback& callback) { |
+ DCHECK(!render_frame_host_ || render_frame_host_ == render_frame_host); |
+ render_frame_host_ = render_frame_host; |
+ response_headers_ = response_headers; |
+ state_ = READY_TO_COMMIT; |
+ |
+ NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse(); |
+ |
+ if (result != NavigationThrottle::PROCEED) { |
+ DCHECK(result == NavigationThrottle::CANCEL || |
+ result == NavigationThrottle::CANCEL_AND_IGNORE); |
+ complete_callback_ = callback; |
+ RunCompleteCallback(result); |
+ } else { |
+ ReadyToCommitNavigation(render_frame_host, response_headers); |
Mike West
2015/12/17 13:09:15
This feels a bit hacky. I'd appreciate suggestions
|
+ } |
+} |
+ |
void NavigationHandleImpl::DidRedirectNavigation(const GURL& new_url) { |
url_ = new_url; |
GetDelegate()->DidRedirectNavigation(this); |
@@ -372,6 +393,31 @@ NavigationHandleImpl::CheckWillRedirectRequest() { |
return NavigationThrottle::PROCEED; |
} |
+NavigationThrottle::ThrottleCheckResult |
+NavigationHandleImpl::CheckWillProcessResponse() { |
+ DCHECK(state_ == READY_TO_COMMIT); |
+ for (size_t i = next_index_; i < throttles_.size(); ++i) { |
+ NavigationThrottle::ThrottleCheckResult result = |
+ throttles_[i]->WillProcessResponse(); |
+ switch (result) { |
+ case NavigationThrottle::PROCEED: |
+ continue; |
+ |
+ case NavigationThrottle::CANCEL: |
+ case NavigationThrottle::CANCEL_AND_IGNORE: |
+ state_ = CANCELING; |
+ return result; |
+ |
+ case NavigationThrottle::DEFER: |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+ next_index_ = 0; |
+ state_ = READY_TO_COMMIT; |
+ return NavigationThrottle::PROCEED; |
+} |
+ |
void NavigationHandleImpl::RunCompleteCallback( |
NavigationThrottle::ThrottleCheckResult result) { |
DCHECK(result != NavigationThrottle::DEFER); |