Chromium Code Reviews| 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 743d2ead8e6d5ef85eb18bf6f1012a3839890b4d..4b6bab183ca3b7de89de412800cc1e5071c239a5 100644 |
| --- a/content/browser/frame_host/navigation_handle_impl.cc |
| +++ b/content/browser/frame_host/navigation_handle_impl.cc |
| @@ -9,6 +9,7 @@ |
| #include "content/browser/frame_host/frame_tree_node.h" |
| #include "content/browser/frame_host/navigator.h" |
| #include "content/browser/frame_host/navigator_delegate.h" |
| +#include "content/browser/frame_host/xfo_throttle.h" |
| #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| #include "content/browser/service_worker/service_worker_navigation_handle.h" |
| #include "content/public/browser/content_browser_client.h" |
| @@ -231,10 +232,15 @@ void NavigationHandleImpl::WillStartRequest( |
| state_ = WILL_SEND_REQUEST; |
| complete_callback_ = callback; |
| - // Register the navigation throttles. The ScopedVector returned by |
| - // GetNavigationThrottles is not assigned to throttles_ directly because it |
| - // would overwrite any throttle previously added with |
| - // RegisterThrottleForTesting. |
| + // Register the platform's navigation throttles. |
| + // |
| + // TODO(mkwst): Add support for CSP's 'frame-ancestors'. |
| + if (scoped_ptr<content::NavigationThrottle> xfo_throttle = |
|
nasko
2016/01/20 23:15:06
nit: scoped_ptr on a separate line outside of the
|
| + XFOThrottle::MaybeCreateThrottleFor(this)) { |
| + throttles_.push_back(std::move(xfo_throttle)); |
| + } |
| + |
| + // Register the embedder's navigation throttles. |
| ScopedVector<NavigationThrottle> throttles_to_register = |
| GetContentClient()->browser()->CreateThrottlesForNavigation(this); |
| if (throttles_to_register.size() > 0) { |
| @@ -282,6 +288,24 @@ void NavigationHandleImpl::DidRedirectNavigation(const GURL& new_url) { |
| GetDelegate()->DidRedirectNavigation(this); |
| } |
| +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; |
| + complete_callback_ = callback; |
| + |
| + NavigationThrottle::ThrottleCheckResult result = CheckWillProcessResponse(); |
| + DCHECK(result != NavigationThrottle::DEFER); |
| + // if (result == NavigationThrottle::PROCEED) |
| + // ReadyToCommitNavigation(render_frame_host, response_headers); |
| + |
| + RunCompleteCallback(result); |
| +} |
| + |
| void NavigationHandleImpl::ReadyToCommitNavigation( |
| RenderFrameHostImpl* render_frame_host, |
| scoped_refptr<net::HttpResponseHeaders> response_headers) { |
| @@ -317,6 +341,7 @@ NavigationHandleImpl::CheckWillStartRequest() { |
| case NavigationThrottle::PROCEED: |
| continue; |
| + case NavigationThrottle::BLOCK: |
| case NavigationThrottle::CANCEL: |
| case NavigationThrottle::CANCEL_AND_IGNORE: |
| state_ = CANCELING; |
| @@ -348,6 +373,7 @@ NavigationHandleImpl::CheckWillRedirectRequest() { |
| case NavigationThrottle::PROCEED: |
| continue; |
| + case NavigationThrottle::BLOCK: |
| case NavigationThrottle::CANCEL: |
| case NavigationThrottle::CANCEL_AND_IGNORE: |
| state_ = CANCELING; |
| @@ -367,13 +393,42 @@ 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::BLOCK: |
| + 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); |
| - if (!complete_callback_.is_null()) |
| - complete_callback_.Run(result); |
| - complete_callback_.Reset(); |
| + ThrottleChecksFinishedCallback callback = std::move(complete_callback_); |
| + if (!callback.is_null()) |
| + callback.Run(result); |
| + |
| + // No code after this point, as running the callback might result in the |
| + // destruction of the NavigationHandleImpl. |
| } |
| } // namespace content |