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 062838c73b01ab16eed838f0099c3e310e149def..edf794aba8fad5bbdc99f4375cb412bd30fab468 100644 |
| --- a/chrome/browser/ui/login/login_prompt_browsertest.cc |
| +++ b/chrome/browser/ui/login/login_prompt_browsertest.cc |
| @@ -31,6 +31,7 @@ class LoginPromptBrowserTest : public InProcessBrowserTest { |
| auth_map_["foo"] = AuthInfo("testuser", "foopassword"); |
| auth_map_["bar"] = AuthInfo("testuser", "barpassword"); |
| + auth_map_["testrealm"] = AuthInfo("basicuser", "secret"); |
| } |
| protected: |
| @@ -648,4 +649,217 @@ IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, BlockCrossdomainPrompt) { |
| EXPECT_TRUE(test_server()->Stop()); |
| } |
| +IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, SupplyRedundantAuths) { |
| + ASSERT_TRUE(test_server()->Start()); |
| + |
| + // Get NavigationController for tab 1. |
| + TabContentsWrapper* contents_1 = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents_1); |
| + NavigationController* controller_1 = &contents_1->controller(); |
| + |
| + // Open a new tab. |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + GURL("about:blank"), |
| + NEW_FOREGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + |
| + // Get NavigationController for tab 2. |
| + TabContentsWrapper* contents_2 = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents_2); |
| + ASSERT_NE(contents_1, contents_2); |
| + NavigationController* controller_2 = &contents_2->controller(); |
| + |
| + LoginPromptBrowserTestObserver observer; |
| + observer.Register(content::Source<NavigationController>(controller_1)); |
| + observer.Register(content::Source<NavigationController>(controller_2)); |
| + |
| + { |
| + // Open different auth urls in each tab. |
| + WindowedAuthNeededObserver auth_needed_waiter_1(controller_1); |
| + WindowedAuthNeededObserver auth_needed_waiter_2(controller_2); |
| + contents_1->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/1"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + contents_2->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/2"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + auth_needed_waiter_1.Wait(); |
| + auth_needed_waiter_2.Wait(); |
| + |
| + ASSERT_EQ(2U, observer.handlers_.size()); |
| + |
| + // Supply auth in tab 1. |
| + WindowedAuthSuppliedObserver auth_supplied_waiter_1(controller_1); |
| + WindowedAuthSuppliedObserver auth_supplied_waiter_2(controller_2); |
| + LoginHandler* handler_1 = *observer.handlers_.begin(); |
| + ASSERT_TRUE(handler_1); |
| + SetAuthFor(handler_1); |
| + |
| + // Both tabs should be authenticated. |
| + auth_supplied_waiter_1.Wait(); |
| + auth_supplied_waiter_2.Wait(); |
| + } |
| + |
| + EXPECT_EQ(2, observer.auth_needed_count_); |
| + EXPECT_EQ(2, observer.auth_supplied_count_); |
| + EXPECT_EQ(0, observer.auth_cancelled_count_); |
| + EXPECT_TRUE(test_server()->Stop()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, CancelRedundantAuths) { |
| + ASSERT_TRUE(test_server()->Start()); |
| + |
| + // Get NavigationController for tab 1. |
| + TabContentsWrapper* contents_1 = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents_1); |
| + NavigationController* controller_1 = &contents_1->controller(); |
| + |
| + // Open a new tab. |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser(), |
| + GURL("about:blank"), |
| + NEW_FOREGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
| + |
| + // Get NavigationController for tab 2. |
| + TabContentsWrapper* contents_2 = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents_2); |
| + ASSERT_NE(contents_1, contents_2); |
| + NavigationController* controller_2 = &contents_2->controller(); |
| + |
| + LoginPromptBrowserTestObserver observer; |
| + observer.Register(content::Source<NavigationController>(controller_1)); |
| + observer.Register(content::Source<NavigationController>(controller_2)); |
| + |
| + { |
| + // Open different auth urls in each tab. |
| + WindowedAuthNeededObserver auth_needed_waiter_1(controller_1); |
| + WindowedAuthNeededObserver auth_needed_waiter_2(controller_2); |
| + contents_1->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/1"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + contents_2->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/2"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + auth_needed_waiter_1.Wait(); |
| + auth_needed_waiter_2.Wait(); |
| + |
| + ASSERT_EQ(2U, observer.handlers_.size()); |
| + |
| + // Cancel auth in tab 1. |
| + WindowedAuthCancelledObserver auth_cancelled_waiter_1(controller_1); |
| + WindowedAuthCancelledObserver auth_cancelled_waiter_2(controller_2); |
| + LoginHandler* handler_1 = *observer.handlers_.begin(); |
| + ASSERT_TRUE(handler_1); |
| + handler_1->CancelAuth(); |
| + SetAuthFor(handler_1); |
|
asanka
2011/11/23 18:03:34
Why call SetAuthFor() after calling CancelAuth()?
mattm
2011/11/23 19:33:31
oops, fixed.
|
| + |
| + // Both tabs should cancel auth. |
| + auth_cancelled_waiter_1.Wait(); |
| + auth_cancelled_waiter_2.Wait(); |
| + } |
| + |
| + EXPECT_EQ(2, observer.auth_needed_count_); |
| + EXPECT_EQ(0, observer.auth_supplied_count_); |
| + EXPECT_EQ(2, observer.auth_cancelled_count_); |
| + EXPECT_TRUE(test_server()->Stop()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(LoginPromptBrowserTest, |
| + SupplyRedundantAuthsMultiProfile) { |
| + ASSERT_TRUE(test_server()->Start()); |
| + |
| + // Get NavigationController for regular tab. |
| + TabContentsWrapper* contents = |
| + browser()->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents); |
| + NavigationController* controller = &contents->controller(); |
| + |
| + // Open an incognito window. |
| + Browser* browser_incognito = CreateIncognitoBrowser(); |
| + |
| + // Get NavigationController for incognito tab. |
| + TabContentsWrapper* contents_incognito = |
| + browser_incognito->GetSelectedTabContentsWrapper(); |
| + ASSERT_TRUE(contents_incognito); |
| + ASSERT_NE(contents, contents_incognito); |
| + NavigationController* controller_incognito = |
| + &contents_incognito->controller(); |
| + |
| + LoginPromptBrowserTestObserver observer; |
| + observer.Register(content::Source<NavigationController>(controller)); |
| + LoginPromptBrowserTestObserver observer_incognito; |
| + observer_incognito.Register( |
| + content::Source<NavigationController>(controller_incognito)); |
| + |
| + { |
| + // Open an auth url in each window. |
| + WindowedAuthNeededObserver auth_needed_waiter(controller); |
| + WindowedAuthNeededObserver auth_needed_waiter_incognito( |
| + controller_incognito); |
| + contents->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/1"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + contents_incognito->tab_contents()->OpenURL(OpenURLParams( |
| + test_server()->GetURL("auth-basic/2"), |
| + GURL(), |
| + CURRENT_TAB, |
| + content::PAGE_TRANSITION_TYPED, |
| + false)); |
| + auth_needed_waiter.Wait(); |
| + auth_needed_waiter_incognito.Wait(); |
| + |
| + ASSERT_EQ(1U, observer.handlers_.size()); |
| + ASSERT_EQ(1U, observer_incognito.handlers_.size()); |
| + |
| + // Supply auth in tab 1. |
| + WindowedAuthSuppliedObserver auth_supplied_waiter(controller); |
| + LoginHandler* handler = *observer.handlers_.begin(); |
| + ASSERT_TRUE(handler); |
| + SetAuthFor(handler); |
| + |
| + // Regular tab should be authenticated. |
| + auth_supplied_waiter.Wait(); |
| + |
| + // There's not really a way to wait for the incognito window to "do |
| + // nothing". Wait for it to open a new tab to ensure it has processed |
| + // anything in its message loop. (This shouldn't be necessary since |
| + // notifications are synchronous, but maybe it will help avoid flake someday |
| + // in the future..) |
| + ui_test_utils::NavigateToURLWithDisposition( |
| + browser_incognito, |
| + GURL("about:blank"), |
| + NEW_FOREGROUND_TAB, |
| + ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB); |
|
asanka
2011/11/23 18:03:34
As you note, the notifications are delivered synch
mattm
2011/11/23 19:33:31
Yeah, I actually even tested that it did fail if I
|
| + } |
| + |
| + EXPECT_EQ(1, observer.auth_needed_count_); |
| + EXPECT_EQ(1, observer.auth_supplied_count_); |
| + EXPECT_EQ(0, observer.auth_cancelled_count_); |
| + EXPECT_EQ(1, observer_incognito.auth_needed_count_); |
| + EXPECT_EQ(0, observer_incognito.auth_supplied_count_); |
| + EXPECT_EQ(0, observer_incognito.auth_cancelled_count_); |
| + EXPECT_TRUE(test_server()->Stop()); |
| +} |
| + |
| } // namespace |