| // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/ui/browser_navigator_browsertest.h" |
| |
| #include "base/command_line.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/tabs/tab_strip_model.h" |
| #include "chrome/browser/ui/browser_list.h" |
| #include "chrome/browser/ui/browser_navigator.h" |
| #include "chrome/browser/ui/browser_window.h" |
| #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/test/ui_test_utils.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/browser/tab_contents/tab_contents_view.h"\ |
| |
| GURL BrowserNavigatorTest::GetGoogleURL() const { |
| return GURL("http://www.google.com/"); |
| } |
| |
| browser::NavigateParams BrowserNavigatorTest::MakeNavigateParams() const { |
| return MakeNavigateParams(browser()); |
| } |
| |
| browser::NavigateParams BrowserNavigatorTest::MakeNavigateParams( |
| Browser* browser) const { |
| browser::NavigateParams params(browser, GetGoogleURL(), |
| PageTransition::LINK); |
| params.window_action = browser::NavigateParams::SHOW_WINDOW; |
| return params; |
| } |
| |
| Browser* BrowserNavigatorTest::CreateEmptyBrowserForType(Browser::Type type, |
| Profile* profile) { |
| Browser* browser = Browser::CreateForType(type, profile); |
| browser->AddBlankTab(true); |
| return browser; |
| } |
| |
| TabContentsWrapper* BrowserNavigatorTest::CreateTabContents() { |
| return Browser::TabContentsFactory( |
| browser()->profile(), |
| NULL, |
| MSG_ROUTING_NONE, |
| browser()->GetSelectedTabContents(), |
| NULL); |
| } |
| |
| void BrowserNavigatorTest::RunSuppressTest(WindowOpenDisposition disposition) { |
| GURL old_url = browser()->GetSelectedTabContents()->GetURL(); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = disposition; |
| browser::Navigate(&p); |
| |
| // Nothing should have happened as a result of Navigate(); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(old_url, browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| void BrowserNavigatorTest::Observe(NotificationType type, |
| const NotificationSource& source, |
| const NotificationDetails& details) { |
| switch (type.value) { |
| case NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB: { |
| ++this->created_tab_contents_count_; |
| break; |
| } |
| default: |
| break; |
| } |
| } |
| |
| namespace { |
| |
| // This test verifies that when a navigation occurs within a tab, the tab count |
| // of the Browser remains the same and the current tab bears the loaded URL. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_CurrentTab) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| browser::Navigate(&p); |
| ui_test_utils::WaitForNavigationInCurrentTab(browser()); |
| EXPECT_EQ(GetGoogleURL(), browser()->GetSelectedTabContents()->GetURL()); |
| // We should have one window with one tab. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| } |
| |
| // This test verifies that a singleton tab is refocused if one is already opened |
| // in another or an existing window, or added if it is not. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SingletonTabExisting) { |
| GURL url("http://www.google.com/"); |
| GURL singleton_url1("http://maps.google.com/"); |
| |
| // Register for a notification if an additional tab_contents was instantiated. |
| // Opening a Singleton tab that is already opened should not be opening a new |
| // tab nor be creating a new TabContents object |
| NotificationRegistrar registrar; |
| |
| // As the registrar object goes out of scope, this will get unregistered |
| registrar.Add(this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, |
| NotificationService::AllSources()); |
| |
| browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); |
| browser()->AddSelectedTabWithURL(url, PageTransition::LINK); |
| |
| // We should have one browser with 3 tabs, the 3rd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(2, browser()->active_index()); |
| |
| unsigned int previous_tab_contents_count = |
| created_tab_contents_count_ = 0; |
| |
| // Navigate to singleton_url1. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = singleton_url1; |
| browser::Navigate(&p); |
| |
| // The middle tab should now be selected. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(1, browser()->active_index()); |
| |
| // No tab contents should have been created |
| EXPECT_EQ(previous_tab_contents_count, |
| created_tab_contents_count_); |
| } |
| |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabNoneExisting) { |
| GURL url("http://www.google.com/"); |
| GURL singleton_url1("http://maps.google.com/"); |
| |
| // We should have one browser with 1 tab. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(0, browser()->active_index()); |
| |
| // Navigate to singleton_url1. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = singleton_url1; |
| browser::Navigate(&p); |
| |
| // We should now have 2 tabs, the 2nd one selected. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| } |
| |
| // This test verifies that when a navigation results in a foreground tab, the |
| // tab count of the Browser increases and the selected tab shifts to the new |
| // foreground tab. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewForegroundTab) { |
| TabContents* old_contents = browser()->GetSelectedTabContents(); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_FOREGROUND_TAB; |
| browser::Navigate(&p); |
| EXPECT_NE(old_contents, browser()->GetSelectedTabContents()); |
| EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| // This test verifies that when a navigation results in a background tab, the |
| // tab count of the Browser increases but the selected tab remains the same. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewBackgroundTab) { |
| TabContents* old_contents = browser()->GetSelectedTabContents(); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_BACKGROUND_TAB; |
| browser::Navigate(&p); |
| TabContents* new_contents = browser()->GetSelectedTabContents(); |
| // The selected tab should have remained unchanged, since the new tab was |
| // opened in the background. |
| EXPECT_EQ(old_contents, new_contents); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| // This test verifies that when a navigation requiring a new foreground tab |
| // occurs in a Browser that cannot host multiple tabs, the new foreground tab |
| // is created in an existing compatible Browser. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_IncompatibleWindow_Existing) { |
| // Open a foreground tab in a window that cannot open popups when there is an |
| // existing compatible window somewhere else that they can be opened within. |
| Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP, |
| browser()->profile()); |
| browser::NavigateParams p(MakeNavigateParams(popup)); |
| p.disposition = NEW_FOREGROUND_TAB; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened the tab in a different browser since the |
| // one we supplied didn't support additional tabs. |
| EXPECT_NE(popup, p.browser); |
| |
| // Since browser() is an existing compatible tabbed browser, it should have |
| // opened the tab there. |
| EXPECT_EQ(browser(), p.browser); |
| |
| // We should be left with 2 windows, the popup with one tab and the browser() |
| // provided by the framework with two. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, popup->tab_count()); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| // This test verifies that when a navigation requiring a new foreground tab |
| // occurs in a Browser that cannot host multiple tabs and no compatible Browser |
| // that can is open, a compatible Browser is created. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_IncompatibleWindow_NoExisting) { |
| // We want to simulate not being able to find an existing window compatible |
| // with our non-tabbed browser window so Navigate() is forced to create a |
| // new compatible window. Because browser() supplied by the in-process |
| // browser testing framework is compatible with browser()->profile(), we |
| // need a different profile, and creating a popup window with an incognito |
| // profile is a quick and dirty way of achieving this. |
| Browser* popup = CreateEmptyBrowserForType( |
| Browser::TYPE_POPUP, browser()->profile()->GetOffTheRecordProfile()); |
| browser::NavigateParams p(MakeNavigateParams(popup)); |
| p.disposition = NEW_FOREGROUND_TAB; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened the tab in a different browser since the |
| // one we supplied didn't support additional tabs. |
| EXPECT_NE(popup, p.browser); |
| |
| // This time, browser() is _not_ compatible with popup since it is not an |
| // incognito window. |
| EXPECT_NE(browser(), p.browser); |
| |
| // We should have three windows, each with one tab: |
| // 1. the browser() provided by the framework (unchanged in this test) |
| // 2. the incognito popup we created originally |
| // 3. the new incognito tabbed browser that was created by Navigate(). |
| EXPECT_EQ(3u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, popup->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP |
| // from a normal Browser results in a new Browser with TYPE_POPUP. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_POPUP; |
| browser::Navigate(&p); |
| // Wait for new popup to to load and gain focus. |
| ui_test_utils::WaitForNavigationInCurrentTab(p.browser); |
| |
| // Navigate() should have opened a new, focused popup window. |
| EXPECT_NE(browser(), p.browser); |
| #if 0 |
| // TODO(stevenjb): Enable this test. See: crbug.com/79493 |
| EXPECT_TRUE(p.browser->window()->IsActive()); |
| #endif |
| EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); |
| |
| // We should have two windows, the browser() provided by the framework and the |
| // new popup window. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP |
| // from a normal popup results in a new Browser with TYPE_POPUP. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) { |
| // Open a popup. |
| browser::NavigateParams p1(MakeNavigateParams()); |
| p1.disposition = NEW_POPUP; |
| browser::Navigate(&p1); |
| // Open another popup. |
| browser::NavigateParams p2(MakeNavigateParams(p1.browser)); |
| p2.disposition = NEW_POPUP; |
| browser::Navigate(&p2); |
| |
| // Navigate() should have opened a new normal popup window. |
| EXPECT_NE(p1.browser, p2.browser); |
| EXPECT_EQ(Browser::TYPE_POPUP, p2.browser->type()); |
| |
| // We should have three windows, the browser() provided by the framework, |
| // the first popup window, and the second popup window. |
| EXPECT_EQ(3u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p1.browser->tab_count()); |
| EXPECT_EQ(1, p2.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP |
| // from an app frame results in a new Browser with TYPE_APP_POPUP. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_NewPopupFromAppWindow) { |
| Browser* app_browser = CreateEmptyBrowserForType(Browser::TYPE_APP, |
| browser()->profile()); |
| browser::NavigateParams p(MakeNavigateParams(app_browser)); |
| p.disposition = NEW_POPUP; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened a new popup app window. |
| EXPECT_NE(app_browser, p.browser); |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(Browser::TYPE_APP_POPUP, p.browser->type()); |
| |
| // We should now have three windows, the app window, the app popup it created, |
| // and the original browser() provided by the framework. |
| EXPECT_EQ(3u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, app_browser->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP |
| // from an app popup results in a new Browser also of TYPE_APP_POPUP. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_NewPopupFromAppPopup) { |
| Browser* app_browser = CreateEmptyBrowserForType(Browser::TYPE_APP, |
| browser()->profile()); |
| // Open an app popup. |
| browser::NavigateParams p1(MakeNavigateParams(app_browser)); |
| p1.disposition = NEW_POPUP; |
| browser::Navigate(&p1); |
| // Now open another app popup. |
| browser::NavigateParams p2(MakeNavigateParams(p1.browser)); |
| p2.disposition = NEW_POPUP; |
| browser::Navigate(&p2); |
| |
| // Navigate() should have opened a new popup app window. |
| EXPECT_NE(browser(), p1.browser); |
| EXPECT_NE(p1.browser, p2.browser); |
| EXPECT_EQ(Browser::TYPE_APP_POPUP, p2.browser->type()); |
| |
| // We should now have four windows, the app window, the first app popup, |
| // the second app popup, and the original browser() provided by the framework. |
| EXPECT_EQ(4u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, app_browser->tab_count()); |
| EXPECT_EQ(1, p1.browser->tab_count()); |
| EXPECT_EQ(1, p2.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP |
| // from an extension app tab results in a new Browser with TYPE_APP_POPUP. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_NewPopupFromExtensionApp) { |
| // TODO(beng): TBD. |
| } |
| |
| // This test verifies that navigating with window_action = SHOW_WINDOW_INACTIVE |
| // does not focus a new new popup window. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_POPUP; |
| p.window_action = browser::NavigateParams::SHOW_WINDOW_INACTIVE; |
| browser::Navigate(&p); |
| // Wait for new popup to load (and gain focus if the test fails). |
| ui_test_utils::WaitForNavigationInCurrentTab(p.browser); |
| |
| // Navigate() should have opened a new, unfocused, popup window. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); |
| #if 0 |
| // TODO(stevenjb): Enable this test. See: crbug.com/79493 |
| EXPECT_FALSE(p.browser->window()->IsActive()); |
| #endif |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = NEW_WINDOW |
| // always opens a new window. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_WINDOW; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened a new toplevel window. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); |
| |
| // We should now have two windows, the browser() provided by the framework and |
| // the new normal window. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = INCOGNITO |
| // opens a new incognito window if no existing incognito window is present. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = OFF_THE_RECORD; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened a new toplevel incognito window. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(browser()->profile()->GetOffTheRecordProfile(), |
| p.browser->profile()); |
| |
| // |source_contents| should be set to NULL because the profile for the new |
| // page is different from the originating page. |
| EXPECT_EQ(NULL, p.source_contents); |
| |
| // We should now have two windows, the browser() provided by the framework and |
| // the new incognito window. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| |
| // This test verifies that navigating with WindowOpenDisposition = INCOGNITO |
| // reuses an existing incognito window when possible. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IncognitoRefocus) { |
| Browser* incognito_browser = |
| CreateEmptyBrowserForType(Browser::TYPE_NORMAL, |
| browser()->profile()->GetOffTheRecordProfile()); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = OFF_THE_RECORD; |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened a new tab in the existing incognito window. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(p.browser, incognito_browser); |
| |
| // We should now have two windows, the browser() provided by the framework and |
| // the incognito window we opened earlier. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(2, incognito_browser->tab_count()); |
| } |
| |
| // This test verifies that no navigation action occurs when |
| // WindowOpenDisposition = SUPPRESS_OPEN. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SuppressOpen) { |
| RunSuppressTest(SUPPRESS_OPEN); |
| } |
| |
| // This test verifies that no navigation action occurs when |
| // WindowOpenDisposition = SAVE_TO_DISK. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) { |
| RunSuppressTest(SAVE_TO_DISK); |
| } |
| |
| // This test verifies that no navigation action occurs when |
| // WindowOpenDisposition = IGNORE_ACTION. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) { |
| RunSuppressTest(IGNORE_ACTION); |
| } |
| |
| // This tests adding a foreground tab with a predefined TabContents. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_FOREGROUND_TAB; |
| p.target_contents = CreateTabContents(); |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened the contents in a new foreground in the |
| // current Browser. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); |
| |
| // We should have one window, with two tabs. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| #if defined(OS_WIN) |
| // This tests adding a popup with a predefined TabContents. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) { |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_POPUP; |
| p.target_contents = CreateTabContents(); |
| p.window_bounds = gfx::Rect(10, 10, 500, 500); |
| browser::Navigate(&p); |
| |
| // Navigate() should have opened a new popup window. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); |
| |
| // The web platform is weird. The window bounds specified in |
| // |p.window_bounds| are used as follows: |
| // - the origin is used to position the window |
| // - the size is used to size the TabContents of the window. |
| // As such the position of the resulting window will always match |
| // p.window_bounds.origin(), but its size will not. We need to match |
| // the size against the selected tab's view's container size. |
| // Only Windows positions the window according to |p.window_bounds.origin()| - |
| // on Mac the window is offset from the opener and on Linux it always opens |
| // at 0,0. |
| EXPECT_EQ(p.window_bounds.origin(), |
| p.browser->window()->GetRestoredBounds().origin()); |
| // All platforms should respect size however provided width > 400 (Mac has a |
| // minimum window width of 400). |
| EXPECT_EQ(p.window_bounds.size(), |
| p.target_contents->tab_contents()->view()->GetContainerSize()); |
| |
| // We should have two windows, the new popup and the browser() provided by the |
| // framework. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| #endif |
| |
| // This tests adding a tab at a specific index. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Tabstrip_InsertAtIndex) { |
| // This is not meant to be a comprehensive test of whether or not the tab |
| // implementation of the browser observes the insertion index. That is |
| // covered by the unit tests for TabStripModel. This merely verifies that |
| // insertion index preference is reflected in common cases. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = NEW_FOREGROUND_TAB; |
| p.tabstrip_index = 0; |
| p.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX; |
| browser::Navigate(&p); |
| |
| // Navigate() should have inserted a new tab at slot 0 in the tabstrip. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(0, browser()->tabstrip_model()->GetIndexOfTabContents( |
| static_cast<const TabContentsWrapper*>(p.target_contents))); |
| |
| // We should have one window - the browser() provided by the framework. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| // This test verifies that constructing params with a NULL browser has |
| // the same result as navigating to a new foreground tab in the (only) |
| // active browser. Tests are the same as for Disposition_NewForegroundTab. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_NewForegroundTab) { |
| TabContents* old_contents = browser()->GetSelectedTabContents(); |
| // Navigate with a NULL browser. |
| browser::NavigateParams p(MakeNavigateParams(NULL)); |
| p.disposition = NEW_FOREGROUND_TAB; |
| p.profile = browser()->profile(); |
| browser::Navigate(&p); |
| |
| // Navigate() should have found browser() and create a new tab. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_NE(old_contents, browser()->GetSelectedTabContents()); |
| EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); |
| EXPECT_EQ(2, browser()->tab_count()); |
| } |
| |
| // This test verifies that constructing params with a NULL browser and |
| // a specific profile matches the specified profile. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_MatchProfile) { |
| // Create a new browser with using the incognito profile. |
| Browser* incognito = |
| Browser::Create(browser()->profile()->GetOffTheRecordProfile()); |
| |
| // Navigate with a NULL browser and the incognito profile. |
| browser::NavigateParams p(MakeNavigateParams(NULL)); |
| p.disposition = NEW_FOREGROUND_TAB; |
| p.profile = incognito->profile(); |
| browser::Navigate(&p); |
| |
| // Navigate() should have found incognito, not browser(). |
| EXPECT_EQ(incognito, p.browser); |
| EXPECT_EQ(incognito->GetSelectedTabContentsWrapper(), p.target_contents); |
| EXPECT_EQ(1, incognito->tab_count()); |
| } |
| |
| // This test verifies that constructing params with a NULL browser and |
| // disposition = NEW_WINDOW always opens exactly one new window. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_NewWindow) { |
| browser::NavigateParams p(MakeNavigateParams(NULL)); |
| p.disposition = NEW_WINDOW; |
| p.profile = browser()->profile(); |
| browser::Navigate(&p); |
| |
| // Navigate() should have created a new browser. |
| EXPECT_NE(browser(), p.browser); |
| EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); |
| |
| // We should now have two windows, the browser() provided by the framework and |
| // the new normal window. |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, p.browser->tab_count()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_NAVIGATE opens a new tab navigated to the specified URL if |
| // no previous tab with that URL (minus the path) exists. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabNew_IgnorePath) { |
| GURL url("http://www.google.com/"); |
| browser()->AddSelectedTabWithURL(url, PageTransition::LINK); |
| |
| // We should have one browser with 2 tabs, the 2nd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| |
| // Navigate to a new singleton tab with a sub-page. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://settings/advanced"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; |
| browser::Navigate(&p); |
| |
| // The last tab should now be selected and navigated to the sub-page of the |
| // URL. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(2, browser()->active_index()); |
| EXPECT_EQ(GURL("chrome://settings/advanced"), |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus |
| // the path) which is navigated to the specified URL. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabExisting_IgnorePath) { |
| GURL singleton_url1("chrome://settings"); |
| GURL url("http://www.google.com/"); |
| browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); |
| browser()->AddSelectedTabWithURL(url, PageTransition::LINK); |
| |
| // We should have one browser with 3 tabs, the 3rd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(2, browser()->active_index()); |
| |
| // Navigate to singleton_url1. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://settings/advanced"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; |
| browser::Navigate(&p); |
| |
| // The middle tab should now be selected and navigated to the sub-page of the |
| // URL. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| EXPECT_EQ(GURL("chrome://settings/advanced"), |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus |
| // the path) which is navigated to the specified URL. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabExistingSubPath_IgnorePath) { |
| GURL singleton_url1("chrome://settings/advanced"); |
| GURL url("http://www.google.com/"); |
| browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); |
| browser()->AddSelectedTabWithURL(url, PageTransition::LINK); |
| |
| // We should have one browser with 3 tabs, the 3rd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(2, browser()->active_index()); |
| |
| // Navigate to singleton_url1. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://settings/personal"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; |
| browser::Navigate(&p); |
| |
| // The middle tab should now be selected and navigated to the sub-page of the |
| // URL. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| EXPECT_EQ(GURL("chrome://settings/personal"), |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_STAY_PUT opens an existing tab with the matching URL (minus |
| // the path). |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabExistingSubPath_IgnorePath2) { |
| GURL singleton_url1("chrome://settings/advanced"); |
| GURL url("http://www.google.com/"); |
| browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); |
| browser()->AddSelectedTabWithURL(url, PageTransition::LINK); |
| |
| // We should have one browser with 3 tabs, the 3rd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(2, browser()->active_index()); |
| |
| // Navigate to singleton_url1. |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://settings/personal"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_STAY_PUT; |
| browser::Navigate(&p); |
| |
| // The middle tab should now be selected. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(3, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| EXPECT_EQ(singleton_url1, |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_NAVIGATE will update the current tab's URL if the currently |
| // selected tab is a match but has a different path. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabFocused_IgnorePath) { |
| GURL singleton_url_current("chrome://settings/advanced"); |
| GURL url("http://www.google.com/"); |
| browser()->AddSelectedTabWithURL(singleton_url_current, PageTransition::LINK); |
| |
| // We should have one browser with 2 tabs, the 2nd selected. |
| EXPECT_EQ(1u, BrowserList::size()); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| |
| // Navigate to a different settings path. |
| GURL singleton_url_target("chrome://settings/personal"); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = singleton_url_target; |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; |
| browser::Navigate(&p); |
| |
| // The second tab should still be selected, but navigated to the new path. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(1, browser()->active_index()); |
| EXPECT_EQ(singleton_url_target, |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that constructing params with disposition = SINGLETON_TAB |
| // and IGNORE_AND_NAVIGATE will open an existing matching tab with a different |
| // query. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_SingletonTabExisting_IgnoreQuery) { |
| int initial_tab_count = browser()->tab_count(); |
| GURL singleton_url_current("chrome://settings/internet"); |
| browser()->AddSelectedTabWithURL(singleton_url_current, PageTransition::LINK); |
| |
| EXPECT_EQ(initial_tab_count + 1, browser()->tab_count()); |
| EXPECT_EQ(initial_tab_count, browser()->active_index()); |
| |
| // Navigate to a different settings path. |
| GURL singleton_url_target( |
| "chrome://settings/internet?" |
| "servicePath=/profile/ethernet_00aa00aa00aa&networkType=1"); |
| browser::NavigateParams p(MakeNavigateParams()); |
| p.disposition = SINGLETON_TAB; |
| p.url = singleton_url_target; |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; |
| browser::Navigate(&p); |
| |
| // Last tab should still be selected. |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(initial_tab_count + 1, browser()->tab_count()); |
| EXPECT_EQ(initial_tab_count, browser()->active_index()); |
| } |
| |
| // This test verifies that the settings page isn't opened in the incognito |
| // window. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_Settings_UseNonIncognitoWindow) { |
| Browser* incognito_browser = CreateIncognitoBrowser(); |
| |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, incognito_browser->tab_count()); |
| |
| // Navigate to the settings page. |
| browser::NavigateParams p(MakeNavigateParams(incognito_browser)); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://settings"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| browser::Navigate(&p); |
| |
| // The settings page should be opened in browser() window. |
| EXPECT_NE(incognito_browser, p.browser); |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(GURL("chrome://settings"), |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| // This test verifies that the bookmarks page isn't opened in the incognito |
| // window. |
| IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, |
| Disposition_Bookmarks_UseNonIncognitoWindow) { |
| Browser* incognito_browser = CreateIncognitoBrowser(); |
| |
| EXPECT_EQ(2u, BrowserList::size()); |
| EXPECT_EQ(1, browser()->tab_count()); |
| EXPECT_EQ(1, incognito_browser->tab_count()); |
| |
| // Navigate to the settings page. |
| browser::NavigateParams p(MakeNavigateParams(incognito_browser)); |
| p.disposition = SINGLETON_TAB; |
| p.url = GURL("chrome://bookmarks"); |
| p.window_action = browser::NavigateParams::SHOW_WINDOW; |
| browser::Navigate(&p); |
| |
| // The bookmarks page should be opened in browser() window. |
| EXPECT_NE(incognito_browser, p.browser); |
| EXPECT_EQ(browser(), p.browser); |
| EXPECT_EQ(2, browser()->tab_count()); |
| EXPECT_EQ(GURL("chrome://bookmarks"), |
| browser()->GetSelectedTabContents()->GetURL()); |
| } |
| |
| } // namespace |