| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <utility> | 5 #include <utility> |
| 6 | 6 |
| 7 #include "base/base_switches.h" | 7 #include "base/base_switches.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/bind_helpers.h" | 9 #include "base/bind_helpers.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 bool seen_; | 147 bool seen_; |
| 148 }; | 148 }; |
| 149 | 149 |
| 150 namespace AuthState { | 150 namespace AuthState { |
| 151 | 151 |
| 152 enum AuthStateFlags { | 152 enum AuthStateFlags { |
| 153 NONE = 0, | 153 NONE = 0, |
| 154 DISPLAYED_INSECURE_CONTENT = 1 << 0, | 154 DISPLAYED_INSECURE_CONTENT = 1 << 0, |
| 155 RAN_INSECURE_CONTENT = 1 << 1, | 155 RAN_INSECURE_CONTENT = 1 << 1, |
| 156 SHOWING_INTERSTITIAL = 1 << 2, | 156 SHOWING_INTERSTITIAL = 1 << 2, |
| 157 SHOWING_ERROR = 1 << 3, | 157 SHOWING_ERROR = 1 << 3 |
| 158 // Useful when a favicon load may or may not have finished loading, to avoid | |
| 159 // checking if a page displayed insecure content. | |
| 160 // TODO(estark): remove this once http://crbug.com/634171 is fixed. | |
| 161 DONT_CHECK_DISPLAYED_INSECURE_CONTENT = 1 << 4, | |
| 162 }; | 158 }; |
| 163 | 159 |
| 164 void Check(const NavigationEntry& entry, int expected_authentication_state) { | 160 void Check(const NavigationEntry& entry, int expected_authentication_state) { |
| 165 if (expected_authentication_state == AuthState::SHOWING_ERROR) { | 161 if (expected_authentication_state == AuthState::SHOWING_ERROR) { |
| 166 EXPECT_EQ(content::PAGE_TYPE_ERROR, entry.GetPageType()); | 162 EXPECT_EQ(content::PAGE_TYPE_ERROR, entry.GetPageType()); |
| 167 } else { | 163 } else { |
| 168 EXPECT_EQ( | 164 EXPECT_EQ( |
| 169 !!(expected_authentication_state & AuthState::SHOWING_INTERSTITIAL) | 165 !!(expected_authentication_state & AuthState::SHOWING_INTERSTITIAL) |
| 170 ? content::PAGE_TYPE_INTERSTITIAL | 166 ? content::PAGE_TYPE_INTERSTITIAL |
| 171 : content::PAGE_TYPE_NORMAL, | 167 : content::PAGE_TYPE_NORMAL, |
| 172 entry.GetPageType()); | 168 entry.GetPageType()); |
| 173 } | 169 } |
| 174 | 170 |
| 175 if (!(expected_authentication_state & | 171 bool displayed_insecure_content = |
| 176 AuthState::DONT_CHECK_DISPLAYED_INSECURE_CONTENT)) { | 172 !!(entry.GetSSL().content_status & SSLStatus::DISPLAYED_INSECURE_CONTENT); |
| 177 bool displayed_insecure_content = | 173 EXPECT_EQ( |
| 178 !!(entry.GetSSL().content_status & | 174 !!(expected_authentication_state & AuthState::DISPLAYED_INSECURE_CONTENT), |
| 179 SSLStatus::DISPLAYED_INSECURE_CONTENT); | 175 displayed_insecure_content); |
| 180 EXPECT_EQ( | |
| 181 !!(expected_authentication_state & | |
| 182 AuthState::DISPLAYED_INSECURE_CONTENT), | |
| 183 displayed_insecure_content); | |
| 184 } | |
| 185 | 176 |
| 186 bool ran_insecure_content = | 177 bool ran_insecure_content = |
| 187 !!(entry.GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT); | 178 !!(entry.GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT); |
| 188 EXPECT_EQ(!!(expected_authentication_state & AuthState::RAN_INSECURE_CONTENT), | 179 EXPECT_EQ(!!(expected_authentication_state & AuthState::RAN_INSECURE_CONTENT), |
| 189 ran_insecure_content); | 180 ran_insecure_content); |
| 190 } | 181 } |
| 191 | 182 |
| 192 } // namespace AuthState | 183 } // namespace AuthState |
| 193 | 184 |
| 194 namespace SecurityStyle { | 185 namespace SecurityStyle { |
| (...skipping 1629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1824 | 1815 |
| 1825 // Now try again the broken one to make sure it is still broken. | 1816 // Now try again the broken one to make sure it is still broken. |
| 1826 ui_test_utils::NavigateToURL( | 1817 ui_test_utils::NavigateToURL( |
| 1827 browser(), https_server_mismatched_.GetURL("/ssl/google.html")); | 1818 browser(), https_server_mismatched_.GetURL("/ssl/google.html")); |
| 1828 | 1819 |
| 1829 // Since we OKed the interstitial last time, we get right to the page. | 1820 // Since we OKed the interstitial last time, we get right to the page. |
| 1830 CheckAuthenticationBrokenState( | 1821 CheckAuthenticationBrokenState( |
| 1831 tab, net::CERT_STATUS_COMMON_NAME_INVALID, AuthState::NONE); | 1822 tab, net::CERT_STATUS_COMMON_NAME_INVALID, AuthState::NONE); |
| 1832 } | 1823 } |
| 1833 | 1824 |
| 1825 #if defined(OS_CHROMEOS) |
| 1826 // This test seems to be flaky and hang on chromiumos. |
| 1827 // http://crbug.com/84419 |
| 1828 #define MAYBE_TestRefNavigation DISABLED_TestRefNavigation |
| 1829 #else |
| 1830 #define MAYBE_TestRefNavigation TestRefNavigation |
| 1831 #endif |
| 1832 |
| 1834 // Test that navigating to a #ref does not change a bad security state. | 1833 // Test that navigating to a #ref does not change a bad security state. |
| 1835 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) { | 1834 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) { |
| 1836 ASSERT_TRUE(https_server_expired_.Start()); | 1835 ASSERT_TRUE(https_server_expired_.Start()); |
| 1837 | 1836 |
| 1838 ui_test_utils::NavigateToURL( | 1837 ui_test_utils::NavigateToURL( |
| 1839 browser(), https_server_expired_.GetURL("/ssl/page_with_refs.html")); | 1838 browser(), https_server_expired_.GetURL("/ssl/page_with_refs.html")); |
| 1840 | 1839 |
| 1841 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); | 1840 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 1842 CheckAuthenticationBrokenState( | 1841 CheckAuthenticationBrokenState( |
| 1843 tab, net::CERT_STATUS_DATE_INVALID, AuthState::SHOWING_INTERSTITIAL); | 1842 tab, net::CERT_STATUS_DATE_INVALID, AuthState::SHOWING_INTERSTITIAL); |
| 1844 | 1843 |
| 1845 ProceedThroughInterstitial(tab); | 1844 ProceedThroughInterstitial(tab); |
| 1846 | 1845 |
| 1847 CheckAuthenticationBrokenState( | 1846 CheckAuthenticationBrokenState( |
| 1848 tab, net::CERT_STATUS_DATE_INVALID, AuthState::NONE); | 1847 tab, net::CERT_STATUS_DATE_INVALID, AuthState::NONE); |
| 1849 // Now navigate to a ref in the page, the security state should not have | 1848 // Now navigate to a ref in the page, the security state should not have |
| 1850 // changed. | 1849 // changed. |
| 1851 ui_test_utils::NavigateToURL( | 1850 ui_test_utils::NavigateToURL( |
| 1852 browser(), https_server_expired_.GetURL("/ssl/page_with_refs.html#jp")); | 1851 browser(), https_server_expired_.GetURL("/ssl/page_with_refs.html#jp")); |
| 1853 | 1852 |
| 1854 CheckAuthenticationBrokenState( | 1853 CheckAuthenticationBrokenState( |
| 1855 tab, net::CERT_STATUS_DATE_INVALID, | 1854 tab, net::CERT_STATUS_DATE_INVALID, AuthState::NONE); |
| 1856 AuthState::DONT_CHECK_DISPLAYED_INSECURE_CONTENT); | |
| 1857 } | 1855 } |
| 1858 | 1856 |
| 1859 // Tests that closing a page that opened a pop-up with an interstitial does not | 1857 // Tests that closing a page that opened a pop-up with an interstitial does not |
| 1860 // crash the browser (crbug.com/1966). | 1858 // crash the browser (crbug.com/1966). |
| 1861 IN_PROC_BROWSER_TEST_F(SSLUITest, TestCloseTabWithUnsafePopup) { | 1859 IN_PROC_BROWSER_TEST_F(SSLUITest, TestCloseTabWithUnsafePopup) { |
| 1862 ASSERT_TRUE(embedded_test_server()->Start()); | 1860 ASSERT_TRUE(embedded_test_server()->Start()); |
| 1863 ASSERT_TRUE(https_server_expired_.Start()); | 1861 ASSERT_TRUE(https_server_expired_.Start()); |
| 1864 | 1862 |
| 1865 // Enable popups without user gesture. | 1863 // Enable popups without user gesture. |
| 1866 HostContentSettingsMapFactory::GetForProfile(browser()->profile()) | 1864 HostContentSettingsMapFactory::GetForProfile(browser()->profile()) |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2164 content::Source<NavigationController>(&tab->GetController())); | 2162 content::Source<NavigationController>(&tab->GetController())); |
| 2165 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 2163 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 2166 tab, | 2164 tab, |
| 2167 "window.domAutomationController.send(clickLink('goodHTTPSLink'));", | 2165 "window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
| 2168 &success)); | 2166 &success)); |
| 2169 ASSERT_TRUE(success); | 2167 ASSERT_TRUE(success); |
| 2170 observer.Wait(); | 2168 observer.Wait(); |
| 2171 | 2169 |
| 2172 // We should still be authentication broken. | 2170 // We should still be authentication broken. |
| 2173 CheckAuthenticationBrokenState( | 2171 CheckAuthenticationBrokenState( |
| 2174 tab, net::CERT_STATUS_DATE_INVALID, | 2172 tab, net::CERT_STATUS_DATE_INVALID, AuthState::NONE); |
| 2175 AuthState::DONT_CHECK_DISPLAYED_INSECURE_CONTENT); | |
| 2176 } | 2173 } |
| 2177 | 2174 |
| 2178 // From an HTTP top frame, navigate to good and bad HTTPS (security state should | 2175 // From an HTTP top frame, navigate to good and bad HTTPS (security state should |
| 2179 // stay unauthenticated). | 2176 // stay unauthenticated). |
| 2180 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnauthenticatedFrameNavigation) { | 2177 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnauthenticatedFrameNavigation) { |
| 2181 ASSERT_TRUE(embedded_test_server()->Start()); | 2178 ASSERT_TRUE(embedded_test_server()->Start()); |
| 2182 ASSERT_TRUE(https_server_.Start()); | 2179 ASSERT_TRUE(https_server_.Start()); |
| 2183 ASSERT_TRUE(https_server_expired_.Start()); | 2180 ASSERT_TRUE(https_server_expired_.Start()); |
| 2184 | 2181 |
| 2185 std::string top_frame_path; | 2182 std::string top_frame_path; |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2280 | 2277 |
| 2281 // Navigate to safe page that has Worker loading unsafe content. | 2278 // Navigate to safe page that has Worker loading unsafe content. |
| 2282 // Expect content to load but be marked as auth broken due to running insecure | 2279 // Expect content to load but be marked as auth broken due to running insecure |
| 2283 // content. | 2280 // content. |
| 2284 std::string page_with_unsafe_worker_path; | 2281 std::string page_with_unsafe_worker_path; |
| 2285 GetPageWithUnsafeWorkerPath(https_server_mismatched_, | 2282 GetPageWithUnsafeWorkerPath(https_server_mismatched_, |
| 2286 &page_with_unsafe_worker_path); | 2283 &page_with_unsafe_worker_path); |
| 2287 ui_test_utils::NavigateToURL( | 2284 ui_test_utils::NavigateToURL( |
| 2288 browser(), https_server_.GetURL(page_with_unsafe_worker_path)); | 2285 browser(), https_server_.GetURL(page_with_unsafe_worker_path)); |
| 2289 CheckWorkerLoadResult(tab, true); // Worker loads insecure content | 2286 CheckWorkerLoadResult(tab, true); // Worker loads insecure content |
| 2290 CheckAuthenticationBrokenState( | 2287 CheckAuthenticationBrokenState(tab, CertError::NONE, |
| 2291 tab, CertError::NONE, | 2288 AuthState::RAN_INSECURE_CONTENT); |
| 2292 AuthState::RAN_INSECURE_CONTENT | | |
| 2293 AuthState::DONT_CHECK_DISPLAYED_INSECURE_CONTENT); | |
| 2294 } | 2289 } |
| 2295 | 2290 |
| 2296 // Visits a page with unsafe content and makes sure that if a user exception to | 2291 // Visits a page with unsafe content and makes sure that if a user exception to |
| 2297 // the certificate error is present, the image is loaded and script executes. | 2292 // the certificate error is present, the image is loaded and script executes. |
| 2298 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsWithUserException) { | 2293 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsWithUserException) { |
| 2299 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); | 2294 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 2300 ASSERT_NO_FATAL_FAILURE(SetUpUnsafeContentsWithUserException( | 2295 ASSERT_NO_FATAL_FAILURE(SetUpUnsafeContentsWithUserException( |
| 2301 "/ssl/page_with_unsafe_contents.html")); | 2296 "/ssl/page_with_unsafe_contents.html")); |
| 2302 CheckAuthenticationBrokenState( | 2297 CheckAuthenticationBrokenState( |
| 2303 tab, CertError::NONE, | 2298 tab, CertError::NONE, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2322 std::string replacement_path; | 2317 std::string replacement_path; |
| 2323 GetFilePathWithHostAndPortReplacement( | 2318 GetFilePathWithHostAndPortReplacement( |
| 2324 "/ssl/page_with_unsafe_contents.html", | 2319 "/ssl/page_with_unsafe_contents.html", |
| 2325 https_server_mismatched_.host_port_pair(), &replacement_path); | 2320 https_server_mismatched_.host_port_pair(), &replacement_path); |
| 2326 ui_test_utils::NavigateToURL( | 2321 ui_test_utils::NavigateToURL( |
| 2327 browser(), https_server_mismatched_.GetURL(replacement_path)); | 2322 browser(), https_server_mismatched_.GetURL(replacement_path)); |
| 2328 js_result = false; | 2323 js_result = false; |
| 2329 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 2324 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 2330 tab, "window.domAutomationController.send(IsFooSet());", &js_result)); | 2325 tab, "window.domAutomationController.send(IsFooSet());", &js_result)); |
| 2331 EXPECT_TRUE(js_result); | 2326 EXPECT_TRUE(js_result); |
| 2332 CheckAuthenticationBrokenState( | 2327 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, |
| 2333 tab, net::CERT_STATUS_COMMON_NAME_INVALID, | 2328 AuthState::NONE); |
| 2334 AuthState::DONT_CHECK_DISPLAYED_INSECURE_CONTENT); | |
| 2335 } | 2329 } |
| 2336 | 2330 |
| 2337 // Like the test above, but only displaying inactive content (an image). | 2331 // Like the test above, but only displaying inactive content (an image). |
| 2338 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeImageWithUserException) { | 2332 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeImageWithUserException) { |
| 2339 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); | 2333 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); |
| 2340 ASSERT_NO_FATAL_FAILURE( | 2334 ASSERT_NO_FATAL_FAILURE( |
| 2341 SetUpUnsafeContentsWithUserException("/ssl/page_with_unsafe_image.html")); | 2335 SetUpUnsafeContentsWithUserException("/ssl/page_with_unsafe_image.html")); |
| 2342 CheckAuthenticatedState(tab, AuthState::DISPLAYED_INSECURE_CONTENT); | 2336 CheckAuthenticatedState(tab, AuthState::DISPLAYED_INSECURE_CONTENT); |
| 2343 | 2337 |
| 2344 int img_width; | 2338 int img_width; |
| (...skipping 658 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3003 | 2997 |
| 3004 // Visit a page over https that contains a frame with a redirect. | 2998 // Visit a page over https that contains a frame with a redirect. |
| 3005 | 2999 |
| 3006 // XMLHttpRequest insecure content in synchronous mode. | 3000 // XMLHttpRequest insecure content in synchronous mode. |
| 3007 | 3001 |
| 3008 // XMLHttpRequest insecure content in asynchronous mode. | 3002 // XMLHttpRequest insecure content in asynchronous mode. |
| 3009 | 3003 |
| 3010 // XMLHttpRequest over bad ssl in synchronous mode. | 3004 // XMLHttpRequest over bad ssl in synchronous mode. |
| 3011 | 3005 |
| 3012 // XMLHttpRequest over OK ssl in synchronous mode. | 3006 // XMLHttpRequest over OK ssl in synchronous mode. |
| OLD | NEW |