Chromium Code Reviews| Index: chrome/browser/captive_portal/captive_portal_browsertest.cc |
| diff --git a/chrome/browser/captive_portal/captive_portal_browsertest.cc b/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| index 2a8749ec8fd09f1f53dd64776238fa4d0ede991b..8a4dfc925091536d8ecffa12c45458cb7719f754 100644 |
| --- a/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| +++ b/chrome/browser/captive_portal/captive_portal_browsertest.cc |
| @@ -19,6 +19,7 @@ |
| #include "chrome/browser/captive_portal/captive_portal_tab_helper.h" |
| #include "chrome/browser/captive_portal/captive_portal_tab_reloader.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| +#include "chrome/browser/interstitials/security_interstitial_page.h" |
| #include "chrome/browser/net/url_request_mock_util.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/ui/browser.h" |
| @@ -33,7 +34,10 @@ |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| #include "content/public/browser/browser_thread.h" |
| +#include "content/public/browser/interstitial_page.h" |
| +#include "content/public/browser/interstitial_page_delegate.h" |
| #include "content/public/browser/navigation_controller.h" |
| +#include "content/public/browser/navigation_entry.h" |
| #include "content/public/browser/notification_observer.h" |
| #include "content/public/browser/notification_registrar.h" |
| #include "content/public/browser/notification_service.h" |
| @@ -690,7 +694,7 @@ class CaptivePortalObserver : public content::NotificationObserver { |
| explicit CaptivePortalObserver(Profile* profile); |
| // Runs the message loop until until at exactly |update_count| capitive portal |
| - // results have been received, since this creation of |this|. Expects no |
| + // results have been received, since the creation of |this|. Expects no |
| // additional captive portal results. |
| void WaitForResults(int num_results_to_wait_for); |
| @@ -816,6 +820,10 @@ class CaptivePortalBrowserTest : public InProcessBrowserTest { |
| // check. |
| bool CheckPending(Browser* browser); |
| + // Returns the type of the interstitial being shown. |
| + SecurityInterstitialPage::Type GetInterstitialType( |
| + WebContents* contents) const; |
| + |
| // Returns the CaptivePortalTabReloader::State of |web_contents|. |
| CaptivePortalTabReloader::State GetStateOfTabReloader( |
| WebContents* web_contents) const; |
| @@ -949,6 +957,9 @@ class CaptivePortalBrowserTest : public InProcessBrowserTest { |
| void SetSlowSSLLoadTime(CaptivePortalTabReloader* tab_reloader, |
| base::TimeDelta slow_ssl_load_time); |
| + void SetSSLErrorDisplayDelay(CaptivePortalTabHelper* tab_helper, |
| + base::TimeDelta ssl_error_delay); |
| + |
| CaptivePortalTabReloader* GetTabReloader(WebContents* web_contents) const; |
| private: |
| @@ -1012,6 +1023,16 @@ bool CaptivePortalBrowserTest::CheckPending(Browser* browser) { |
| captive_portal_service->TimerRunning(); |
| } |
| +SecurityInterstitialPage::Type CaptivePortalBrowserTest::GetInterstitialType( |
| + WebContents* contents) const { |
| + DCHECK(contents->ShowingInterstitialPage()); |
| + SecurityInterstitialPage* blocking_page = |
| + static_cast<SecurityInterstitialPage*>( |
| + contents->GetInterstitialPage()->GetDelegateForTesting()); |
| + DCHECK(blocking_page); |
| + return blocking_page->GetTypeForTesting(); |
| +} |
| + |
| CaptivePortalTabReloader::State CaptivePortalBrowserTest::GetStateOfTabReloader( |
| WebContents* web_contents) const { |
| return GetTabReloader(web_contents)->state(); |
| @@ -1546,6 +1567,12 @@ void CaptivePortalBrowserTest::SetSlowSSLLoadTime( |
| tab_reloader->set_slow_ssl_load_time(slow_ssl_load_time); |
| } |
| +void CaptivePortalBrowserTest::SetSSLErrorDisplayDelay( |
| + CaptivePortalTabHelper* tab_helper, |
| + base::TimeDelta ssl_error_delay) { |
| + tab_helper->SetSSLErrorDelayForTest(ssl_error_delay); |
| +} |
| + |
| CaptivePortalTabReloader* CaptivePortalBrowserTest::GetTabReloader( |
| WebContents* web_contents) const { |
| return CaptivePortalTabHelper::FromWebContents(web_contents)-> |
| @@ -1718,12 +1745,24 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, SSLCertErrorLogin) { |
| base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| ASSERT_TRUE(https_server.Start()); |
| + // Set SSL interstitial delay to zero so that a captive portal result can not |
| + // arrive during this window, so an SSL interstitial is displayed instead |
| + // of a captive portal error page. |
| + TabStripModel* tab_strip_model = browser()->tab_strip_model(); |
| + WebContents* broken_tab_contents = tab_strip_model->GetActiveWebContents(); |
| + SetSSLErrorDisplayDelay( |
| + CaptivePortalTabHelper::FromWebContents(broken_tab_contents), |
| + base::TimeDelta()); |
| + |
| // The path does not matter. |
| GURL cert_error_url = https_server.GetURL(kTestServerLoginPath); |
| // The interstitial should trigger a captive portal check when it opens, just |
| // like navigating to kMockHttpsQuickTimeoutUrl. |
| FastErrorBehindCaptivePortal(browser(), true, cert_error_url); |
| + EXPECT_EQ(SecurityInterstitialPage::SSL, |
| + GetInterstitialType(broken_tab_contents)); |
| + |
| // Simulate logging in. Can't use Login() because the interstitial tab looks |
| // like a cross between a hung tab (Load was never committed) and a tab at an |
| // error page (The load was stopped). |
| @@ -1731,7 +1770,6 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, SSLCertErrorLogin) { |
| MultiNavigationObserver navigation_observer; |
| CaptivePortalObserver portal_observer(browser()->profile()); |
| - TabStripModel* tab_strip_model = browser()->tab_strip_model(); |
| content::RenderFrameHost* render_frame_host = |
| tab_strip_model->GetActiveWebContents()->GetMainFrame(); |
| render_frame_host->ExecuteJavaScript(base::ASCIIToUTF16("submitForm()")); |
| @@ -2213,3 +2251,35 @@ IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, HstsLogin) { |
| Login(browser(), 1, 0); |
| FailLoadsAfterLogin(browser(), 1); |
| } |
| + |
| +// A cert error triggers a captive portal check and results in opening a login |
| +// tab. The user then logs in and the page with the error is reloaded. |
|
mmenke
2014/10/30 19:28:01
The last sentence is false.
mmenke
2014/10/30 19:28:01
I suggest putting more basic tests before ones tha
meacer
2014/11/06 21:21:55
Done.
|
| +IN_PROC_BROWSER_TEST_F(CaptivePortalBrowserTest, |
| + ShowCaptivePortalInterstitialOnCertError) { |
| + net::SpawnedTestServer::SSLOptions https_options; |
| + https_options.server_certificate = |
| + net::SpawnedTestServer::SSLOptions::CERT_MISMATCHED_NAME; |
| + net::SpawnedTestServer https_server( |
| + net::SpawnedTestServer::TYPE_HTTPS, https_options, |
| + base::FilePath(FILE_PATH_LITERAL("chrome/test/data"))); |
| + ASSERT_TRUE(https_server.Start()); |
| + |
| + // Set SSL interstitial delay long enough so that a captive portal result |
| + // is guaranteed to arrive during this window, and a captive portal |
| + // error page is displayed instead of an SSL interstitial. |
| + TabStripModel* tab_strip_model = browser()->tab_strip_model(); |
| + SetSSLErrorDisplayDelay( |
| + CaptivePortalTabHelper::FromWebContents( |
| + tab_strip_model->GetActiveWebContents()), |
| + base::TimeDelta::FromHours(1)); |
| + |
| + content::WebContents* web_contents = tab_strip_model->GetActiveWebContents(); |
| + // The path does not matter. |
| + GURL cert_error_url = https_server.GetURL(kTestServerLoginPath); |
| + // The interstitial should trigger a captive portal check when it opens, just |
| + // like navigating to kMockHttpsQuickTimeoutUrl. |
| + FastErrorBehindCaptivePortal(browser(), true, cert_error_url); |
| + |
| + EXPECT_EQ(SecurityInterstitialPage::CAPTIVE_PORTAL, |
| + GetInterstitialType(web_contents)); |
| +} |