Chromium Code Reviews| Index: chrome/browser/ui/login/login_prompt_browsertest.cc |
| diff --git a/chrome/browser/ui/login/login_prompt_browsertest.cc b/chrome/browser/ui/login/login_prompt_browsertest.cc |
| index 09821f3218573659e246541e25963fbe778300d4..9d39054dcd3c668d5497900abb67911a01711bb1 100644 |
| --- a/chrome/browser/ui/login/login_prompt_browsertest.cc |
| +++ b/chrome/browser/ui/login/login_prompt_browsertest.cc |
| @@ -157,8 +157,30 @@ class WindowedNavigationObserver |
| T, content::Source<NavigationController>(controller)) {} |
| }; |
| -typedef WindowedNavigationObserver<content::NOTIFICATION_LOAD_STOP> |
| - WindowedLoadStopObserver; |
| +// LOAD_STOP observer is special since we want to be able to wait for |
| +// multiple LOAD_STOP events. |
| +class WindowedLoadStopObserver |
|
Paweł Hajdan Jr.
2011/10/21 08:49:04
Could you please generalize it to chrome/test?
|
| + : public WindowedNavigationObserver<content::NOTIFICATION_LOAD_STOP> { |
| + public: |
| + WindowedLoadStopObserver(NavigationController* controller, |
| + int notification_count) |
| + : WindowedNavigationObserver<content::NOTIFICATION_LOAD_STOP>(controller), |
| + remaining_notification_count_(notification_count) {} |
|
cbentzel
2011/10/19 19:03:12
Do you need notification count? Is the sequence of
asanka
2011/10/19 19:21:17
In the TestCancelAuth test, when we initiate a nav
|
| + protected: |
| + virtual void Observe(int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) OVERRIDE; |
| + private: |
| + int remaining_notification_count_; // Number of notifications remaining. |
| +}; |
| + |
| +void WindowedLoadStopObserver::Observe( |
| + int type, |
| + const content::NotificationSource& source, |
| + const content::NotificationDetails& details) { |
| + if (--remaining_notification_count_ == 0) |
| + WindowedNotificationObserver::Observe(type, source, details); |
| +} |
| typedef WindowedNavigationObserver<chrome::NOTIFICATION_AUTH_NEEDED> |
| WindowedAuthNeededObserver; |
| @@ -178,6 +200,8 @@ const int kMultiRealmTestResourceCount = 4; |
| const char* kSingleRealmTestPage = "files/login/single_realm.html"; |
| const int kSingleRealmTestResourceCount = 6; |
| +const char* kAuthBasicPage = "auth-basic"; |
| + |
| // Confirm that <link rel="prefetch"> targetting an auth required |
| // resource does not provide a login dialog. These types of requests |
| // should instead just cancel the auth. |
| @@ -219,7 +243,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, PrefetchAuthCancels) { |
| observer.Register(content::Source<NavigationController>(controller)); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| browser()->OpenURL( |
| test_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| @@ -228,6 +252,100 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, PrefetchAuthCancels) { |
| EXPECT_TRUE(test_server()->Stop()); |
| } |
| +// Test login prompt cancellation. |
| +IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, TestCancelAuth) { |
| + ASSERT_TRUE(test_server()->Start()); |
| + GURL auth_page = test_server()->GetURL(kAuthBasicPage); |
| + GURL no_auth_page_1 = test_server()->GetURL("a"); |
| + GURL no_auth_page_2 = test_server()->GetURL("b"); |
| + GURL no_auth_page_3 = test_server()->GetURL("c"); |
| + |
| + TabContentsWrapper* contents = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents); |
| + |
| + NavigationController* controller = &contents->controller(); |
| + |
| + LoginPromptBrowserTestObserver observer; |
| + observer.Register(content::Source<NavigationController>(controller)); |
| + |
| + // First navigate to an unauthenticated page so we have something to |
| + // go back to. |
| + ui_test_utils::NavigateToURL(browser(), no_auth_page_1); |
| + |
| + // Navigating while auth is requested is the same as cancelling. |
| + { |
| + // We need to wait for two LOAD_STOP events. One for auth_page and one for |
| + // no_auth_page_2. |
| + WindowedLoadStopObserver load_stop_waiter(controller, 2); |
| + WindowedAuthNeededObserver auth_needed_waiter(controller); |
| + browser()->OpenURL( |
| + auth_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| + auth_needed_waiter.Wait(); |
| + WindowedAuthCancelledObserver auth_cancelled_waiter(controller); |
| + browser()->OpenURL( |
| + no_auth_page_2, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| + auth_cancelled_waiter.Wait(); |
| + load_stop_waiter.Wait(); |
| + EXPECT_TRUE(observer.handlers_.empty()); |
| + } |
| + |
| + // Try navigating backwards. |
| + { |
| + // As above, we wait for two LOAD_STOP events; one for each navigation. |
| + WindowedLoadStopObserver load_stop_waiter(controller, 2); |
| + WindowedAuthNeededObserver auth_needed_waiter(controller); |
| + browser()->OpenURL( |
| + auth_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| + auth_needed_waiter.Wait(); |
| + WindowedAuthCancelledObserver auth_cancelled_waiter(controller); |
| + ASSERT_TRUE(browser()->CanGoBack()); |
| + browser()->GoBack(CURRENT_TAB); |
| + auth_cancelled_waiter.Wait(); |
| + load_stop_waiter.Wait(); |
| + EXPECT_TRUE(observer.handlers_.empty()); |
| + } |
| + |
| + // Now add a page and go back, so we have something to go forward to. |
| + ui_test_utils::NavigateToURL(browser(), no_auth_page_3); |
| + { |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| + browser()->GoBack(CURRENT_TAB); // Should take us to page 1 |
| + load_stop_waiter.Wait(); |
| + } |
| + |
| + { |
| + // We wait for two LOAD_STOP events; one for each navigation. |
| + WindowedLoadStopObserver load_stop_waiter(controller, 2); |
| + WindowedAuthNeededObserver auth_needed_waiter(controller); |
| + browser()->OpenURL( |
| + auth_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| + auth_needed_waiter.Wait(); |
| + WindowedAuthCancelledObserver auth_cancelled_waiter(controller); |
| + ASSERT_TRUE(browser()->CanGoForward()); |
| + browser()->GoForward(CURRENT_TAB); // Should take us to page 3 |
| + auth_cancelled_waiter.Wait(); |
| + load_stop_waiter.Wait(); |
| + EXPECT_TRUE(observer.handlers_.empty()); |
| + } |
| + |
| + // Now test that cancelling works as expected. |
| + { |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| + WindowedAuthNeededObserver auth_needed_waiter(controller); |
| + browser()->OpenURL( |
| + auth_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| + auth_needed_waiter.Wait(); |
| + WindowedAuthCancelledObserver auth_cancelled_waiter(controller); |
| + LoginHandler* handler = *observer.handlers_.begin(); |
| + ASSERT_TRUE(handler); |
| + handler->CancelAuth(); |
| + auth_cancelled_waiter.Wait(); |
| + load_stop_waiter.Wait(); |
| + EXPECT_TRUE(observer.handlers_.empty()); |
| + } |
| +} |
| + |
| // Test handling of resources that require authentication even though |
| // the page they are included on doesn't. In this case we should only |
| // present the minimal number of prompts necessary for successfully |
| @@ -246,7 +364,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, MultipleRealmCancellation) { |
| observer.Register(content::Source<NavigationController>(controller)); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| { |
| WindowedAuthNeededObserver auth_needed_waiter(controller); |
| @@ -305,7 +423,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, |
| observer.Register(content::Source<NavigationController>(controller)); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| int n_handlers = 0; |
| { |
| @@ -432,7 +550,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, NoLoginPromptForFavicon) { |
| // authentication. There should be no login prompt. |
| { |
| GURL test_page = test_server()->GetURL(kFaviconTestPage); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| browser()->OpenURL( |
| test_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| load_stop_waiter.Wait(); |
| @@ -442,7 +560,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, NoLoginPromptForFavicon) { |
| // There should be one login prompt. |
| { |
| GURL test_page = test_server()->GetURL(kFaviconResource); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| WindowedAuthNeededObserver auth_needed_waiter(controller); |
| browser()->OpenURL( |
| test_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| @@ -495,7 +613,7 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, BlockCrossdomainPrompt) { |
| replacements.SetHostStr(new_host); |
| test_page = test_page.ReplaceComponents(replacements); |
| - WindowedLoadStopObserver load_stop_waiter(controller); |
| + WindowedLoadStopObserver load_stop_waiter(controller, 1); |
| browser()->OpenURL( |
| test_page, GURL(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED); |
| load_stop_waiter.Wait(); |