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); |