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 f24999058b5f36021c507f91087d45f01b5435a8..6c3e7686203e6686d1b7b5c435afaef3d934be79 100644 |
| --- a/content/browser/frame_host/navigation_handle_impl.cc |
| +++ b/content/browser/frame_host/navigation_handle_impl.cc |
| @@ -5,26 +5,25 @@ |
| #include "content/browser/frame_host/navigation_handle_impl.h" |
| #include "content/browser/frame_host/navigator_delegate.h" |
| +#include "content/public/browser/content_browser_client.h" |
| +#include "content/public/common/content_client.h" |
| #include "net/url_request/redirect_info.h" |
| namespace content { |
| -// static |
| -scoped_ptr<NavigationHandleImpl> NavigationHandleImpl::Create( |
| - const GURL& url, |
| - const bool is_main_frame, |
| - NavigatorDelegate* delegate) { |
| - return scoped_ptr<NavigationHandleImpl>( |
| - new NavigationHandleImpl(url, is_main_frame, delegate)); |
| -} |
| - |
| NavigationHandleImpl::NavigationHandleImpl(const GURL& url, |
| + const GURL& validated_url, |
| const bool is_main_frame, |
| NavigatorDelegate* delegate) |
| : url_(url), |
| + validated_url_(validated_url), |
| + is_main_frame_(is_main_frame), |
| + is_post_(false), |
| + has_user_gesture_(false), |
| + transition_(ui::PAGE_TRANSITION_LINK), |
| + is_external_protocol_(false), |
| net_error_code_(net::OK), |
| state_(DID_START), |
| - is_main_frame_(is_main_frame), |
| is_transferring_(false), |
| delegate_(delegate) { |
| delegate_->DidStartNavigation(this); |
| @@ -38,14 +37,52 @@ const GURL& NavigationHandleImpl::GetURL() const { |
| return url_; |
| } |
| -net::Error NavigationHandleImpl::GetNetErrorCode() const { |
| - return net_error_code_; |
| +const GURL& NavigationHandleImpl::GetValidatedURL() const { |
| + return validated_url_; |
| } |
| bool NavigationHandleImpl::IsInMainFrame() const { |
| return is_main_frame_; |
| } |
| +WebContents* NavigationHandleImpl::GetWebContents() const { |
| + return web_contents_; |
| +} |
| + |
| +bool NavigationHandleImpl::IsPost() const { |
| + CHECK_NE(DID_START, state_) |
| + << "This accessor should not be called before the request is started."; |
| + return is_post_; |
| +} |
| + |
| +const Referrer& NavigationHandleImpl::GetReferrer() const { |
| + CHECK_NE(DID_START, state_) |
| + << "This accessor should not be called before the request is started."; |
| + return sanitized_referrer_; |
| +} |
| + |
| +bool NavigationHandleImpl::HasUserGesture() const { |
| + CHECK_NE(DID_START, state_) |
| + << "This accessor should not be called before the request is started."; |
| + return has_user_gesture_; |
| +} |
| + |
| +ui::PageTransition NavigationHandleImpl::GetPageTransition() const { |
| + CHECK_NE(DID_START, state_) |
| + << "This accessor should not be called before the request is started."; |
| + return transition_; |
| +} |
| + |
| +bool NavigationHandleImpl::IsExternalProtocol() const { |
| + CHECK_NE(DID_START, state_) |
| + << "This accessor should not be called before the request is started."; |
| + return is_external_protocol_; |
| +} |
| + |
| +net::Error NavigationHandleImpl::GetNetErrorCode() const { |
| + return net_error_code_; |
| +} |
| + |
| bool NavigationHandleImpl::HasCommittedDocument() const { |
| return state_ == DID_COMMIT; |
| } |
| @@ -54,6 +91,72 @@ bool NavigationHandleImpl::HasCommittedErrorPage() const { |
| return state_ == DID_COMMIT_ERROR_PAGE; |
| } |
| +void NavigationHandleImpl::RegisterThrottleForTesting( |
| + scoped_ptr<NavigationThrottle> navigation_throttle) { |
| + throttles_.push_back(navigation_throttle.Pass()); |
| +} |
| + |
| +NavigationThrottle::ThrottleCheckResult NavigationHandleImpl::WillStartRequest( |
| + bool is_post, |
| + const Referrer& sanitized_referrer, |
| + bool has_user_gesture, |
| + ui::PageTransition transition, |
| + bool is_external_protocol) { |
| + // Update the navigation parameters. |
| + is_post_ = is_post; |
| + sanitized_referrer_ = sanitized_referrer; |
| + has_user_gesture_ = has_user_gesture; |
| + transition_ = transition; |
| + is_external_protocol_ = is_external_protocol; |
| + |
| + state_ = WILL_SEND_REQUEST; |
| + |
| + // Register the navigation throttles. The scoped_vector returned by |
|
nasko
2015/09/14 22:00:04
nit: s/scoped_vector/ScopedVector/
clamy
2015/09/16 01:03:21
Done.
|
| + // GetNavigationThrottles is not assigned to throttles_ directly because it |
| + // would overwrite any throttle previously added with |
| + // RegisterThrottleForTesting. |
| + ScopedVector<NavigationThrottle> throttles_to_register = |
| + GetContentClient()->browser()->GetNavigationThrottles(this); |
| + if (throttles_to_register.size() > 0) { |
| + throttles_.insert(throttles_.end(), throttles_to_register.begin(), |
| + throttles_to_register.end()); |
| + throttles_to_register.weak_clear(); |
| + } |
| + |
| + // Notify each throttle of the request. |
| + for (NavigationThrottle* throttle : throttles_) { |
| + NavigationThrottle::ThrottleCheckResult result = |
| + throttle->WillStartRequest(); |
| + if (result == NavigationThrottle::CANCEL_AND_IGNORE) |
| + return NavigationThrottle::CANCEL_AND_IGNORE; |
| + } |
| + return NavigationThrottle::PROCEED; |
| +} |
| + |
| +NavigationThrottle::ThrottleCheckResult |
| +NavigationHandleImpl::WillRedirectRequest(const GURL& new_url, |
| + const GURL& new_validated_url, |
| + bool new_method_is_post, |
| + const GURL& new_referrer_url, |
| + bool new_is_external_protocol) { |
| + // Update the navigation parameters. |
| + url_ = new_url; |
| + validated_url_ = new_validated_url; |
| + is_post_ = new_method_is_post; |
| + sanitized_referrer_.url = new_referrer_url; |
| + sanitized_referrer_ = Referrer::SanitizeForRequest(url_, sanitized_referrer_); |
| + is_external_protocol_ = new_is_external_protocol; |
| + |
| + // Have each throttle be notified of the request. |
| + for (NavigationThrottle* throttle : throttles_) { |
| + NavigationThrottle::ThrottleCheckResult result = |
| + throttle->WillRedirectRequest(); |
| + if (result == NavigationThrottle::CANCEL_AND_IGNORE) |
| + return NavigationThrottle::CANCEL_AND_IGNORE; |
| + } |
| + return NavigationThrottle::PROCEED; |
| +} |
| + |
| void NavigationHandleImpl::DidRedirectNavigation(const GURL& new_url) { |
| url_ = new_url; |
| delegate_->DidRedirectNavigation(this); |