| Index: chrome/browser/ssl/ssl_browser_tests.cc
|
| diff --git a/chrome/browser/ssl/ssl_browser_tests.cc b/chrome/browser/ssl/ssl_browser_tests.cc
|
| index 1d7e7c89fbc47cea3673a0928e72bbb9e9421bf0..9dbcec4008e2600124780ca602a37dc0fbb5fbd1 100644
|
| --- a/chrome/browser/ssl/ssl_browser_tests.cc
|
| +++ b/chrome/browser/ssl/ssl_browser_tests.cc
|
| @@ -550,6 +550,36 @@ class SSLUITest
|
| net::EmbeddedTestServer https_server_mismatched_;
|
| net::SpawnedTestServer wss_server_expired_;
|
|
|
| + protected:
|
| + // Navigates to an interstitial and clicks through the certificate
|
| + // error; then navigates to a page at |path| that loads unsafe content.
|
| + void SetUpUnsafeContentsWithUserException(const std::string& path) {
|
| + ASSERT_TRUE(https_server_.Start());
|
| + // Note that it is necessary to user https_server_mismatched_ here over the
|
| + // other invalid cert servers. This is because the test relies on the two
|
| + // servers having different hosts since SSL exceptions are per-host, not per
|
| + // origin, and https_server_mismatched_ uses 'localhost' rather than
|
| + // '127.0.0.1'.
|
| + ASSERT_TRUE(https_server_mismatched_.Start());
|
| +
|
| + // Navigate to an unsafe site. Proceed with interstitial page to indicate
|
| + // the user approves the bad certificate.
|
| + ui_test_utils::NavigateToURL(
|
| + browser(), https_server_mismatched_.GetURL("/ssl/blank_page.html"));
|
| + WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
|
| + CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
|
| + AuthState::SHOWING_INTERSTITIAL);
|
| + ProceedThroughInterstitial(tab);
|
| + CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
|
| + AuthState::NONE);
|
| +
|
| + std::string replacement_path;
|
| + GetFilePathWithHostAndPortReplacement(
|
| + path, https_server_mismatched_.host_port_pair(), &replacement_path);
|
| + ui_test_utils::NavigateToURL(browser(),
|
| + https_server_.GetURL(replacement_path));
|
| + }
|
| +
|
| private:
|
| typedef net::SpawnedTestServer::SSLOptions SSLOptions;
|
|
|
| @@ -2117,10 +2147,7 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerFiltered) {
|
|
|
| // This test, and the related test TestUnsafeContentsWithUserException, verify
|
| // that if unsafe content is loaded but the host of that unsafe content has a
|
| -// user exception, the content runs and the security style remains
|
| -// authenticated. This is not necessarily the behavior that should exist, but it
|
| -// is verification that it does behave that way. See https://crbug.com/477868
|
| -// for more inforamtion on this.
|
| +// user exception, the content runs and the security style is downgraded.
|
| IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerWithUserException) {
|
| ASSERT_TRUE(https_server_.Start());
|
| // Note that it is necessary to user https_server_mismatched_ here over the
|
| @@ -2150,44 +2177,56 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerWithUserException) {
|
| ui_test_utils::NavigateToURL(
|
| browser(), https_server_.GetURL(page_with_unsafe_worker_path));
|
| CheckWorkerLoadResult(tab, true); // Worker loads insecure content
|
| - CheckAuthenticatedState(tab, CertError::NONE);
|
| + CheckAuthenticationBrokenState(tab, CertError::NONE,
|
| + AuthState::RAN_INSECURE_CONTENT);
|
| }
|
|
|
| // Visits a page with unsafe content and makes sure that if a user exception to
|
| // the certificate error is present, the image is loaded and script executes.
|
| -//
|
| -// See the comment above SSLUITest.TestUnsafeContentsInWorkerWithUserException
|
| -// for a discussion about the desired behavior.
|
| IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsWithUserException) {
|
| - ASSERT_TRUE(https_server_.Start());
|
| - // Note that it is necessary to user https_server_mismatched_ here over the
|
| - // other invalid cert servers. This is because the test relies on the two
|
| - // servers having different hosts since SSL exceptions are per-host, not per
|
| - // origin, and https_server_mismatched_ uses 'localhost' rather than
|
| - // '127.0.0.1'.
|
| - ASSERT_TRUE(https_server_mismatched_.Start());
|
| -
|
| - // Navigate to an unsafe site. Proceed with interstitial page to indicate
|
| - // the user approves the bad certificate.
|
| - ui_test_utils::NavigateToURL(
|
| - browser(), https_server_mismatched_.GetURL("/ssl/blank_page.html"));
|
| WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
|
| - CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
|
| - AuthState::SHOWING_INTERSTITIAL);
|
| - ProceedThroughInterstitial(tab);
|
| - CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
|
| - AuthState::NONE);
|
| + ASSERT_NO_FATAL_FAILURE(SetUpUnsafeContentsWithUserException(
|
| + "/ssl/page_with_unsafe_contents.html"));
|
| + CheckAuthenticationBrokenState(
|
| + tab, CertError::NONE,
|
| + AuthState::RAN_INSECURE_CONTENT | AuthState::DISPLAYED_INSECURE_CONTENT);
|
|
|
| + int img_width;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
|
| + tab, "window.domAutomationController.send(ImageWidth());", &img_width));
|
| + // In order to check that the image was loaded, we check its width.
|
| + // The actual image (Google logo) is 114 pixels wide, so we assume a good
|
| + // image is greater than 100.
|
| + EXPECT_GT(img_width, 100);
|
| +
|
| + bool js_result = false;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
|
| + tab, "window.domAutomationController.send(IsFooSet());", &js_result));
|
| + EXPECT_TRUE(js_result);
|
| +
|
| + // Test that active subresources with the same certificate errors as
|
| + // the main resources don't cause mixed content UI downgrades. (Such
|
| + // errors would be confusing and duplicative.)
|
| std::string replacement_path;
|
| GetFilePathWithHostAndPortReplacement(
|
| "/ssl/page_with_unsafe_contents.html",
|
| https_server_mismatched_.host_port_pair(), &replacement_path);
|
| - ui_test_utils::NavigateToURL(browser(),
|
| - https_server_.GetURL(replacement_path));
|
| + ui_test_utils::NavigateToURL(
|
| + browser(), https_server_mismatched_.GetURL(replacement_path));
|
| + js_result = false;
|
| + EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
|
| + tab, "window.domAutomationController.send(IsFooSet());", &js_result));
|
| + EXPECT_TRUE(js_result);
|
| + CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID,
|
| + AuthState::NONE);
|
| +}
|
|
|
| - // When the bad content is filtered, the state is expected to be
|
| - // authenticated.
|
| - CheckAuthenticatedState(tab, AuthState::NONE);
|
| +// Like the test above, but only displaying inactive content (an image).
|
| +IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeImageWithUserException) {
|
| + WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + SetUpUnsafeContentsWithUserException("/ssl/page_with_unsafe_image.html"));
|
| + CheckAuthenticatedState(tab, AuthState::DISPLAYED_INSECURE_CONTENT);
|
|
|
| int img_width;
|
| EXPECT_TRUE(content::ExecuteScriptAndExtractInt(
|
| @@ -2196,12 +2235,6 @@ IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsWithUserException) {
|
| // The actual image (Google logo) is 114 pixels wide, so we assume a good
|
| // image is greater than 100.
|
| EXPECT_GT(img_width, 100);
|
| -
|
| - bool js_result = false;
|
| - EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
|
| - tab, "window.domAutomationController.send(IsFooSet());", &js_result));
|
| - EXPECT_TRUE(js_result);
|
| - CheckAuthenticatedState(tab, CertError::NONE);
|
| }
|
|
|
| // Test that when the browser blocks displaying insecure content (images), the
|
|
|