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 3 // found in the LICENSE file. 4 5 #include "base/command_line.h" 6 #include "base/path_service.h" 7 #include "base/prefs/pref_service.h" 8 #include "base/strings/string_util.h" 9 #include "base/strings/stringprintf.h" 10 #include "base/strings/utf_string_conversions.h" 11 #include "base/time/time.h" 12 #include "chrome/app/chrome_command_ids.h" 13 #include "chrome/browser/chrome_notification_types.h" 14 #include "chrome/browser/content_settings/host_content_settings_map.h" 15 #include "chrome/browser/profiles/profile.h" 16 #include "chrome/browser/ui/browser.h" 17 #include "chrome/browser/ui/browser_commands.h" 18 #include "chrome/browser/ui/browser_navigator.h" 19 #include "chrome/browser/ui/browser_tabstrip.h" 20 #include "chrome/browser/ui/tabs/tab_strip_model.h" 21 #include "chrome/common/chrome_paths.h" 22 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/pref_names.h" 24 #include "chrome/test/base/in_process_browser_test.h" 25 #include "chrome/test/base/ui_test_utils.h" 26 #include "components/web_modal/web_contents_modal_dialog_manager.h" 27 #include "content/public/browser/browser_context.h" 28 #include "content/public/browser/interstitial_page.h" 29 #include "content/public/browser/navigation_controller.h" 30 #include "content/public/browser/navigation_entry.h" 31 #include "content/public/browser/notification_service.h" 32 #include "content/public/browser/render_view_host.h" 33 #include "content/public/browser/web_contents.h" 34 #include "content/public/browser/web_contents_observer.h" 35 #include "content/public/common/security_style.h" 36 #include "content/public/common/ssl_status.h" 37 #include "content/public/test/browser_test_utils.h" 38 #include "content/public/test/download_test_observer.h" 39 #include "content/public/test/test_renderer_host.h" 40 #include "crypto/nss_util.h" 41 #include "net/base/crypto_module.h" 42 #include "net/base/net_errors.h" 43 #include "net/base/test_data_directory.h" 44 #include "net/cert/cert_status_flags.h" 45 #include "net/test/spawned_test_server/spawned_test_server.h" 46 47 #if defined(USE_NSS) 48 #include "net/cert/nss_cert_database.h" 49 #endif // defined(USE_NSS) 50 51 using content::InterstitialPage; 52 using content::NavigationController; 53 using content::NavigationEntry; 54 using content::SSLStatus; 55 using content::WebContents; 56 using web_modal::WebContentsModalDialogManager; 57 58 const base::FilePath::CharType kDocRoot[] = 59 FILE_PATH_LITERAL("chrome/test/data"); 60 61 namespace { 62 63 class ProvisionalLoadWaiter : public content::WebContentsObserver { 64 public: 65 explicit ProvisionalLoadWaiter(WebContents* tab) 66 : WebContentsObserver(tab), waiting_(false), seen_(false) {} 67 68 void Wait() { 69 if (seen_) 70 return; 71 72 waiting_ = true; 73 content::RunMessageLoop(); 74 } 75 76 virtual void DidFailProvisionalLoad( 77 int64 frame_id, 78 const base::string16& frame_unique_name, 79 bool is_main_frame, 80 const GURL& validated_url, 81 int error_code, 82 const base::string16& error_description, 83 content::RenderViewHost* render_view_host) OVERRIDE { 84 seen_ = true; 85 if (waiting_) 86 base::MessageLoopForUI::current()->Quit(); 87 } 88 89 private: 90 bool waiting_; 91 bool seen_; 92 }; 93 94 } // namespace 95 96 class SSLUITest : public InProcessBrowserTest { 97 public: 98 SSLUITest() 99 : https_server_(net::SpawnedTestServer::TYPE_HTTPS, 100 SSLOptions(SSLOptions::CERT_OK), 101 base::FilePath(kDocRoot)), 102 https_server_expired_(net::SpawnedTestServer::TYPE_HTTPS, 103 SSLOptions(SSLOptions::CERT_EXPIRED), 104 base::FilePath(kDocRoot)), 105 https_server_mismatched_(net::SpawnedTestServer::TYPE_HTTPS, 106 SSLOptions(SSLOptions::CERT_MISMATCHED_NAME), 107 base::FilePath(kDocRoot)), 108 wss_server_expired_(net::SpawnedTestServer::TYPE_WSS, 109 SSLOptions(SSLOptions::CERT_EXPIRED), 110 net::GetWebSocketTestDataDirectory()) {} 111 112 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 113 // Browser will both run and display insecure content. 114 command_line->AppendSwitch(switches::kAllowRunningInsecureContent); 115 // Use process-per-site so that navigating to a same-site page in a 116 // new tab will use the same process. 117 command_line->AppendSwitch(switches::kProcessPerSite); 118 } 119 120 void CheckState(WebContents* tab, 121 content::SecurityStyle expected_security_style, 122 bool expected_displayed_insecure_content, 123 bool expected_ran_insecure_content) { 124 ASSERT_FALSE(tab->IsCrashed()); 125 NavigationEntry* entry = tab->GetController().GetActiveEntry(); 126 ASSERT_TRUE(entry); 127 EXPECT_EQ(content::PAGE_TYPE_NORMAL, entry->GetPageType()); 128 EXPECT_EQ(expected_security_style, entry->GetSSL().security_style); 129 EXPECT_EQ(0U, entry->GetSSL().cert_status & net::CERT_STATUS_ALL_ERRORS); 130 bool displayed_insecure_content = 131 entry->GetSSL().content_status & SSLStatus::DISPLAYED_INSECURE_CONTENT; 132 EXPECT_EQ(expected_displayed_insecure_content, displayed_insecure_content); 133 bool ran_insecure_content = 134 entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT; 135 EXPECT_EQ(expected_ran_insecure_content, ran_insecure_content); 136 } 137 138 void CheckAuthenticatedState(WebContents* tab, 139 bool expected_displayed_insecure_content) { 140 CheckState(tab, content::SECURITY_STYLE_AUTHENTICATED, 141 expected_displayed_insecure_content, false); 142 } 143 144 void CheckUnauthenticatedState(WebContents* tab) { 145 CheckState(tab, content::SECURITY_STYLE_UNAUTHENTICATED, false, false); 146 } 147 148 void CheckBrokenAuthenticatedState(WebContents* tab) { 149 CheckState(tab, content::SECURITY_STYLE_AUTHENTICATION_BROKEN, false, true); 150 } 151 152 void CheckAuthenticationBrokenState(WebContents* tab, 153 net::CertStatus error, 154 bool ran_insecure_content, 155 bool interstitial) { 156 ASSERT_FALSE(tab->IsCrashed()); 157 NavigationEntry* entry = tab->GetController().GetActiveEntry(); 158 ASSERT_TRUE(entry); 159 EXPECT_EQ(interstitial ? 160 content::PAGE_TYPE_INTERSTITIAL : content::PAGE_TYPE_NORMAL, 161 entry->GetPageType()); 162 EXPECT_EQ(content::SECURITY_STYLE_AUTHENTICATION_BROKEN, 163 entry->GetSSL().security_style); 164 // CERT_STATUS_UNABLE_TO_CHECK_REVOCATION doesn't lower the security style 165 // to SECURITY_STYLE_AUTHENTICATION_BROKEN. 166 ASSERT_NE(net::CERT_STATUS_UNABLE_TO_CHECK_REVOCATION, error); 167 EXPECT_EQ(error, entry->GetSSL().cert_status & error); 168 EXPECT_FALSE(!!(entry->GetSSL().content_status & 169 SSLStatus::DISPLAYED_INSECURE_CONTENT)); 170 EXPECT_EQ(ran_insecure_content, 171 !!(entry->GetSSL().content_status & SSLStatus::RAN_INSECURE_CONTENT)); 172 net::CertStatus extra_cert_errors = error ^ (entry->GetSSL().cert_status & 173 net::CERT_STATUS_ALL_ERRORS); 174 if (extra_cert_errors) 175 LOG(WARNING) << "Got unexpected cert error: " << extra_cert_errors; 176 } 177 178 void CheckWorkerLoadResult(WebContents* tab, bool expected_load) { 179 // Workers are async and we don't have notifications for them passing 180 // messages since they do it between renderer and worker processes. 181 // So have a polling loop, check every 200ms, timeout at 30s. 182 const int kTimeoutMS = 200; 183 base::Time time_to_quit = base::Time::Now() + 184 base::TimeDelta::FromMilliseconds(30000); 185 186 while (base::Time::Now() < time_to_quit) { 187 bool worker_finished = false; 188 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 189 tab, 190 "window.domAutomationController.send(IsWorkerFinished());", 191 &worker_finished)); 192 193 if (worker_finished) 194 break; 195 196 // Wait a bit. 197 base::MessageLoop::current()->PostDelayedTask( 198 FROM_HERE, 199 base::MessageLoop::QuitClosure(), 200 base::TimeDelta::FromMilliseconds(kTimeoutMS)); 201 content::RunMessageLoop(); 202 } 203 204 bool actually_loaded_content = false; 205 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 206 tab, 207 "window.domAutomationController.send(IsContentLoaded());", 208 &actually_loaded_content)); 209 EXPECT_EQ(expected_load, actually_loaded_content); 210 } 211 212 void ProceedThroughInterstitial(WebContents* tab) { 213 InterstitialPage* interstitial_page = tab->GetInterstitialPage(); 214 ASSERT_TRUE(interstitial_page); 215 content::WindowedNotificationObserver observer( 216 content::NOTIFICATION_LOAD_STOP, 217 content::Source<NavigationController>(&tab->GetController())); 218 interstitial_page->Proceed(); 219 observer.Wait(); 220 } 221 222 bool IsShowingWebContentsModalDialog() const { 223 return WebContentsModalDialogManager::FromWebContents( 224 browser()->tab_strip_model()->GetActiveWebContents())-> 225 IsDialogActive(); 226 } 227 228 static bool GetFilePathWithHostAndPortReplacement( 229 const std::string& original_file_path, 230 const net::HostPortPair& host_port_pair, 231 std::string* replacement_path) { 232 std::vector<net::SpawnedTestServer::StringPair> replacement_text; 233 replacement_text.push_back( 234 make_pair("REPLACE_WITH_HOST_AND_PORT", host_port_pair.ToString())); 235 return net::SpawnedTestServer::GetFilePathWithReplacements( 236 original_file_path, replacement_text, replacement_path); 237 } 238 239 static bool GetTopFramePath(const net::SpawnedTestServer& http_server, 240 const net::SpawnedTestServer& good_https_server, 241 const net::SpawnedTestServer& bad_https_server, 242 std::string* top_frame_path) { 243 // The "frame_left.html" page contained in the top_frame.html page contains 244 // <a href>'s to three different servers. This sets up all of the 245 // replacement text to work with test servers which listen on ephemeral 246 // ports. 247 GURL http_url = http_server.GetURL("files/ssl/google.html"); 248 GURL good_https_url = good_https_server.GetURL("files/ssl/google.html"); 249 GURL bad_https_url = bad_https_server.GetURL( 250 "files/ssl/bad_iframe.html"); 251 252 std::vector<net::SpawnedTestServer::StringPair> replacement_text_frame_left; 253 replacement_text_frame_left.push_back( 254 make_pair("REPLACE_WITH_HTTP_PAGE", http_url.spec())); 255 replacement_text_frame_left.push_back( 256 make_pair("REPLACE_WITH_GOOD_HTTPS_PAGE", good_https_url.spec())); 257 replacement_text_frame_left.push_back( 258 make_pair("REPLACE_WITH_BAD_HTTPS_PAGE", bad_https_url.spec())); 259 std::string frame_left_path; 260 if (!net::SpawnedTestServer::GetFilePathWithReplacements( 261 "frame_left.html", 262 replacement_text_frame_left, 263 &frame_left_path)) 264 return false; 265 266 // Substitute the generated frame_left URL into the top_frame page. 267 std::vector<net::SpawnedTestServer::StringPair> replacement_text_top_frame; 268 replacement_text_top_frame.push_back( 269 make_pair("REPLACE_WITH_FRAME_LEFT_PATH", frame_left_path)); 270 return net::SpawnedTestServer::GetFilePathWithReplacements( 271 "files/ssl/top_frame.html", 272 replacement_text_top_frame, 273 top_frame_path); 274 } 275 276 static bool GetPageWithUnsafeWorkerPath( 277 const net::SpawnedTestServer& expired_https_server, 278 std::string* page_with_unsafe_worker_path) { 279 // Get the "imported.js" URL from the expired https server and 280 // substitute it into the unsafe_worker.js file. 281 GURL imported_js_url = expired_https_server.GetURL("files/ssl/imported.js"); 282 std::vector<net::SpawnedTestServer::StringPair> 283 replacement_text_for_unsafe_worker; 284 replacement_text_for_unsafe_worker.push_back( 285 make_pair("REPLACE_WITH_IMPORTED_JS_URL", imported_js_url.spec())); 286 std::string unsafe_worker_path; 287 if (!net::SpawnedTestServer::GetFilePathWithReplacements( 288 "unsafe_worker.js", 289 replacement_text_for_unsafe_worker, 290 &unsafe_worker_path)) 291 return false; 292 293 // Now, substitute this into the page with unsafe worker. 294 std::vector<net::SpawnedTestServer::StringPair> 295 replacement_text_for_page_with_unsafe_worker; 296 replacement_text_for_page_with_unsafe_worker.push_back( 297 make_pair("REPLACE_WITH_UNSAFE_WORKER_PATH", unsafe_worker_path)); 298 return net::SpawnedTestServer::GetFilePathWithReplacements( 299 "files/ssl/page_with_unsafe_worker.html", 300 replacement_text_for_page_with_unsafe_worker, 301 page_with_unsafe_worker_path); 302 } 303 304 net::SpawnedTestServer https_server_; 305 net::SpawnedTestServer https_server_expired_; 306 net::SpawnedTestServer https_server_mismatched_; 307 net::SpawnedTestServer wss_server_expired_; 308 309 private: 310 typedef net::SpawnedTestServer::SSLOptions SSLOptions; 311 312 DISALLOW_COPY_AND_ASSIGN(SSLUITest); 313 }; 314 315 class SSLUITestBlock : public SSLUITest { 316 public: 317 SSLUITestBlock() : SSLUITest() {} 318 319 // Browser will neither run nor display insecure content. 320 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 321 command_line->AppendSwitch(switches::kNoDisplayingInsecureContent); 322 } 323 }; 324 325 class SSLUITestIgnoreCertErrors : public SSLUITest { 326 public: 327 SSLUITestIgnoreCertErrors() : SSLUITest() {} 328 329 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 330 // Browser will ignore certificate errors. 331 command_line->AppendSwitch(switches::kIgnoreCertificateErrors); 332 } 333 }; 334 335 // Visits a regular page over http. 336 IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTP) { 337 ASSERT_TRUE(test_server()->Start()); 338 339 ui_test_utils::NavigateToURL(browser(), 340 test_server()->GetURL("files/ssl/google.html")); 341 342 CheckUnauthenticatedState( 343 browser()->tab_strip_model()->GetActiveWebContents()); 344 } 345 346 // Visits a page over http which includes broken https resources (status should 347 // be OK). 348 // TODO(jcampan): test that bad HTTPS content is blocked (otherwise we'll give 349 // the secure cookies away!). 350 IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPWithBrokenHTTPSResource) { 351 ASSERT_TRUE(test_server()->Start()); 352 ASSERT_TRUE(https_server_expired_.Start()); 353 354 std::string replacement_path; 355 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 356 "files/ssl/page_with_unsafe_contents.html", 357 https_server_expired_.host_port_pair(), 358 &replacement_path)); 359 360 ui_test_utils::NavigateToURL( 361 browser(), test_server()->GetURL(replacement_path)); 362 363 CheckUnauthenticatedState( 364 browser()->tab_strip_model()->GetActiveWebContents()); 365 } 366 367 // http://crbug.com/91745 368 #if defined(OS_CHROMEOS) 369 #define MAYBE_TestOKHTTPS DISABLED_TestOKHTTPS 370 #else 371 #define MAYBE_TestOKHTTPS TestOKHTTPS 372 #endif 373 374 // Visits a page over OK https: 375 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestOKHTTPS) { 376 ASSERT_TRUE(https_server_.Start()); 377 378 ui_test_utils::NavigateToURL(browser(), 379 https_server_.GetURL("files/ssl/google.html")); 380 381 CheckAuthenticatedState( 382 browser()->tab_strip_model()->GetActiveWebContents(), false); 383 } 384 385 // Visits a page with https error and proceed: 386 IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndProceed) { 387 ASSERT_TRUE(https_server_expired_.Start()); 388 389 ui_test_utils::NavigateToURL(browser(), 390 https_server_expired_.GetURL("files/ssl/google.html")); 391 392 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 393 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 394 true); // Interstitial showing 395 396 ProceedThroughInterstitial(tab); 397 398 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 399 false); // No interstitial showing 400 } 401 402 #ifndef NEDBUG 403 // Flaky on Windows debug (http://crbug.com/280537). 404 #define MAYBE_TestHTTPSExpiredCertAndDontProceed \ 405 DISABLED_TestHTTPSExpiredCertAndDontProceed 406 #else 407 #define MAYBE_TestHTTPSExpiredCertAndDontProceed \ 408 TestHTTPSExpiredCertAndDontProceed 409 #endif 410 411 // Visits a page with https error and don't proceed (and ensure we can still 412 // navigate at that point): 413 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestHTTPSExpiredCertAndDontProceed) { 414 ASSERT_TRUE(test_server()->Start()); 415 ASSERT_TRUE(https_server_.Start()); 416 ASSERT_TRUE(https_server_expired_.Start()); 417 418 // First navigate to an OK page. 419 ui_test_utils::NavigateToURL(browser(), 420 https_server_.GetURL("files/ssl/google.html")); 421 422 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 423 NavigationEntry* entry = tab->GetController().GetActiveEntry(); 424 ASSERT_TRUE(entry); 425 426 GURL cross_site_url = 427 https_server_expired_.GetURL("files/ssl/google.html"); 428 // Change the host name from 127.0.0.1 to localhost so it triggers a 429 // cross-site navigation so we can test http://crbug.com/5800 is gone. 430 ASSERT_EQ("127.0.0.1", cross_site_url.host()); 431 GURL::Replacements replacements; 432 std::string new_host("localhost"); 433 replacements.SetHostStr(new_host); 434 cross_site_url = cross_site_url.ReplaceComponents(replacements); 435 436 // Now go to a bad HTTPS page. 437 ui_test_utils::NavigateToURL(browser(), cross_site_url); 438 439 // An interstitial should be showing. 440 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, 441 false, true); 442 443 // Simulate user clicking "Take me back". 444 InterstitialPage* interstitial_page = tab->GetInterstitialPage(); 445 ASSERT_TRUE(interstitial_page); 446 interstitial_page->DontProceed(); 447 448 // We should be back to the original good page. 449 CheckAuthenticatedState(tab, false); 450 451 // Try to navigate to a new page. (to make sure bug 5800 is fixed). 452 ui_test_utils::NavigateToURL(browser(), 453 test_server()->GetURL("files/ssl/google.html")); 454 CheckUnauthenticatedState(tab); 455 } 456 457 // Visits a page with https error and then goes back using Browser::GoBack. 458 IN_PROC_BROWSER_TEST_F(SSLUITest, 459 TestHTTPSExpiredCertAndGoBackViaButton) { 460 ASSERT_TRUE(test_server()->Start()); 461 ASSERT_TRUE(https_server_expired_.Start()); 462 463 // First navigate to an HTTP page. 464 ui_test_utils::NavigateToURL(browser(), 465 test_server()->GetURL("files/ssl/google.html")); 466 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 467 NavigationEntry* entry = tab->GetController().GetActiveEntry(); 468 ASSERT_TRUE(entry); 469 470 // Now go to a bad HTTPS page that shows an interstitial. 471 ui_test_utils::NavigateToURL(browser(), 472 https_server_expired_.GetURL("files/ssl/google.html")); 473 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 474 true); // Interstitial showing 475 476 ProvisionalLoadWaiter load_failed_observer(tab); 477 478 // Simulate user clicking on back button (crbug.com/39248). 479 chrome::GoBack(browser(), CURRENT_TAB); 480 481 // Wait until we hear the load failure, and make sure we haven't swapped out 482 // the previous page. Prevents regression of http://crbug.com/82667. 483 load_failed_observer.Wait(); 484 EXPECT_FALSE(content::RenderViewHostTester::IsRenderViewHostSwappedOut( 485 tab->GetRenderViewHost())); 486 487 // We should be back at the original good page. 488 EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()-> 489 GetInterstitialPage()); 490 CheckUnauthenticatedState(tab); 491 } 492 493 // Visits a page with https error and then goes back using GoToOffset. 494 // Disabled because its flaky: http://crbug.com/40932, http://crbug.com/43575. 495 IN_PROC_BROWSER_TEST_F(SSLUITest, 496 TestHTTPSExpiredCertAndGoBackViaMenu) { 497 ASSERT_TRUE(test_server()->Start()); 498 ASSERT_TRUE(https_server_expired_.Start()); 499 500 // First navigate to an HTTP page. 501 ui_test_utils::NavigateToURL(browser(), 502 test_server()->GetURL("files/ssl/google.html")); 503 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 504 NavigationEntry* entry = tab->GetController().GetActiveEntry(); 505 ASSERT_TRUE(entry); 506 507 // Now go to a bad HTTPS page that shows an interstitial. 508 ui_test_utils::NavigateToURL(browser(), 509 https_server_expired_.GetURL("files/ssl/google.html")); 510 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 511 true); // Interstitial showing 512 513 // Simulate user clicking and holding on back button (crbug.com/37215). 514 tab->GetController().GoToOffset(-1); 515 516 // We should be back at the original good page. 517 EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()-> 518 GetInterstitialPage()); 519 CheckUnauthenticatedState(tab); 520 } 521 522 // Visits a page with https error and then goes forward using GoToOffset. 523 IN_PROC_BROWSER_TEST_F(SSLUITest, TestHTTPSExpiredCertAndGoForward) { 524 ASSERT_TRUE(test_server()->Start()); 525 ASSERT_TRUE(https_server_expired_.Start()); 526 527 // First navigate to two HTTP pages. 528 ui_test_utils::NavigateToURL(browser(), 529 test_server()->GetURL("files/ssl/google.html")); 530 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 531 NavigationEntry* entry1 = tab->GetController().GetActiveEntry(); 532 ASSERT_TRUE(entry1); 533 ui_test_utils::NavigateToURL(browser(), 534 test_server()->GetURL("files/ssl/blank_page.html")); 535 NavigationEntry* entry2 = tab->GetController().GetActiveEntry(); 536 ASSERT_TRUE(entry2); 537 538 // Now go back so that a page is in the forward history. 539 { 540 content::WindowedNotificationObserver observer( 541 content::NOTIFICATION_LOAD_STOP, 542 content::Source<NavigationController>(&tab->GetController())); 543 tab->GetController().GoBack(); 544 observer.Wait(); 545 } 546 ASSERT_TRUE(tab->GetController().CanGoForward()); 547 NavigationEntry* entry3 = tab->GetController().GetActiveEntry(); 548 ASSERT_TRUE(entry1 == entry3); 549 550 // Now go to a bad HTTPS page that shows an interstitial. 551 ui_test_utils::NavigateToURL(browser(), 552 https_server_expired_.GetURL("files/ssl/google.html")); 553 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 554 true); // Interstitial showing 555 556 // Simulate user clicking and holding on forward button. 557 { 558 content::WindowedNotificationObserver observer( 559 content::NOTIFICATION_LOAD_STOP, 560 content::Source<NavigationController>(&tab->GetController())); 561 tab->GetController().GoToOffset(1); 562 observer.Wait(); 563 } 564 565 // We should be showing the second good page. 566 EXPECT_FALSE(browser()->tab_strip_model()->GetActiveWebContents()-> 567 GetInterstitialPage()); 568 CheckUnauthenticatedState(tab); 569 EXPECT_FALSE(tab->GetController().CanGoForward()); 570 NavigationEntry* entry4 = tab->GetController().GetActiveEntry(); 571 EXPECT_TRUE(entry2 == entry4); 572 } 573 574 // Visit a HTTP page which request WSS connection to a server providing invalid 575 // certificate. Close the page while WSS connection waits for SSLManager's 576 // response from UI thread. 577 // Disabled on Windows because it was flaking on XP Tests (1). crbug.com/165258 578 #if defined(OS_WIN) 579 #define MAYBE_TestWSSInvalidCertAndClose DISABLED_TestWSSInvalidCertAndClose 580 #else 581 #define MAYBE_TestWSSInvalidCertAndClose TestWSSInvalidCertAndClose 582 #endif 583 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestWSSInvalidCertAndClose) { 584 ASSERT_TRUE(test_server()->Start()); 585 ASSERT_TRUE(wss_server_expired_.Start()); 586 587 // Setup page title observer. 588 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 589 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 590 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 591 592 // Create GURLs to test pages. 593 std::string master_url_path = base::StringPrintf("%s?%d", 594 test_server()->GetURL("files/ssl/wss_close.html").spec().c_str(), 595 wss_server_expired_.host_port_pair().port()); 596 GURL master_url(master_url_path); 597 std::string slave_url_path = base::StringPrintf("%s?%d", 598 test_server()->GetURL("files/ssl/wss_close_slave.html").spec().c_str(), 599 wss_server_expired_.host_port_pair().port()); 600 GURL slave_url(slave_url_path); 601 602 // Create tabs and visit pages which keep on creating wss connections. 603 WebContents* tabs[16]; 604 for (int i = 0; i < 16; ++i) { 605 tabs[i] = chrome::AddSelectedTabWithURL(browser(), slave_url, 606 content::PAGE_TRANSITION_LINK); 607 } 608 chrome::SelectNextTab(browser()); 609 610 // Visit a page which waits for one TLS handshake failure. 611 // The title will be changed to 'PASS'. 612 ui_test_utils::NavigateToURL(browser(), master_url); 613 const base::string16 result = watcher.WaitAndGetTitle(); 614 EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass")); 615 616 // Close tabs which contains the test page. 617 for (int i = 0; i < 16; ++i) 618 chrome::CloseWebContents(browser(), tabs[i], false); 619 chrome::CloseWebContents(browser(), tab, false); 620 } 621 622 // Visit a HTTPS page and proceeds despite an invalid certificate. The page 623 // requests WSS connection to the same origin host to check if WSS connection 624 // share certificates policy with HTTPS correcly. 625 IN_PROC_BROWSER_TEST_F(SSLUITest, TestWSSInvalidCertAndGoForward) { 626 ASSERT_TRUE(test_server()->Start()); 627 ASSERT_TRUE(wss_server_expired_.Start()); 628 629 // Setup page title observer. 630 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 631 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 632 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 633 634 // Visit bad HTTPS page. 635 std::string scheme("https"); 636 GURL::Replacements replacements; 637 replacements.SetSchemeStr(scheme); 638 ui_test_utils::NavigateToURL( 639 browser(), 640 wss_server_expired_.GetURL( 641 "connect_check.html").ReplaceComponents(replacements)); 642 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 643 true); // Interstitial showing 644 645 // Proceed anyway. 646 ProceedThroughInterstitial(tab); 647 648 // Test page run a WebSocket wss connection test. The result will be shown 649 // as page title. 650 const base::string16 result = watcher.WaitAndGetTitle(); 651 EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass")); 652 } 653 654 #if defined(USE_NSS) 655 // SSL client certificate tests are only enabled when using NSS for private key 656 // storage, as only NSS can avoid modifying global machine state when testing. 657 // See http://crbug.com/51132 658 659 // Visit a HTTPS page which requires client cert authentication. The client 660 // cert will be selected automatically, then a test which uses WebSocket runs. 661 // Disabled: http://crbug.com/159985 662 IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestWSSClientCert) { 663 // Open a temporary NSS DB for testing. 664 crypto::ScopedTestNSSDB test_nssdb; 665 ASSERT_TRUE(test_nssdb.is_open()); 666 667 // Import client cert for test. These interfaces require NSS. 668 net::NSSCertDatabase* cert_db = net::NSSCertDatabase::GetInstance(); 669 scoped_refptr<net::CryptoModule> crypt_module = cert_db->GetPublicModule(); 670 std::string pkcs12_data; 671 base::FilePath cert_path = net::GetTestCertsDirectory().Append( 672 FILE_PATH_LITERAL("websocket_client_cert.p12")); 673 EXPECT_TRUE(base::ReadFileToString(cert_path, &pkcs12_data)); 674 EXPECT_EQ(net::OK, 675 cert_db->ImportFromPKCS12( 676 crypt_module.get(), pkcs12_data, base::string16(), true, NULL)); 677 678 // Start WebSocket test server with TLS and client cert authentication. 679 net::SpawnedTestServer::SSLOptions options( 680 net::SpawnedTestServer::SSLOptions::CERT_OK); 681 options.request_client_certificate = true; 682 base::FilePath ca_path = net::GetTestCertsDirectory().Append( 683 FILE_PATH_LITERAL("websocket_cacert.pem")); 684 options.client_authorities.push_back(ca_path); 685 net::SpawnedTestServer wss_server(net::SpawnedTestServer::TYPE_WSS, 686 options, 687 net::GetWebSocketTestDataDirectory()); 688 ASSERT_TRUE(wss_server.Start()); 689 std::string scheme("https"); 690 GURL::Replacements replacements; 691 replacements.SetSchemeStr(scheme); 692 GURL url = wss_server.GetURL("connect_check.html").ReplaceComponents( 693 replacements); 694 695 // Setup page title observer. 696 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 697 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 698 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 699 700 // Add an entry into AutoSelectCertificateForUrls policy for automatic client 701 // cert selection. 702 Profile* profile = Profile::FromBrowserContext(tab->GetBrowserContext()); 703 DCHECK(profile); 704 scoped_ptr<DictionaryValue> dict(new DictionaryValue()); 705 dict->SetString("ISSUER.CN", "pywebsocket"); 706 profile->GetHostContentSettingsMap()->SetWebsiteSetting( 707 ContentSettingsPattern::FromURL(url), 708 ContentSettingsPattern::FromURL(url), 709 CONTENT_SETTINGS_TYPE_AUTO_SELECT_CERTIFICATE, 710 std::string(), 711 dict.release()); 712 713 // Visit a HTTPS page which requires client certs. 714 ui_test_utils::NavigateToURL(browser(), url); 715 CheckAuthenticatedState(tab, false); 716 717 // Test page runs a WebSocket wss connection test. The result will be shown 718 // as page title. 719 const base::string16 result = watcher.WaitAndGetTitle(); 720 EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass")); 721 } 722 #endif // defined(USE_NSS) 723 724 // Flaky on CrOS http://crbug.com/92292 725 #if defined(OS_CHROMEOS) 726 #define MAYBE_TestHTTPSErrorWithNoNavEntry \ 727 DISABLED_TestHTTPSErrorWithNoNavEntry 728 #else 729 #define MAYBE_TestHTTPSErrorWithNoNavEntry TestHTTPSErrorWithNoNavEntry 730 #endif // defined(OS_CHROMEOS) 731 732 // Open a page with a HTTPS error in a tab with no prior navigation (through a 733 // link with a blank target). This is to test that the lack of navigation entry 734 // does not cause any problems (it was causing a crasher, see 735 // http://crbug.com/19941). 736 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestHTTPSErrorWithNoNavEntry) { 737 ASSERT_TRUE(https_server_expired_.Start()); 738 739 GURL url = https_server_expired_.GetURL("files/ssl/google.htm"); 740 WebContents* tab2 = chrome::AddSelectedTabWithURL( 741 browser(), url, content::PAGE_TRANSITION_TYPED); 742 content::WaitForLoadStop(tab2); 743 744 // Verify our assumption that there was no prior navigation. 745 EXPECT_FALSE(chrome::CanGoBack(browser())); 746 747 // We should have an interstitial page showing. 748 ASSERT_TRUE(tab2->GetInterstitialPage()); 749 } 750 751 IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadHTTPSDownload) { 752 ASSERT_TRUE(test_server()->Start()); 753 ASSERT_TRUE(https_server_expired_.Start()); 754 GURL url_non_dangerous = test_server()->GetURL(std::string()); 755 GURL url_dangerous = 756 https_server_expired_.GetURL("files/downloads/dangerous/dangerous.exe"); 757 base::ScopedTempDir downloads_directory_; 758 759 // Need empty temp dir to avoid having Chrome ask us for a new filename 760 // when we've downloaded dangerous.exe one hundred times. 761 ASSERT_TRUE(downloads_directory_.CreateUniqueTempDir()); 762 763 browser()->profile()->GetPrefs()->SetFilePath( 764 prefs::kDownloadDefaultDirectory, 765 downloads_directory_.path()); 766 767 // Visit a non-dangerous page. 768 ui_test_utils::NavigateToURL(browser(), url_non_dangerous); 769 770 // Now, start a transition to dangerous download. 771 { 772 content::WindowedNotificationObserver observer( 773 content::NOTIFICATION_LOAD_STOP, 774 content::NotificationService::AllSources()); 775 chrome::NavigateParams navigate_params(browser(), url_dangerous, 776 content::PAGE_TRANSITION_TYPED); 777 chrome::Navigate(&navigate_params); 778 observer.Wait(); 779 } 780 781 // To exit the browser cleanly (and this test) we need to complete the 782 // download after completing this test. 783 content::DownloadTestObserverTerminal dangerous_download_observer( 784 content::BrowserContext::GetDownloadManager(browser()->profile()), 785 1, 786 content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_ACCEPT); 787 788 // Proceed through the SSL interstitial. This doesn't use 789 // |ProceedThroughInterstitial| since no page load will commit. 790 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 791 ASSERT_TRUE(tab != NULL); 792 ASSERT_TRUE(tab->GetInterstitialPage() != NULL); 793 { 794 content::WindowedNotificationObserver observer( 795 chrome::NOTIFICATION_DOWNLOAD_INITIATED, 796 content::NotificationService::AllSources()); 797 tab->GetInterstitialPage()->Proceed(); 798 observer.Wait(); 799 } 800 801 // There should still be an interstitial at this point. Press the 802 // back button on the browser. Note that this doesn't wait for a 803 // NAV_ENTRY_COMMITTED notification because going back with an 804 // active interstitial simply hides the interstitial. 805 ASSERT_TRUE(tab->GetInterstitialPage() != NULL); 806 EXPECT_TRUE(chrome::CanGoBack(browser())); 807 chrome::GoBack(browser(), CURRENT_TAB); 808 809 dangerous_download_observer.WaitForFinished(); 810 } 811 812 // 813 // Insecure content 814 // 815 816 #if defined(OS_WIN) 817 // http://crbug.com/152940 Flaky on win. 818 #define MAYBE_TestDisplaysInsecureContent DISABLED_TestDisplaysInsecureContent 819 #else 820 #define MAYBE_TestDisplaysInsecureContent TestDisplaysInsecureContent 821 #endif 822 823 // Visits a page that displays insecure content. 824 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestDisplaysInsecureContent) { 825 ASSERT_TRUE(test_server()->Start()); 826 ASSERT_TRUE(https_server_.Start()); 827 828 std::string replacement_path; 829 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 830 "files/ssl/page_displays_insecure_content.html", 831 test_server()->host_port_pair(), 832 &replacement_path)); 833 834 // Load a page that displays insecure content. 835 ui_test_utils::NavigateToURL(browser(), 836 https_server_.GetURL(replacement_path)); 837 838 CheckAuthenticatedState( 839 browser()->tab_strip_model()->GetActiveWebContents(), true); 840 } 841 842 // Visits a page that runs insecure content and tries to suppress the insecure 843 // content warnings by randomizing location.hash. 844 // Based on http://crbug.com/8706 845 IN_PROC_BROWSER_TEST_F(SSLUITest, 846 TestRunsInsecuredContentRandomizeHash) { 847 ASSERT_TRUE(test_server()->Start()); 848 ASSERT_TRUE(https_server_.Start()); 849 850 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL( 851 "files/ssl/page_runs_insecure_content.html")); 852 853 CheckAuthenticationBrokenState( 854 browser()->tab_strip_model()->GetActiveWebContents(), 0, true, false); 855 } 856 857 // Visits a page with unsafe content and make sure that: 858 // - frames content is replaced with warning 859 // - images and scripts are filtered out entirely 860 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContents) { 861 ASSERT_TRUE(https_server_.Start()); 862 ASSERT_TRUE(https_server_expired_.Start()); 863 864 std::string replacement_path; 865 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 866 "files/ssl/page_with_unsafe_contents.html", 867 https_server_expired_.host_port_pair(), 868 &replacement_path)); 869 ui_test_utils::NavigateToURL(browser(), 870 https_server_.GetURL(replacement_path)); 871 872 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 873 // When the bad content is filtered, the state is expected to be 874 // authenticated. 875 CheckAuthenticatedState(tab, false); 876 877 // Because of cross-frame scripting restrictions, we cannot access the iframe 878 // content. So to know if the frame was loaded, we just check if a popup was 879 // opened (the iframe content opens one). 880 // Note: because of bug 1115868, no web contents modal dialog is opened right 881 // now. Once the bug is fixed, this will do the real check. 882 EXPECT_FALSE(IsShowingWebContentsModalDialog()); 883 884 int img_width; 885 EXPECT_TRUE(content::ExecuteScriptAndExtractInt( 886 tab, 887 "window.domAutomationController.send(ImageWidth());", 888 &img_width)); 889 // In order to check that the image was not loaded, we check its width. 890 // The actual image (Google logo) is 114 pixels wide, we assume the broken 891 // image is less than 100. 892 EXPECT_LT(img_width, 100); 893 894 bool js_result = false; 895 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 896 tab, 897 "window.domAutomationController.send(IsFooSet());", 898 &js_result)); 899 EXPECT_FALSE(js_result); 900 } 901 902 // Visits a page with insecure content loaded by JS (after the initial page 903 // load). 904 IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentLoadedFromJS) { 905 ASSERT_TRUE(test_server()->Start()); 906 ASSERT_TRUE(https_server_.Start()); 907 908 std::string replacement_path; 909 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 910 "files/ssl/page_with_dynamic_insecure_content.html", 911 test_server()->host_port_pair(), 912 &replacement_path)); 913 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL( 914 replacement_path)); 915 916 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 917 CheckAuthenticatedState(tab, false); 918 919 // Load the insecure image. 920 bool js_result = false; 921 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 922 tab, 923 "loadBadImage();", 924 &js_result)); 925 EXPECT_TRUE(js_result); 926 927 // We should now have insecure content. 928 CheckAuthenticatedState(tab, true); 929 } 930 931 // Visits two pages from the same origin: one that displays insecure content and 932 // one that doesn't. The test checks that we do not propagate the insecure 933 // content state from one to the other. 934 IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysInsecureContentTwoTabs) { 935 ASSERT_TRUE(test_server()->Start()); 936 ASSERT_TRUE(https_server_.Start()); 937 938 ui_test_utils::NavigateToURL(browser(), 939 https_server_.GetURL("files/ssl/blank_page.html")); 940 941 WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents(); 942 943 // This tab should be fine. 944 CheckAuthenticatedState(tab1, false); 945 946 // Create a new tab. 947 std::string replacement_path; 948 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 949 "files/ssl/page_displays_insecure_content.html", 950 test_server()->host_port_pair(), 951 &replacement_path)); 952 953 GURL url = https_server_.GetURL(replacement_path); 954 chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED); 955 params.disposition = NEW_FOREGROUND_TAB; 956 params.tabstrip_index = 0; 957 params.source_contents = tab1; 958 content::WindowedNotificationObserver observer( 959 content::NOTIFICATION_LOAD_STOP, 960 content::NotificationService::AllSources()); 961 chrome::Navigate(¶ms); 962 WebContents* tab2 = params.target_contents; 963 observer.Wait(); 964 965 // The new tab has insecure content. 966 CheckAuthenticatedState(tab2, true); 967 968 // The original tab should not be contaminated. 969 CheckAuthenticatedState(tab1, false); 970 } 971 972 // Visits two pages from the same origin: one that runs insecure content and one 973 // that doesn't. The test checks that we propagate the insecure content state 974 // from one to the other. 975 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRunsInsecureContentTwoTabs) { 976 ASSERT_TRUE(test_server()->Start()); 977 ASSERT_TRUE(https_server_.Start()); 978 979 ui_test_utils::NavigateToURL(browser(), 980 https_server_.GetURL("files/ssl/blank_page.html")); 981 982 WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents(); 983 984 // This tab should be fine. 985 CheckAuthenticatedState(tab1, false); 986 987 std::string replacement_path; 988 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 989 "files/ssl/page_runs_insecure_content.html", 990 test_server()->host_port_pair(), 991 &replacement_path)); 992 993 // Create a new tab in the same process. Using a NEW_FOREGROUND_TAB 994 // disposition won't usually stay in the same process, but this works 995 // because we are using process-per-site in SetUpCommandLine. 996 GURL url = https_server_.GetURL(replacement_path); 997 chrome::NavigateParams params(browser(), url, content::PAGE_TRANSITION_TYPED); 998 params.disposition = NEW_FOREGROUND_TAB; 999 params.source_contents = tab1; 1000 content::WindowedNotificationObserver observer( 1001 content::NOTIFICATION_LOAD_STOP, 1002 content::NotificationService::AllSources()); 1003 chrome::Navigate(¶ms); 1004 WebContents* tab2 = params.target_contents; 1005 observer.Wait(); 1006 1007 // Both tabs should have the same process. 1008 EXPECT_EQ(tab1->GetRenderProcessHost(), tab2->GetRenderProcessHost()); 1009 1010 // The new tab has insecure content. 1011 CheckAuthenticationBrokenState(tab2, 0, true, false); 1012 1013 // Which means the origin for the first tab has also been contaminated with 1014 // insecure content. 1015 CheckAuthenticationBrokenState(tab1, 0, true, false); 1016 } 1017 1018 // Visits a page with an image over http. Visits another page over https 1019 // referencing that same image over http (hoping it is coming from the webcore 1020 // memory cache). 1021 IN_PROC_BROWSER_TEST_F(SSLUITest, TestDisplaysCachedInsecureContent) { 1022 ASSERT_TRUE(test_server()->Start()); 1023 ASSERT_TRUE(https_server_.Start()); 1024 1025 std::string replacement_path; 1026 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1027 "files/ssl/page_displays_insecure_content.html", 1028 test_server()->host_port_pair(), 1029 &replacement_path)); 1030 1031 // Load original page over HTTP. 1032 const GURL url_http = test_server()->GetURL(replacement_path); 1033 ui_test_utils::NavigateToURL(browser(), url_http); 1034 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1035 CheckUnauthenticatedState(tab); 1036 1037 // Load again but over SSL. It should be marked as displaying insecure 1038 // content (even though the image comes from the WebCore memory cache). 1039 const GURL url_https = https_server_.GetURL(replacement_path); 1040 ui_test_utils::NavigateToURL(browser(), url_https); 1041 CheckAuthenticatedState(tab, true); 1042 } 1043 1044 // http://crbug.com/84729 1045 #if defined(OS_CHROMEOS) 1046 #define MAYBE_TestRunsCachedInsecureContent \ 1047 DISABLED_TestRunsCachedInsecureContent 1048 #else 1049 #define MAYBE_TestRunsCachedInsecureContent TestRunsCachedInsecureContent 1050 #endif // defined(OS_CHROMEOS) 1051 1052 // Visits a page with script over http. Visits another page over https 1053 // referencing that same script over http (hoping it is coming from the webcore 1054 // memory cache). 1055 IN_PROC_BROWSER_TEST_F(SSLUITest, MAYBE_TestRunsCachedInsecureContent) { 1056 ASSERT_TRUE(test_server()->Start()); 1057 ASSERT_TRUE(https_server_.Start()); 1058 1059 std::string replacement_path; 1060 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1061 "files/ssl/page_runs_insecure_content.html", 1062 test_server()->host_port_pair(), 1063 &replacement_path)); 1064 1065 // Load original page over HTTP. 1066 const GURL url_http = test_server()->GetURL(replacement_path); 1067 ui_test_utils::NavigateToURL(browser(), url_http); 1068 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1069 CheckUnauthenticatedState(tab); 1070 1071 // Load again but over SSL. It should be marked as displaying insecure 1072 // content (even though the image comes from the WebCore memory cache). 1073 const GURL url_https = https_server_.GetURL(replacement_path); 1074 ui_test_utils::NavigateToURL(browser(), url_https); 1075 CheckAuthenticationBrokenState(tab, 0, true, false); 1076 } 1077 1078 // This test ensures the CN invalid status does not 'stick' to a certificate 1079 // (see bug #1044942) and that it depends on the host-name. 1080 IN_PROC_BROWSER_TEST_F(SSLUITest, TestCNInvalidStickiness) { 1081 ASSERT_TRUE(https_server_.Start()); 1082 ASSERT_TRUE(https_server_mismatched_.Start()); 1083 1084 // First we hit the server with hostname, this generates an invalid policy 1085 // error. 1086 ui_test_utils::NavigateToURL(browser(), 1087 https_server_mismatched_.GetURL("files/ssl/google.html")); 1088 1089 // We get an interstitial page as a result. 1090 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1091 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, 1092 false, true); // Interstitial showing. 1093 ProceedThroughInterstitial(tab); 1094 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, 1095 false, false); // No interstitial showing. 1096 1097 // Now we try again with the right host name this time. 1098 GURL url(https_server_.GetURL("files/ssl/google.html")); 1099 ui_test_utils::NavigateToURL(browser(), url); 1100 1101 // Security state should be OK. 1102 CheckAuthenticatedState(tab, false); 1103 1104 // Now try again the broken one to make sure it is still broken. 1105 ui_test_utils::NavigateToURL(browser(), 1106 https_server_mismatched_.GetURL("files/ssl/google.html")); 1107 1108 // Since we OKed the interstitial last time, we get right to the page. 1109 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_COMMON_NAME_INVALID, 1110 false, false); // No interstitial showing. 1111 } 1112 1113 #if defined(OS_CHROMEOS) 1114 // This test seems to be flaky and hang on chromiumos. 1115 // http://crbug.com/84419 1116 #define MAYBE_TestRefNavigation DISABLED_TestRefNavigation 1117 #else 1118 #define MAYBE_TestRefNavigation TestRefNavigation 1119 #endif 1120 1121 // Test that navigating to a #ref does not change a bad security state. 1122 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRefNavigation) { 1123 ASSERT_TRUE(https_server_expired_.Start()); 1124 1125 ui_test_utils::NavigateToURL(browser(), 1126 https_server_expired_.GetURL("files/ssl/page_with_refs.html")); 1127 1128 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1129 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1130 true); // Interstitial showing. 1131 1132 ProceedThroughInterstitial(tab); 1133 1134 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1135 false); // No interstitial showing. 1136 1137 // Now navigate to a ref in the page, the security state should not have 1138 // changed. 1139 ui_test_utils::NavigateToURL(browser(), 1140 https_server_expired_.GetURL("files/ssl/page_with_refs.html#jp")); 1141 1142 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1143 false); // No interstitial showing. 1144 } 1145 1146 // Tests that closing a page that has a unsafe pop-up does not crash the 1147 // browser (bug #1966). 1148 // TODO(jcampan): http://crbug.com/2136 disabled because the popup is not 1149 // opened as it is not initiated by a user gesture. 1150 IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestCloseTabWithUnsafePopup) { 1151 ASSERT_TRUE(test_server()->Start()); 1152 ASSERT_TRUE(https_server_expired_.Start()); 1153 1154 std::string replacement_path; 1155 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1156 "files/ssl/page_with_unsafe_popup.html", 1157 https_server_expired_.host_port_pair(), 1158 &replacement_path)); 1159 1160 ui_test_utils::NavigateToURL(browser(), 1161 test_server()->GetURL(replacement_path)); 1162 1163 WebContents* tab1 = browser()->tab_strip_model()->GetActiveWebContents(); 1164 // It is probably overkill to add a notification for a popup-opening, let's 1165 // just poll. 1166 for (int i = 0; i < 10; i++) { 1167 if (IsShowingWebContentsModalDialog()) 1168 break; 1169 base::MessageLoop::current()->PostDelayedTask( 1170 FROM_HERE, 1171 base::MessageLoop::QuitClosure(), 1172 base::TimeDelta::FromSeconds(1)); 1173 content::RunMessageLoop(); 1174 } 1175 ASSERT_TRUE(IsShowingWebContentsModalDialog()); 1176 1177 // Let's add another tab to make sure the browser does not exit when we close 1178 // the first tab. 1179 GURL url = test_server()->GetURL("files/ssl/google.html"); 1180 content::WindowedNotificationObserver observer( 1181 content::NOTIFICATION_LOAD_STOP, 1182 content::NotificationService::AllSources()); 1183 chrome::AddSelectedTabWithURL(browser(), url, content::PAGE_TRANSITION_TYPED); 1184 observer.Wait(); 1185 1186 // Close the first tab. 1187 chrome::CloseWebContents(browser(), tab1, false); 1188 } 1189 1190 // Visit a page over bad https that is a redirect to a page with good https. 1191 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectBadToGoodHTTPS) { 1192 ASSERT_TRUE(https_server_.Start()); 1193 ASSERT_TRUE(https_server_expired_.Start()); 1194 1195 GURL url1 = https_server_expired_.GetURL("server-redirect?"); 1196 GURL url2 = https_server_.GetURL("files/ssl/google.html"); 1197 1198 ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec())); 1199 1200 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1201 1202 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1203 true); // Interstitial showing. 1204 1205 ProceedThroughInterstitial(tab); 1206 1207 // We have been redirected to the good page. 1208 CheckAuthenticatedState(tab, false); 1209 } 1210 1211 // Visit a page over good https that is a redirect to a page with bad https. 1212 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectGoodToBadHTTPS) { 1213 ASSERT_TRUE(https_server_.Start()); 1214 ASSERT_TRUE(https_server_expired_.Start()); 1215 1216 GURL url1 = https_server_.GetURL("server-redirect?"); 1217 GURL url2 = https_server_expired_.GetURL("files/ssl/google.html"); 1218 ui_test_utils::NavigateToURL(browser(), GURL(url1.spec() + url2.spec())); 1219 1220 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1221 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1222 true); // Interstitial showing. 1223 1224 ProceedThroughInterstitial(tab); 1225 1226 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1227 false); // No interstitial showing. 1228 } 1229 1230 // Visit a page over http that is a redirect to a page with good HTTPS. 1231 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToGoodHTTPS) { 1232 ASSERT_TRUE(test_server()->Start()); 1233 ASSERT_TRUE(https_server_.Start()); 1234 1235 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1236 1237 // HTTP redirects to good HTTPS. 1238 GURL http_url = test_server()->GetURL("server-redirect?"); 1239 GURL good_https_url = 1240 https_server_.GetURL("files/ssl/google.html"); 1241 1242 ui_test_utils::NavigateToURL(browser(), 1243 GURL(http_url.spec() + good_https_url.spec())); 1244 CheckAuthenticatedState(tab, false); 1245 } 1246 1247 // Visit a page over http that is a redirect to a page with bad HTTPS. 1248 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPToBadHTTPS) { 1249 ASSERT_TRUE(test_server()->Start()); 1250 ASSERT_TRUE(https_server_expired_.Start()); 1251 1252 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1253 1254 GURL http_url = test_server()->GetURL("server-redirect?"); 1255 GURL bad_https_url = 1256 https_server_expired_.GetURL("files/ssl/google.html"); 1257 ui_test_utils::NavigateToURL(browser(), 1258 GURL(http_url.spec() + bad_https_url.spec())); 1259 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1260 true); // Interstitial showing. 1261 1262 ProceedThroughInterstitial(tab); 1263 1264 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1265 false); // No interstitial showing. 1266 } 1267 1268 // Visit a page over https that is a redirect to a page with http (to make sure 1269 // we don't keep the secure state). 1270 IN_PROC_BROWSER_TEST_F(SSLUITest, TestRedirectHTTPSToHTTP) { 1271 ASSERT_TRUE(test_server()->Start()); 1272 ASSERT_TRUE(https_server_.Start()); 1273 1274 GURL https_url = https_server_.GetURL("server-redirect?"); 1275 GURL http_url = test_server()->GetURL("files/ssl/google.html"); 1276 1277 ui_test_utils::NavigateToURL(browser(), 1278 GURL(https_url.spec() + http_url.spec())); 1279 CheckUnauthenticatedState( 1280 browser()->tab_strip_model()->GetActiveWebContents()); 1281 } 1282 1283 // Visits a page to which we could not connect (bad port) over http and https 1284 // and make sure the security style is correct. 1285 IN_PROC_BROWSER_TEST_F(SSLUITest, TestConnectToBadPort) { 1286 ui_test_utils::NavigateToURL(browser(), GURL("http://localhost:17")); 1287 CheckUnauthenticatedState( 1288 browser()->tab_strip_model()->GetActiveWebContents()); 1289 1290 // Same thing over HTTPS. 1291 ui_test_utils::NavigateToURL(browser(), GURL("https://localhost:17")); 1292 CheckUnauthenticatedState( 1293 browser()->tab_strip_model()->GetActiveWebContents()); 1294 } 1295 1296 // 1297 // Frame navigation 1298 // 1299 1300 // From a good HTTPS top frame: 1301 // - navigate to an OK HTTPS frame 1302 // - navigate to a bad HTTPS (expect unsafe content and filtered frame), then 1303 // back 1304 // - navigate to HTTP (expect insecure content), then back 1305 IN_PROC_BROWSER_TEST_F(SSLUITest, TestGoodFrameNavigation) { 1306 ASSERT_TRUE(test_server()->Start()); 1307 ASSERT_TRUE(https_server_.Start()); 1308 ASSERT_TRUE(https_server_expired_.Start()); 1309 1310 std::string top_frame_path; 1311 ASSERT_TRUE(GetTopFramePath(*test_server(), 1312 https_server_, 1313 https_server_expired_, 1314 &top_frame_path)); 1315 1316 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1317 ui_test_utils::NavigateToURL(browser(), 1318 https_server_.GetURL(top_frame_path)); 1319 1320 CheckAuthenticatedState(tab, false); 1321 1322 bool success = false; 1323 // Now navigate inside the frame. 1324 { 1325 content::WindowedNotificationObserver observer( 1326 content::NOTIFICATION_LOAD_STOP, 1327 content::Source<NavigationController>(&tab->GetController())); 1328 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1329 tab, 1330 "window.domAutomationController.send(clickLink('goodHTTPSLink'));", 1331 &success)); 1332 ASSERT_TRUE(success); 1333 observer.Wait(); 1334 } 1335 1336 // We should still be fine. 1337 CheckAuthenticatedState(tab, false); 1338 1339 // Now let's hit a bad page. 1340 { 1341 content::WindowedNotificationObserver observer( 1342 content::NOTIFICATION_LOAD_STOP, 1343 content::Source<NavigationController>(&tab->GetController())); 1344 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1345 tab, 1346 "window.domAutomationController.send(clickLink('badHTTPSLink'));", 1347 &success)); 1348 ASSERT_TRUE(success); 1349 observer.Wait(); 1350 } 1351 1352 // The security style should still be secure. 1353 CheckAuthenticatedState(tab, false); 1354 1355 // And the frame should be blocked. 1356 bool is_content_evil = true; 1357 std::string content_frame_xpath("html/frameset/frame[2]"); 1358 std::string is_evil_js("window.domAutomationController.send(" 1359 "document.getElementById('evilDiv') != null);"); 1360 EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool( 1361 tab, 1362 content_frame_xpath, 1363 is_evil_js, 1364 &is_content_evil)); 1365 EXPECT_FALSE(is_content_evil); 1366 1367 // Now go back, our state should still be OK. 1368 { 1369 content::WindowedNotificationObserver observer( 1370 content::NOTIFICATION_LOAD_STOP, 1371 content::Source<NavigationController>(&tab->GetController())); 1372 tab->GetController().GoBack(); 1373 observer.Wait(); 1374 } 1375 CheckAuthenticatedState(tab, false); 1376 1377 // Navigate to a page served over HTTP. 1378 { 1379 content::WindowedNotificationObserver observer( 1380 content::NOTIFICATION_LOAD_STOP, 1381 content::Source<NavigationController>(&tab->GetController())); 1382 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1383 tab, 1384 "window.domAutomationController.send(clickLink('HTTPLink'));", 1385 &success)); 1386 ASSERT_TRUE(success); 1387 observer.Wait(); 1388 } 1389 1390 // Our state should be unathenticated (in the ran mixed script sense) 1391 CheckBrokenAuthenticatedState(tab); 1392 1393 // Go back, our state should be unchanged. 1394 { 1395 content::WindowedNotificationObserver observer( 1396 content::NOTIFICATION_LOAD_STOP, 1397 content::Source<NavigationController>(&tab->GetController())); 1398 tab->GetController().GoBack(); 1399 observer.Wait(); 1400 } 1401 1402 CheckBrokenAuthenticatedState(tab); 1403 } 1404 1405 // From a bad HTTPS top frame: 1406 // - navigate to an OK HTTPS frame (expected to be still authentication broken). 1407 IN_PROC_BROWSER_TEST_F(SSLUITest, TestBadFrameNavigation) { 1408 ASSERT_TRUE(https_server_.Start()); 1409 ASSERT_TRUE(https_server_expired_.Start()); 1410 1411 std::string top_frame_path; 1412 ASSERT_TRUE(GetTopFramePath(*test_server(), 1413 https_server_, 1414 https_server_expired_, 1415 &top_frame_path)); 1416 1417 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1418 ui_test_utils::NavigateToURL(browser(), 1419 https_server_expired_.GetURL(top_frame_path)); 1420 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1421 true); // Interstitial showing 1422 1423 ProceedThroughInterstitial(tab); 1424 1425 // Navigate to a good frame. 1426 bool success = false; 1427 content::WindowedNotificationObserver observer( 1428 content::NOTIFICATION_LOAD_STOP, 1429 content::Source<NavigationController>(&tab->GetController())); 1430 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1431 tab, 1432 "window.domAutomationController.send(clickLink('goodHTTPSLink'));", 1433 &success)); 1434 ASSERT_TRUE(success); 1435 observer.Wait(); 1436 1437 // We should still be authentication broken. 1438 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1439 false); 1440 } 1441 1442 // From an HTTP top frame, navigate to good and bad HTTPS (security state should 1443 // stay unauthenticated). 1444 // Disabled, flakily exceeds test timeout, http://crbug.com/43437. 1445 IN_PROC_BROWSER_TEST_F(SSLUITest, DISABLED_TestUnauthenticatedFrameNavigation) { 1446 ASSERT_TRUE(test_server()->Start()); 1447 ASSERT_TRUE(https_server_.Start()); 1448 ASSERT_TRUE(https_server_expired_.Start()); 1449 1450 std::string top_frame_path; 1451 ASSERT_TRUE(GetTopFramePath(*test_server(), 1452 https_server_, 1453 https_server_expired_, 1454 &top_frame_path)); 1455 1456 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1457 ui_test_utils::NavigateToURL(browser(), 1458 test_server()->GetURL(top_frame_path)); 1459 CheckUnauthenticatedState(tab); 1460 1461 // Now navigate inside the frame to a secure HTTPS frame. 1462 { 1463 bool success = false; 1464 content::WindowedNotificationObserver observer( 1465 content::NOTIFICATION_LOAD_STOP, 1466 content::Source<NavigationController>(&tab->GetController())); 1467 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1468 tab, 1469 "window.domAutomationController.send(clickLink('goodHTTPSLink'));", 1470 &success)); 1471 ASSERT_TRUE(success); 1472 observer.Wait(); 1473 } 1474 1475 // We should still be unauthenticated. 1476 CheckUnauthenticatedState(tab); 1477 1478 // Now navigate to a bad HTTPS frame. 1479 { 1480 bool success = false; 1481 content::WindowedNotificationObserver observer( 1482 content::NOTIFICATION_LOAD_STOP, 1483 content::Source<NavigationController>(&tab->GetController())); 1484 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( 1485 tab, 1486 "window.domAutomationController.send(clickLink('badHTTPSLink'));", 1487 &success)); 1488 ASSERT_TRUE(success); 1489 observer.Wait(); 1490 } 1491 1492 // State should not have changed. 1493 CheckUnauthenticatedState(tab); 1494 1495 // And the frame should have been blocked (see bug #2316). 1496 bool is_content_evil = true; 1497 std::string content_frame_xpath("html/frameset/frame[2]"); 1498 std::string is_evil_js("window.domAutomationController.send(" 1499 "document.getElementById('evilDiv') != null);"); 1500 EXPECT_TRUE(content::ExecuteScriptInFrameAndExtractBool( 1501 tab, 1502 content_frame_xpath, 1503 is_evil_js, 1504 &is_content_evil)); 1505 EXPECT_FALSE(is_content_evil); 1506 } 1507 1508 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorkerFiltered) { 1509 ASSERT_TRUE(https_server_.Start()); 1510 ASSERT_TRUE(https_server_expired_.Start()); 1511 1512 // This page will spawn a Worker which will try to load content from 1513 // BadCertServer. 1514 std::string page_with_unsafe_worker_path; 1515 ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_, 1516 &page_with_unsafe_worker_path)); 1517 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL( 1518 page_with_unsafe_worker_path)); 1519 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1520 // Expect Worker not to load insecure content. 1521 CheckWorkerLoadResult(tab, false); 1522 // The bad content is filtered, expect the state to be authenticated. 1523 CheckAuthenticatedState(tab, false); 1524 } 1525 1526 IN_PROC_BROWSER_TEST_F(SSLUITest, TestUnsafeContentsInWorker) { 1527 ASSERT_TRUE(https_server_.Start()); 1528 ASSERT_TRUE(https_server_expired_.Start()); 1529 1530 // Navigate to an unsafe site. Proceed with interstitial page to indicate 1531 // the user approves the bad certificate. 1532 ui_test_utils::NavigateToURL(browser(), 1533 https_server_expired_.GetURL("files/ssl/blank_page.html")); 1534 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1535 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1536 true); // Interstitial showing 1537 ProceedThroughInterstitial(tab); 1538 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1539 false); // No Interstitial 1540 1541 // Navigate to safe page that has Worker loading unsafe content. 1542 // Expect content to load but be marked as auth broken due to running insecure 1543 // content. 1544 std::string page_with_unsafe_worker_path; 1545 ASSERT_TRUE(GetPageWithUnsafeWorkerPath(https_server_expired_, 1546 &page_with_unsafe_worker_path)); 1547 ui_test_utils::NavigateToURL(browser(), https_server_.GetURL( 1548 page_with_unsafe_worker_path)); 1549 CheckWorkerLoadResult(tab, true); // Worker loads insecure content 1550 CheckAuthenticationBrokenState(tab, 0, true, false); 1551 } 1552 1553 // Test that when the browser blocks displaying insecure content (images), the 1554 // indicator shows a secure page, because the blocking made the otherwise 1555 // unsafe page safe (the notification of this state is handled by other means). 1556 IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureImage) { 1557 ASSERT_TRUE(test_server()->Start()); 1558 ASSERT_TRUE(https_server_.Start()); 1559 1560 std::string replacement_path; 1561 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1562 "files/ssl/page_displays_insecure_content.html", 1563 test_server()->host_port_pair(), 1564 &replacement_path)); 1565 1566 ui_test_utils::NavigateToURL(browser(), 1567 https_server_.GetURL(replacement_path)); 1568 1569 CheckAuthenticatedState( 1570 browser()->tab_strip_model()->GetActiveWebContents(), false); 1571 } 1572 1573 // Test that when the browser blocks displaying insecure content (iframes), the 1574 // indicator shows a secure page, because the blocking made the otherwise 1575 // unsafe page safe (the notification of this state is handled by other means) 1576 IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockDisplayingInsecureIframe) { 1577 ASSERT_TRUE(test_server()->Start()); 1578 ASSERT_TRUE(https_server_.Start()); 1579 1580 std::string replacement_path; 1581 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1582 "files/ssl/page_displays_insecure_iframe.html", 1583 test_server()->host_port_pair(), 1584 &replacement_path)); 1585 1586 ui_test_utils::NavigateToURL(browser(), 1587 https_server_.GetURL(replacement_path)); 1588 1589 CheckAuthenticatedState( 1590 browser()->tab_strip_model()->GetActiveWebContents(), false); 1591 } 1592 1593 1594 // Test that when the browser blocks running insecure content, the 1595 // indicator shows a secure page, because the blocking made the otherwise 1596 // unsafe page safe (the notification of this state is handled by other means). 1597 IN_PROC_BROWSER_TEST_F(SSLUITestBlock, TestBlockRunningInsecureContent) { 1598 ASSERT_TRUE(test_server()->Start()); 1599 ASSERT_TRUE(https_server_.Start()); 1600 1601 std::string replacement_path; 1602 ASSERT_TRUE(GetFilePathWithHostAndPortReplacement( 1603 "files/ssl/page_runs_insecure_content.html", 1604 test_server()->host_port_pair(), 1605 &replacement_path)); 1606 1607 ui_test_utils::NavigateToURL(browser(), 1608 https_server_.GetURL(replacement_path)); 1609 1610 CheckAuthenticatedState( 1611 browser()->tab_strip_model()->GetActiveWebContents(), false); 1612 } 1613 1614 // Visit a page and establish a WebSocket connection over bad https with 1615 // --ignore-certificate-errors. The connection should be established without 1616 // interstitial page showing. 1617 IN_PROC_BROWSER_TEST_F(SSLUITestIgnoreCertErrors, TestWSS) { 1618 ASSERT_TRUE(test_server()->Start()); 1619 ASSERT_TRUE(wss_server_expired_.Start()); 1620 1621 // Setup page title observer. 1622 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1623 content::TitleWatcher watcher(tab, ASCIIToUTF16("PASS")); 1624 watcher.AlsoWaitForTitle(ASCIIToUTF16("FAIL")); 1625 1626 // Visit bad HTTPS page. 1627 std::string scheme("https"); 1628 GURL::Replacements replacements; 1629 replacements.SetSchemeStr(scheme); 1630 ui_test_utils::NavigateToURL( 1631 browser(), 1632 wss_server_expired_.GetURL( 1633 "connect_check.html").ReplaceComponents(replacements)); 1634 1635 // We shouldn't have an interstitial page showing here. 1636 1637 // Test page run a WebSocket wss connection test. The result will be shown 1638 // as page title. 1639 const base::string16 result = watcher.WaitAndGetTitle(); 1640 EXPECT_TRUE(LowerCaseEqualsASCII(result, "pass")); 1641 } 1642 1643 // Verifies that if JavaScript is disabled interstitials aren't affected. 1644 // http://crbug.com/322948 1645 IN_PROC_BROWSER_TEST_F(SSLUITest, InterstitialNotAffectedByContentSettings) { 1646 browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting( 1647 CONTENT_SETTINGS_TYPE_JAVASCRIPT, CONTENT_SETTING_BLOCK); 1648 1649 ASSERT_TRUE(https_server_expired_.Start()); 1650 WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents(); 1651 ui_test_utils::NavigateToURL(browser(), 1652 https_server_expired_.GetURL("files/ssl/google.html")); 1653 CheckAuthenticationBrokenState(tab, net::CERT_STATUS_DATE_INVALID, false, 1654 true); // Interstitial showing 1655 1656 InterstitialPage* interstitial_page = tab->GetInterstitialPage(); 1657 content::RenderViewHost* interstitial_rvh = 1658 interstitial_page->GetRenderViewHostForTesting(); 1659 bool result = false; 1660 ASSERT_TRUE(content::ExecuteScriptAndExtractBool( 1661 interstitial_rvh, 1662 "window.domAutomationController.send(true);", 1663 &result)); 1664 // The above will hang without the fix. 1665 ASSERT_TRUE(result); 1666 } 1667 1668 // TODO(jcampan): more tests to do below. 1669 1670 // Visit a page over https that contains a frame with a redirect. 1671 1672 // XMLHttpRequest insecure content in synchronous mode. 1673 1674 // XMLHttpRequest insecure content in asynchronous mode. 1675 1676 // XMLHttpRequest over bad ssl in synchronous mode. 1677 1678 // XMLHttpRequest over OK ssl in synchronous mode. 1679