OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/memory/weak_ptr.h" | 5 #include "base/memory/weak_ptr.h" |
6 #include "content/browser/frame_host/navigation_handle_impl.h" | 6 #include "content/browser/frame_host/navigation_handle_impl.h" |
7 #include "content/browser/web_contents/web_contents_impl.h" | 7 #include "content/browser/web_contents/web_contents_impl.h" |
8 #include "content/public/browser/web_contents.h" | 8 #include "content/public/browser/web_contents.h" |
9 #include "content/public/browser/web_contents_observer.h" | 9 #include "content/public/browser/web_contents_observer.h" |
10 #include "content/public/common/request_context_type.h" | 10 #include "content/public/common/request_context_type.h" |
(...skipping 22 matching lines...) Expand all Loading... |
33 handle_(nullptr), | 33 handle_(nullptr), |
34 has_committed_(false), | 34 has_committed_(false), |
35 is_error_(false), | 35 is_error_(false), |
36 is_main_frame_(false), | 36 is_main_frame_(false), |
37 is_parent_main_frame_(false), | 37 is_parent_main_frame_(false), |
38 is_renderer_initiated_(true), | 38 is_renderer_initiated_(true), |
39 is_same_page_(false), | 39 is_same_page_(false), |
40 was_redirected_(false), | 40 was_redirected_(false), |
41 frame_tree_node_id_(-1), | 41 frame_tree_node_id_(-1), |
42 page_transition_(ui::PAGE_TRANSITION_LINK), | 42 page_transition_(ui::PAGE_TRANSITION_LINK), |
43 expected_start_url_(expected_start_url) {} | 43 expected_start_url_(expected_start_url), |
| 44 net_error_code_(net::OK) {} |
44 | 45 |
45 void DidStartNavigation(NavigationHandle* navigation_handle) override { | 46 void DidStartNavigation(NavigationHandle* navigation_handle) override { |
46 if (handle_ || navigation_handle->GetURL() != expected_start_url_) | 47 if (handle_ || navigation_handle->GetURL() != expected_start_url_) |
47 return; | 48 return; |
48 | 49 |
49 handle_ = navigation_handle; | 50 handle_ = navigation_handle; |
50 has_committed_ = false; | 51 has_committed_ = false; |
51 is_error_ = false; | 52 is_error_ = false; |
52 page_transition_ = ui::PAGE_TRANSITION_LINK; | 53 page_transition_ = ui::PAGE_TRANSITION_LINK; |
53 last_committed_url_ = GURL(); | 54 last_committed_url_ = GURL(); |
(...skipping 10 matching lines...) Expand all Loading... |
64 if (navigation_handle != handle_) | 65 if (navigation_handle != handle_) |
65 return; | 66 return; |
66 | 67 |
67 DCHECK_EQ(is_main_frame_, navigation_handle->IsInMainFrame()); | 68 DCHECK_EQ(is_main_frame_, navigation_handle->IsInMainFrame()); |
68 DCHECK_EQ(is_parent_main_frame_, navigation_handle->IsParentMainFrame()); | 69 DCHECK_EQ(is_parent_main_frame_, navigation_handle->IsParentMainFrame()); |
69 DCHECK_EQ(is_same_page_, navigation_handle->IsSamePage()); | 70 DCHECK_EQ(is_same_page_, navigation_handle->IsSamePage()); |
70 DCHECK_EQ(is_renderer_initiated_, navigation_handle->IsRendererInitiated()); | 71 DCHECK_EQ(is_renderer_initiated_, navigation_handle->IsRendererInitiated()); |
71 DCHECK_EQ(frame_tree_node_id_, navigation_handle->GetFrameTreeNodeId()); | 72 DCHECK_EQ(frame_tree_node_id_, navigation_handle->GetFrameTreeNodeId()); |
72 | 73 |
73 was_redirected_ = navigation_handle->WasServerRedirect(); | 74 was_redirected_ = navigation_handle->WasServerRedirect(); |
| 75 net_error_code_ = navigation_handle->GetNetErrorCode(); |
74 | 76 |
75 if (navigation_handle->HasCommitted()) { | 77 if (navigation_handle->HasCommitted()) { |
76 has_committed_ = true; | 78 has_committed_ = true; |
77 if (!navigation_handle->IsErrorPage()) { | 79 if (!navigation_handle->IsErrorPage()) { |
78 page_transition_ = navigation_handle->GetPageTransition(); | 80 page_transition_ = navigation_handle->GetPageTransition(); |
79 last_committed_url_ = navigation_handle->GetURL(); | 81 last_committed_url_ = navigation_handle->GetURL(); |
80 } else { | 82 } else { |
81 is_error_ = true; | 83 is_error_ = true; |
82 } | 84 } |
83 } else { | 85 } else { |
(...skipping 10 matching lines...) Expand all Loading... |
94 bool is_parent_main_frame() { return is_parent_main_frame_; } | 96 bool is_parent_main_frame() { return is_parent_main_frame_; } |
95 bool is_renderer_initiated() { return is_renderer_initiated_; } | 97 bool is_renderer_initiated() { return is_renderer_initiated_; } |
96 bool is_same_page() { return is_same_page_; } | 98 bool is_same_page() { return is_same_page_; } |
97 bool was_redirected() { return was_redirected_; } | 99 bool was_redirected() { return was_redirected_; } |
98 int frame_tree_node_id() { return frame_tree_node_id_; } | 100 int frame_tree_node_id() { return frame_tree_node_id_; } |
99 | 101 |
100 const GURL& last_committed_url() { return last_committed_url_; } | 102 const GURL& last_committed_url() { return last_committed_url_; } |
101 | 103 |
102 ui::PageTransition page_transition() { return page_transition_; } | 104 ui::PageTransition page_transition() { return page_transition_; } |
103 | 105 |
| 106 net::Error net_error_code() { return net_error_code_; } |
| 107 |
104 private: | 108 private: |
105 // A reference to the NavigationHandle so this class will track only | 109 // A reference to the NavigationHandle so this class will track only |
106 // one navigation at a time. It is set at DidStartNavigation and cleared | 110 // one navigation at a time. It is set at DidStartNavigation and cleared |
107 // at DidFinishNavigation before the NavigationHandle is destroyed. | 111 // at DidFinishNavigation before the NavigationHandle is destroyed. |
108 NavigationHandle* handle_; | 112 NavigationHandle* handle_; |
109 bool has_committed_; | 113 bool has_committed_; |
110 bool is_error_; | 114 bool is_error_; |
111 bool is_main_frame_; | 115 bool is_main_frame_; |
112 bool is_parent_main_frame_; | 116 bool is_parent_main_frame_; |
113 bool is_renderer_initiated_; | 117 bool is_renderer_initiated_; |
114 bool is_same_page_; | 118 bool is_same_page_; |
115 bool was_redirected_; | 119 bool was_redirected_; |
116 int frame_tree_node_id_; | 120 int frame_tree_node_id_; |
117 ui::PageTransition page_transition_; | 121 ui::PageTransition page_transition_; |
118 GURL expected_start_url_; | 122 GURL expected_start_url_; |
119 GURL last_committed_url_; | 123 GURL last_committed_url_; |
| 124 net::Error net_error_code_; |
120 }; | 125 }; |
121 | 126 |
122 // A test NavigationThrottle that will return pre-determined checks and run | 127 // A test NavigationThrottle that will return pre-determined checks and run |
123 // callbacks when the various NavigationThrottle methods are called. It is | 128 // callbacks when the various NavigationThrottle methods are called. It is |
124 // not instantiated directly but through a TestNavigationThrottleInstaller. | 129 // not instantiated directly but through a TestNavigationThrottleInstaller. |
125 class TestNavigationThrottle : public NavigationThrottle { | 130 class TestNavigationThrottle : public NavigationThrottle { |
126 public: | 131 public: |
127 TestNavigationThrottle( | 132 TestNavigationThrottle( |
128 NavigationHandle* handle, | 133 NavigationHandle* handle, |
129 NavigationThrottle::ThrottleCheckResult will_start_result, | 134 NavigationThrottle::ThrottleCheckResult will_start_result, |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 EXPECT_EQ(post_url, url_recorder.urls().back()); | 845 EXPECT_EQ(post_url, url_recorder.urls().back()); |
841 EXPECT_EQ(2ul, url_recorder.urls().size()); | 846 EXPECT_EQ(2ul, url_recorder.urls().size()); |
842 EXPECT_EQ(REQUEST_CONTEXT_TYPE_FORM, | 847 EXPECT_EQ(REQUEST_CONTEXT_TYPE_FORM, |
843 installer.navigation_throttle()->request_context_type()); | 848 installer.navigation_throttle()->request_context_type()); |
844 | 849 |
845 // Finishes the last navigation. | 850 // Finishes the last navigation. |
846 post_manager.WaitForNavigationFinished(); | 851 post_manager.WaitForNavigationFinished(); |
847 EXPECT_FALSE(installer.navigation_throttle()); | 852 EXPECT_FALSE(installer.navigation_throttle()); |
848 } | 853 } |
849 | 854 |
| 855 // Checks that the error code is properly set on the NavigationHandle when a |
| 856 // NavigationThrottle cancels. |
| 857 IN_PROC_BROWSER_TEST_F(NavigationHandleImplBrowserTest, |
| 858 ErrorCodeOnThrottleCancelNavigation) { |
| 859 const GURL kUrl = embedded_test_server()->GetURL("/title1.html"); |
| 860 const GURL kRedirectingUrl = |
| 861 embedded_test_server()->GetURL("/server-redirect?" + kUrl.spec()); |
| 862 |
| 863 { |
| 864 // Set up a NavigationThrottle that will cancel the navigation in |
| 865 // WillStartRequest. |
| 866 TestNavigationThrottleInstaller installer( |
| 867 shell()->web_contents(), NavigationThrottle::CANCEL_AND_IGNORE, |
| 868 NavigationThrottle::PROCEED, NavigationThrottle::PROCEED); |
| 869 NavigationHandleObserver observer(shell()->web_contents(), kUrl); |
| 870 |
| 871 // Try to navigate to the url. The navigation should be canceled and the |
| 872 // NavigationHandle should have the right error code. |
| 873 EXPECT_FALSE(NavigateToURL(shell(), kUrl)); |
| 874 EXPECT_EQ(net::ERR_ABORTED, observer.net_error_code()); |
| 875 } |
| 876 |
| 877 { |
| 878 // Set up a NavigationThrottle that will cancel the navigation in |
| 879 // WillRedirectRequest. |
| 880 TestNavigationThrottleInstaller installer( |
| 881 shell()->web_contents(), NavigationThrottle::PROCEED, |
| 882 NavigationThrottle::CANCEL_AND_IGNORE, NavigationThrottle::PROCEED); |
| 883 NavigationHandleObserver observer(shell()->web_contents(), kRedirectingUrl); |
| 884 |
| 885 // Try to navigate to the url. The navigation should be canceled and the |
| 886 // NavigationHandle should have the right error code. |
| 887 EXPECT_FALSE(NavigateToURL(shell(), kRedirectingUrl)); |
| 888 EXPECT_EQ(net::ERR_ABORTED, observer.net_error_code()); |
| 889 } |
| 890 |
| 891 { |
| 892 // Set up a NavigationThrottle that will cancel the navigation in |
| 893 // WillProcessResponse. |
| 894 TestNavigationThrottleInstaller installer( |
| 895 shell()->web_contents(), NavigationThrottle::PROCEED, |
| 896 NavigationThrottle::PROCEED, NavigationThrottle::CANCEL_AND_IGNORE); |
| 897 NavigationHandleObserver observer(shell()->web_contents(), kUrl); |
| 898 |
| 899 // Try to navigate to the url. The navigation should be canceled and the |
| 900 // NavigationHandle should have the right error code. |
| 901 EXPECT_FALSE(NavigateToURL(shell(), kUrl)); |
| 902 EXPECT_EQ(net::ERR_ABORTED, observer.net_error_code()); |
| 903 } |
| 904 |
| 905 { |
| 906 // Set up a NavigationThrottle that will block the navigation in |
| 907 // WillStartRequest. |
| 908 TestNavigationThrottleInstaller installer( |
| 909 shell()->web_contents(), NavigationThrottle::BLOCK_REQUEST, |
| 910 NavigationThrottle::PROCEED, NavigationThrottle::PROCEED); |
| 911 NavigationHandleObserver observer(shell()->web_contents(), kUrl); |
| 912 |
| 913 // Try to navigate to the url. The navigation should be canceled and the |
| 914 // NavigationHandle should have the right error code. |
| 915 EXPECT_FALSE(NavigateToURL(shell(), kUrl)); |
| 916 EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, observer.net_error_code()); |
| 917 } |
| 918 } |
| 919 |
850 // Specialized test that verifies the NavigationHandle gets the HTTPS upgraded | 920 // Specialized test that verifies the NavigationHandle gets the HTTPS upgraded |
851 // URL from the very beginning of the navigation. | 921 // URL from the very beginning of the navigation. |
852 class NavigationHandleImplHttpsUpgradeBrowserTest | 922 class NavigationHandleImplHttpsUpgradeBrowserTest |
853 : public NavigationHandleImplBrowserTest { | 923 : public NavigationHandleImplBrowserTest { |
854 public: | 924 public: |
855 void CheckHttpsUpgradedIframeNavigation(const GURL& start_url, | 925 void CheckHttpsUpgradedIframeNavigation(const GURL& start_url, |
856 const GURL& iframe_secure_url) { | 926 const GURL& iframe_secure_url) { |
857 ASSERT_TRUE(start_url.SchemeIs(url::kHttpScheme)); | 927 ASSERT_TRUE(start_url.SchemeIs(url::kHttpScheme)); |
858 ASSERT_TRUE(iframe_secure_url.SchemeIs(url::kHttpsScheme)); | 928 ASSERT_TRUE(iframe_secure_url.SchemeIs(url::kHttpsScheme)); |
859 | 929 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
904 IN_PROC_BROWSER_TEST_F(NavigationHandleImplHttpsUpgradeBrowserTest, | 974 IN_PROC_BROWSER_TEST_F(NavigationHandleImplHttpsUpgradeBrowserTest, |
905 StartUrlIsHttpsUpgradedCrossSite) { | 975 StartUrlIsHttpsUpgradedCrossSite) { |
906 GURL start_url( | 976 GURL start_url( |
907 embedded_test_server()->GetURL("/https_upgrade_cross_site.html")); | 977 embedded_test_server()->GetURL("/https_upgrade_cross_site.html")); |
908 GURL cross_site_iframe_secure_url("https://other.com/title1.html"); | 978 GURL cross_site_iframe_secure_url("https://other.com/title1.html"); |
909 | 979 |
910 CheckHttpsUpgradedIframeNavigation(start_url, cross_site_iframe_secure_url); | 980 CheckHttpsUpgradedIframeNavigation(start_url, cross_site_iframe_secure_url); |
911 } | 981 } |
912 | 982 |
913 } // namespace content | 983 } // namespace content |
OLD | NEW |