Index: chrome/browser/ssl/ssl_browser_tests.cc |
=================================================================== |
--- chrome/browser/ssl/ssl_browser_tests.cc (revision 14738) |
+++ chrome/browser/ssl/ssl_browser_tests.cc (working copy) |
@@ -2,19 +2,774 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "net/base/ssl_test_util.h" |
- |
+#include "chrome/browser/browser.h" |
+#include "chrome/browser/tab_contents/interstitial_page.h" |
+#include "chrome/browser/tab_contents/navigation_entry.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+#include "chrome/browser/tab_contents/web_contents.h" |
+#include "chrome/common/pref_names.h" |
+#include "chrome/common/pref_service.h" |
#include "chrome/test/in_process_browser_test.h" |
+#include "chrome/test/ui_test_utils.h" |
-namespace { |
+const wchar_t kDocRoot[] = L"chrome/test/data"; |
-const wchar_t* const kDocRoot = L"chrome/test/data"; |
+class SSLUITest : public InProcessBrowserTest { |
+ public: |
+ SSLUITest() { |
+ EnableDOMAutomation(); |
+ } |
-class SSLBrowserTest : public InProcessBrowserTest { |
+ scoped_refptr<HTTPTestServer> PlainServer() { |
+ return HTTPTestServer::CreateServer(kDocRoot, NULL); |
+ } |
+ |
+ scoped_refptr<HTTPSTestServer> GoodCertServer() { |
+ return HTTPSTestServer::CreateGoodServer(kDocRoot); |
+ } |
+ |
+ scoped_refptr<HTTPSTestServer> BadCertServer() { |
+ return HTTPSTestServer::CreateExpiredServer(kDocRoot); |
+ } |
+ |
+ void CheckAuthenticatedState(TabContents* tab, |
+ bool mixed_content, |
+ bool unsafe_content) { |
+ NavigationEntry* entry = tab->controller().GetActiveEntry(); |
+ ASSERT_TRUE(entry); |
+ EXPECT_EQ(NavigationEntry::NORMAL_PAGE, entry->page_type()); |
+ EXPECT_EQ(SECURITY_STYLE_AUTHENTICATED, entry->ssl().security_style()); |
+ EXPECT_EQ(0, entry->ssl().cert_status() & net::CERT_STATUS_ALL_ERRORS); |
+ EXPECT_EQ(mixed_content, entry->ssl().has_mixed_content()); |
+ EXPECT_EQ(unsafe_content, entry->ssl().has_unsafe_content()); |
+ } |
+ |
+ void CheckUnauthenticatedState(TabContents* tab) { |
+ NavigationEntry* entry = tab->controller().GetActiveEntry(); |
+ ASSERT_TRUE(entry); |
+ EXPECT_EQ(NavigationEntry::NORMAL_PAGE, entry->page_type()); |
+ EXPECT_EQ(SECURITY_STYLE_UNAUTHENTICATED, entry->ssl().security_style()); |
+ EXPECT_EQ(0, entry->ssl().cert_status() & net::CERT_STATUS_ALL_ERRORS); |
+ EXPECT_FALSE(entry->ssl().has_mixed_content()); |
+ EXPECT_FALSE(entry->ssl().has_unsafe_content()); |
+ } |
+ |
+ void CheckAuthenticationBrokenState(TabContents* tab, |
+ int error, |
+ bool interstitial) { |
+ NavigationEntry* entry = tab->controller().GetActiveEntry(); |
+ ASSERT_TRUE(entry); |
+ EXPECT_EQ(interstitial ? NavigationEntry::INTERSTITIAL_PAGE : |
+ NavigationEntry::NORMAL_PAGE, |
+ entry->page_type()); |
+ EXPECT_EQ(SECURITY_STYLE_AUTHENTICATION_BROKEN, |
+ entry->ssl().security_style()); |
+ EXPECT_EQ(error, entry->ssl().cert_status() & net::CERT_STATUS_ALL_ERRORS); |
+ EXPECT_FALSE(entry->ssl().has_mixed_content()); |
+ EXPECT_FALSE(entry->ssl().has_unsafe_content()); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(SSLUITest); |
}; |
-} // namespace |
+// Visits a regular page over http. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTP) { |
+ scoped_refptr<HTTPTestServer> server = PlainServer(); |
-// TODO(jcampan): port SSLUITest to SSLBrowserTest. |
-IN_PROC_BROWSER_TEST_F(SSLBrowserTest, TestHTTP) { |
+ ui_test_utils::NavigateToURL(browser(), |
+ server->TestServerPageW(L"files/ssl/google.html")); |
+ |
+ CheckUnauthenticatedState(browser()->GetSelectedTabContents()); |
} |
+ |
+// Visits a page over http which includes broken https resources (status should |
+// be OK). |
+// TODO(jcampan): test that bad HTTPS content is blocked (otherwise we'll give |
+// the secure cookies away!). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPWithBrokenHTTPSResource) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), http_server->TestServerPageW( |
+ L"files/ssl/page_with_unsafe_contents.html")); |
+ |
+ CheckUnauthenticatedState(browser()->GetSelectedTabContents()); |
+} |
+ |
+// Visits a page over OK https: |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestOKHTTPS) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ https_server->TestServerPageW(L"files/ssl/google.html")); |
+ |
+ CheckAuthenticatedState(browser()->GetSelectedTabContents(), |
+ false, false); // No mixed/unsafe content. |
+} |
+ |
+// Visits a page with https error and proceed: |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndProceed) { |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ bad_https_server->TestServerPageW(L"files/ssl/google.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing |
+ |
+ // Proceed through the interstitial. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ false); // No interstitial showing |
+} |
+ |
+// Visits a page with https error and don't proceed (and ensure we can still |
+// navigate at that point): |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndDontProceed) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ // First navigate to an OK page. |
+ ui_test_utils::NavigateToURL(browser(), good_https_server->TestServerPageW( |
+ L"files/ssl/google.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ NavigationEntry* entry = tab->controller().GetActiveEntry(); |
+ ASSERT_TRUE(entry); |
+ |
+ GURL cross_site_url = |
+ bad_https_server->TestServerPageW(L"files/ssl/google.html"); |
+ // Change the host name from 127.0.0.1 to localhost so it triggers a |
+ // cross-site navigation so we can test http://crbug.com/5800 is gone. |
+ ASSERT_EQ("127.0.0.1", cross_site_url.host()); |
+ GURL::Replacements replacements; |
+ std::string new_host("localhost"); |
+ replacements.SetHostStr(new_host); |
+ cross_site_url = cross_site_url.ReplaceComponents(replacements); |
+ |
+ // Now go to a bad HTTPS page. |
+ ui_test_utils::NavigateToURL(browser(), cross_site_url); |
+ |
+ // An interstitial should be showing. |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, |
+ true); // Interstitial showing. |
+ |
+ // Simulate user clicking "Take me back". |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->DontProceed(); |
+ |
+ // We should be back to the original good page. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Try to navigate to a new page. (to make sure bug 5800 is fixed). |
+ ui_test_utils::NavigateToURL(browser(), |
+ http_server->TestServerPageW(L"files/ssl/google.html")); |
+ CheckUnauthenticatedState(tab); |
+} |
+ |
+// |
+// Mixed contents |
+// |
+ |
+// Visits a page with mixed content. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestMixedContents) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ // Load a page with mixed-content, the default behavior is to show the mixed |
+ // content. |
+ ui_test_utils::NavigateToURL(browser(), https_server->TestServerPageW( |
+ L"files/ssl/page_with_mixed_contents.html")); |
+ |
+ CheckAuthenticatedState(browser()->GetSelectedTabContents(), |
+ true /* mixed-content */, false); |
+} |
+ |
+// Visits a page with mixed content. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestMixedContentsFilterAll) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ // Set the "block mixed-content" preference. |
+ browser()->profile()->GetPrefs()->SetInteger(prefs::kMixedContentFiltering, |
+ FilterPolicy::FILTER_ALL); |
+ |
+ // Load a page with mixed-content, the mixed content shouldn't load. |
+ ui_test_utils::NavigateToURL(browser(), https_server->TestServerPageW( |
+ L"files/ssl/page_with_mixed_contents.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ NavigationEntry* entry = tab->controller().GetActiveEntry(); |
+ ASSERT_TRUE(entry); |
+ EXPECT_EQ(NavigationEntry::NORMAL_PAGE, entry->page_type()); |
+ |
+ // The image should be filtered. |
+ int img_width = 0; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( |
+ tab, L"", L"window.domAutomationController.send(ImageWidth());", |
+ &img_width)); |
+ // In order to check that the image was not loaded, we check its width. |
+ // The actual image (Google logo) is 114 pixels wide, we assume the broken |
+ // image is less than 100. |
+ EXPECT_GT(100, img_width); |
+ |
+ // The state should be OK since we are not showing the resource. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // There should be one info-bar to show the mixed-content. |
+ EXPECT_EQ(1, tab->infobar_delegate_count()); |
+ |
+ // Activate the link on the info-bar to show the mixed-content. |
+ InfoBarDelegate* delegate = tab->GetInfoBarDelegateAt(0); |
+ ASSERT_TRUE(delegate->AsConfirmInfoBarDelegate()); |
+ delegate->AsConfirmInfoBarDelegate()->Accept(); |
+ // Showing the mixed-contents triggered a page reload, let's wait for it to |
+ // finish. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ // The image should show now. |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( |
+ tab, L"", L"window.domAutomationController.send(ImageWidth());", |
+ &img_width)); |
+ EXPECT_LT(100, img_width); |
+ |
+ // And our status should be mixed-content. |
+ CheckAuthenticatedState(tab, true /* mixed-content */, false); |
+} |
+ |
+// Visits a page with an http script that tries to suppress our mixed content |
+// warnings by randomize location.hash. |
+// Based on http://crbug.com/8706 |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestMixedContentsRandomizeHash) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), https_server->TestServerPageW( |
+ L"files/ssl/page_with_http_script.html")); |
+ |
+ CheckAuthenticatedState(browser()->GetSelectedTabContents(), |
+ true /* mixed-content */, false); |
+} |
+ |
+// Visits a page with unsafe content and make sure that: |
+// - frames content is replaced with warning |
+// - images and scripts are filtered out entirely |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContents) { |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), good_https_server->TestServerPageW( |
+ L"files/ssl/page_with_unsafe_contents.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ // When the bad content is filtered, the state is expected to be |
+ // authenticated. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Because of cross-frame scripting restrictions, we cannot access the iframe |
+ // content. So to know if the frame was loaded, we just check if a popup was |
+ // opened (the iframe content opens one). |
+ // Note: because of bug 1115868, no constrained window is opened right now. |
+ // Once the bug is fixed, this will do the real check. |
+ EXPECT_EQ(0, tab->constrained_window_count()); |
+ |
+ int img_width; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractInt( |
+ tab, L"", L"window.domAutomationController.send(ImageWidth());", |
+ &img_width)); |
+ // In order to check that the image was not loaded, we check its width. |
+ // The actual image (Google logo) is 114 pixels wide, we assume the broken |
+ // image is less than 100. |
+ EXPECT_GT(100, img_width); |
+ |
+ bool js_result = false; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
+ tab, L"", L"window.domAutomationController.send(IsFooSet());", |
+ &js_result)); |
+ EXPECT_FALSE(js_result); |
+} |
+ |
+// Visits a page with mixed content loaded by JS (after the initial page load). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestMixedContentsLoadedFromJS) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), https_server->TestServerPageW( |
+ L"files/ssl/page_with_dynamic_mixed_contents.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Load the insecure image. |
+ bool js_result = false; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( |
+ tab, L"", L"loadBadImage();", &js_result)); |
+ EXPECT_TRUE(js_result); |
+ |
+ // We should now have mixed-contents. |
+ CheckAuthenticatedState(tab, true /* mixed-content */, false); |
+} |
+ |
+// Visits two pages from the same origin: one with mixed content and one |
+// without. The test checks that we propagate the mixed content state from one |
+// to the other. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestMixedContentsTwoTabs) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ https_server->TestServerPageW(L"files/ssl/blank_page.html")); |
+ |
+ TabContents* tab1 = browser()->GetSelectedTabContents(); |
+ |
+ // This tab should be fine. |
+ CheckAuthenticatedState(tab1, false, false); |
+ |
+ // Create a new tab. |
+ GURL url = |
+ https_server->TestServerPageW(L"files/ssl/page_with_http_script.html"); |
+ TabContents* tab2 = browser()->AddTabWithURL(url, |
+ GURL(), |
+ PageTransition::TYPED, true, 0, |
+ NULL); |
+ ui_test_utils::WaitForNavigation(&(tab2->controller())); |
+ |
+ // The new tab has mixed content. |
+ CheckAuthenticatedState(tab2, true /* mixed-content */, false); |
+ |
+ // Which means the origin for the first tab has also been contaminated with |
+ // mixed content. |
+ CheckAuthenticatedState(tab1, true /* mixed-content */, false); |
+} |
+ |
+// Visits a page with an image over http. Visits another page over https |
+// referencing that same image over http (hoping it is coming from the webcore |
+// memory cache). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestCachedMixedContents) { |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), http_server->TestServerPageW( |
+ L"files/ssl/page_with_mixed_contents.html")); |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckUnauthenticatedState(tab); |
+ |
+ // Load again but over SSL. It should have mixed-contents (even though the |
+ // image comes from the WebCore memory cache). |
+ ui_test_utils::NavigateToURL(browser(), https_server->TestServerPageW( |
+ L"files/ssl/page_with_mixed_contents.html")); |
+ CheckAuthenticatedState(tab, true /* mixed-content */, false); |
+} |
+ |
+// This test ensures the CN invalid status does not 'stick' to a certificate |
+// (see bug #1044942) and that it depends on the host-name. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestCNInvalidStickiness) { |
+ const std::string kLocalHost = "localhost"; |
+ scoped_refptr<HTTPSTestServer> https_server = |
+ HTTPSTestServer::CreateMismatchedServer(kDocRoot); |
+ ASSERT_TRUE(NULL != https_server.get()); |
+ |
+ // First we hit the server with hostname, this generates an invalid policy |
+ // error. |
+ ui_test_utils::NavigateToURL(browser(), |
+ https_server->TestServerPageW(L"files/ssl/google.html")); |
+ |
+ // We get an interstitial page as a result. |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, |
+ true); // Interstitial showing. |
+ |
+ // We proceed through the interstitial page. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, |
+ false); // No interstitial showing. |
+ |
+ // Now we try again with the right host name this time. |
+ |
+ // Let's change the host-name in the url. |
+ GURL url = https_server->TestServerPageW(L"files/ssl/google.html"); |
+ std::string::size_type hostname_index = url.spec().find(kLocalHost); |
+ ASSERT_TRUE(hostname_index != std::string::npos); // Test sanity check. |
+ std::string new_url; |
+ new_url.append(url.spec().substr(0, hostname_index)); |
+ new_url.append(net::TestServerLauncher::kHostName); |
+ new_url.append(url.spec().substr(hostname_index + kLocalHost.size())); |
+ |
+ ui_test_utils::NavigateToURL(browser(), GURL(new_url)); |
+ |
+ // Security state should be OK. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Now try again the broken one to make sure it is still broken. |
+ ui_test_utils::NavigateToURL(browser(), |
+ https_server->TestServerPageW(L"files/ssl/google.html")); |
+ |
+ // Since we OKed the interstitial last time, we get right to the page. |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, |
+ false); // No interstitial showing. |
+} |
+ |
+// Test that navigating to a #ref does not change a bad security state. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) { |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ bad_https_server->TestServerPageW(L"files/ssl/page_with_refs.html")); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing. |
+ |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ false); // No interstitial showing. |
+ |
+ // Now navigate to a ref in the page, the security state should not have |
+ // changed. |
+ ui_test_utils::NavigateToURL(browser(), |
+ bad_https_server->TestServerPageW(L"files/ssl/page_with_refs.html#jp")); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ false); // No interstitial showing. |
+} |
+ |
+// Tests that closing a page that has a unsafe pop-up does not crash the browser |
+// (bug #1966). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestCloseTabWithUnsafePopup) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ ui_test_utils::NavigateToURL(browser(), http_server->TestServerPageW( |
+ L"files/ssl/page_with_unsafe_popup.html")); |
+ |
+ TabContents* tab1 = browser()->GetSelectedTabContents(); |
+ // It is probably overkill to add a notification for a popup-opening, let's |
+ // just poll. |
+ for (int i = 0; i < 10; i++) { |
+ if (tab1->constrained_window_count() > 0) |
+ break; |
+ MessageLoop::current()->PostDelayedTask(FROM_HERE, |
+ new MessageLoop::QuitTask(), 1000); |
+ ui_test_utils::RunMessageLoop(); |
+ } |
+ ASSERT_EQ(1, tab1->constrained_window_count()); |
+ |
+ // Let's add another tab to make sure the browser does not exit when we close |
+ // the first tab. |
+ GURL url = http_server->TestServerPageW(L"files/ssl/google.html"); |
+ TabContents* tab2 = browser()->AddTabWithURL(url, |
+ GURL(), |
+ PageTransition::TYPED, |
+ true, 0, NULL); |
+ ui_test_utils::WaitForNavigation(&(tab2->controller())); |
+ |
+ // Close the first tab. |
+ browser()->CloseTabContents(tab1); |
+} |
+ |
+// Visit a page over bad https that is a redirect to a page with good https. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectBadToGoodHTTPS) { |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ GURL url1 = bad_https_server->TestServerPageW(L"server-redirect?"); |
+ GURL url2 = good_https_server->TestServerPageW(L"files/ssl/google.html"); |
+ |
+ ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec())); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing. |
+ |
+ // We proceed through the interstitial page. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ // We have been redirected to the good page. |
+ CheckAuthenticatedState(tab, false, false); // No mixed/unsafe content. |
+} |
+ |
+// Visit a page over good https that is a redirect to a page with bad https. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectGoodToBadHTTPS) { |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ GURL url1 = good_https_server->TestServerPageW(L"server-redirect?"); |
+ GURL url2 = bad_https_server->TestServerPageW(L"files/ssl/google.html"); |
+ ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec())); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing. |
+ |
+ // We proceed through the interstitial page. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ false); // No interstitial showing. |
+} |
+ |
+// Visit a page over http that is a redirect to a page with good HTTPS. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToGoodHTTPS) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ |
+ // HTTP redirects to good HTTPS. |
+ GURL http_url = http_server->TestServerPageW(L"server-redirect?"); |
+ GURL good_https_url = |
+ good_https_server->TestServerPageW(L"files/ssl/google.html"); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ GURL(http_url.spec() + good_https_url.spec())); |
+ CheckAuthenticatedState(tab, false, false); // No mixed/unsafe content. |
+} |
+ |
+// Visit a page over http that is a redirect to a page with bad HTTPS. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToBadHTTPS) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ |
+ GURL http_url = http_server->TestServerPageW(L"server-redirect?"); |
+ GURL bad_https_url = |
+ bad_https_server->TestServerPageW(L"files/ssl/google.html"); |
+ ui_test_utils::NavigateToURL(browser(), |
+ GURL(http_url.spec() + bad_https_url.spec())); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing. |
+ |
+ // Continue on the interstitial. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ false); // No interstitial showing. |
+} |
+ |
+// Visit a page over https that is a redirect to a page with http (to make sure |
+// we don't keep the secure state). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPSToHTTP) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> https_server = GoodCertServer(); |
+ |
+ GURL https_url = https_server->TestServerPageW(L"server-redirect?"); |
+ GURL http_url = http_server->TestServerPageW(L"files/ssl/google.html"); |
+ |
+ ui_test_utils::NavigateToURL(browser(), |
+ GURL(https_url.spec() + http_url.spec())); |
+ CheckUnauthenticatedState(browser()->GetSelectedTabContents()); |
+} |
+ |
+// Visits a page to which we could not connect (bad port) over http and https |
+// and make sure the security style is correct. |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestConnectToBadPort) { |
+ ui_test_utils::NavigateToURL(browser(), GURL("http://localhost:17")); |
+ CheckUnauthenticatedState(browser()->GetSelectedTabContents()); |
+ |
+ // Same thing over HTTPS. |
+ ui_test_utils::NavigateToURL(browser(), GURL("https://localhost:17")); |
+ CheckUnauthenticatedState(browser()->GetSelectedTabContents()); |
+} |
+ |
+// |
+// Frame navigation |
+// |
+ |
+// From a good HTTPS top frame: |
+// - navigate to an OK HTTPS frame |
+// - navigate to a bad HTTPS (expect unsafe content and filtered frame), then |
+// back |
+// - navigate to HTTP (expect mixed content), then back |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestGoodFrameNavigation) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ ui_test_utils::NavigateToURL( |
+ browser(), |
+ good_https_server->TestServerPageW(L"files/ssl/top_frame.html")); |
+ |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ bool success = false; |
+ // Now navigate inside the frame. |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // We should still be fine. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Now let's hit a bad page. |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('badHTTPSLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // The security style should still be secure. |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // And the frame should be blocked. |
+ bool is_content_evil = true; |
+ std::wstring content_frame_xpath(L"html/frameset/frame[2]"); |
+ std::wstring is_frame_evil_js( |
+ L"window.domAutomationController" |
+ L".send(document.getElementById('evilDiv') != null);"); |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ content_frame_xpath, |
+ is_frame_evil_js, |
+ &is_content_evil)); |
+ EXPECT_FALSE(is_content_evil); |
+ |
+ // Now go back, our state should still be OK. |
+ tab->controller().GoBack(); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ CheckAuthenticatedState(tab, false, false); |
+ |
+ // Navigate to a page served over HTTP. |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('HTTPLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // Our state should be mixed-content. |
+ CheckAuthenticatedState(tab, true, false); |
+ |
+ // Go back, our state should be unchanged. |
+ tab->controller().GoBack(); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ CheckAuthenticatedState(tab, true, false); |
+} |
+ |
+// From a bad HTTPS top frame: |
+// - navigate to an OK HTTPS frame (expected to be still authentication broken). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadFrameNavigation) { |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ ui_test_utils::NavigateToURL( |
+ browser(), |
+ bad_https_server->TestServerPageW(L"files/ssl/top_frame.html")); |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, |
+ true); // Interstitial showing |
+ |
+ // Continue on the interstitial. |
+ InterstitialPage* interstitial_page = tab->interstitial_page(); |
+ ASSERT_TRUE(interstitial_page); |
+ interstitial_page->Proceed(); |
+ // Wait for the navigation to be done. |
+ ui_test_utils::WaitForNavigation(&(tab->controller())); |
+ |
+ // Navigate to a good frame. |
+ bool success = false; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // We should still be authentication broken. |
+ CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false); |
+} |
+ |
+// From an HTTP top frame, navigate to good and bad HTTPS (security state should |
+// stay unauthenticated). |
+IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnauthenticatedFrameNavigation) { |
+ scoped_refptr<HTTPTestServer> http_server = PlainServer(); |
+ scoped_refptr<HTTPSTestServer> good_https_server = GoodCertServer(); |
+ scoped_refptr<HTTPSTestServer> bad_https_server = BadCertServer(); |
+ |
+ TabContents* tab = browser()->GetSelectedTabContents(); |
+ ui_test_utils::NavigateToURL( |
+ browser(), |
+ http_server->TestServerPageW(L"files/ssl/top_frame.html")); |
+ CheckUnauthenticatedState(tab); |
+ |
+ // Now navigate inside the frame to a secure HTTPS frame. |
+ bool success = false; |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('goodHTTPSLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // We should still be unauthenticated. |
+ CheckUnauthenticatedState(tab); |
+ |
+ // Now navigate to a bad HTTPS frame. |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ L"", |
+ L"window.domAutomationController.send(clickLink('badHTTPSLink'));", |
+ &success)); |
+ EXPECT_TRUE(success); |
+ ui_test_utils::WaitForNavigation(&tab->controller()); |
+ |
+ // State should not have changed. |
+ CheckUnauthenticatedState(tab); |
+ |
+ // And the frame should have been blocked (see bug #2316). |
+ bool is_content_evil = true; |
+ std::wstring content_frame_xpath(L"html/frameset/frame[2]"); |
+ std::wstring is_frame_evil_js( |
+ L"window.domAutomationController" |
+ L".send(document.getElementById('evilDiv') != null);"); |
+ EXPECT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool(tab, |
+ content_frame_xpath, is_frame_evil_js, &is_content_evil)); |
+ EXPECT_FALSE(is_content_evil); |
+} |
+ |
+// TODO(jcampan): more tests to do below. |
+ |
+// Visit a page over https that contains a frame with a redirect. |
+ |
+// XMLHttpRequest mixed in synchronous mode. |
+ |
+// XMLHttpRequest mixed in asynchronous mode. |
+ |
+// XMLHttpRequest over bad ssl in synchronous mode. |
+ |
+// XMLHttpRequest over OK ssl in synchronous mode. |