1 // Copyright (c) 2011 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 "chrome/browser/ui/browser_navigator_browsertest.h" 6 7 #include "base/command_line.h" 8 #include "chrome/browser/profiles/profile.h" 9 #include "chrome/browser/tabs/tab_strip_model.h" 10 #include "chrome/browser/ui/browser_list.h" 11 #include "chrome/browser/ui/browser_navigator.h" 12 #include "chrome/browser/ui/browser_window.h" 13 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" 14 #include "chrome/common/chrome_switches.h" 15 #include "chrome/test/ui_test_utils.h" 16 #include "content/browser/tab_contents/tab_contents.h" 17 #include "content/browser/tab_contents/tab_contents_view.h"\ 18 19 GURL BrowserNavigatorTest::GetGoogleURL() const { 20 return GURL("http://www.google.com/"); 21 } 22 23 browser::NavigateParams BrowserNavigatorTest::MakeNavigateParams() const { 24 return MakeNavigateParams(browser()); 25 } 26 27 browser::NavigateParams BrowserNavigatorTest::MakeNavigateParams( 28 Browser* browser) const { 29 browser::NavigateParams params(browser, GetGoogleURL(), 30 PageTransition::LINK); 31 params.window_action = browser::NavigateParams::SHOW_WINDOW; 32 return params; 33 } 34 35 Browser* BrowserNavigatorTest::CreateEmptyBrowserForType(Browser::Type type, 36 Profile* profile) { 37 Browser* browser = Browser::CreateForType(type, profile); 38 browser->AddBlankTab(true); 39 return browser; 40 } 41 42 TabContentsWrapper* BrowserNavigatorTest::CreateTabContents() { 43 return Browser::TabContentsFactory( 44 browser()->profile(), 45 NULL, 46 MSG_ROUTING_NONE, 47 browser()->GetSelectedTabContents(), 48 NULL); 49 } 50 51 void BrowserNavigatorTest::RunSuppressTest(WindowOpenDisposition disposition) { 52 GURL old_url = browser()->GetSelectedTabContents()->GetURL(); 53 browser::NavigateParams p(MakeNavigateParams()); 54 p.disposition = disposition; 55 browser::Navigate(&p); 56 57 // Nothing should have happened as a result of Navigate(); 58 EXPECT_EQ(1, browser()->tab_count()); 59 EXPECT_EQ(1u, BrowserList::size()); 60 EXPECT_EQ(old_url, browser()->GetSelectedTabContents()->GetURL()); 61 } 62 63 void BrowserNavigatorTest::Observe(NotificationType type, 64 const NotificationSource& source, 65 const NotificationDetails& details) { 66 switch (type.value) { 67 case NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB: { 68 ++this->created_tab_contents_count_; 69 break; 70 } 71 default: 72 break; 73 } 74 } 75 76 namespace { 77 78 // This test verifies that when a navigation occurs within a tab, the tab count 79 // of the Browser remains the same and the current tab bears the loaded URL. 80 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_CurrentTab) { 81 browser::NavigateParams p(MakeNavigateParams()); 82 browser::Navigate(&p); 83 ui_test_utils::WaitForNavigationInCurrentTab(browser()); 84 EXPECT_EQ(GetGoogleURL(), browser()->GetSelectedTabContents()->GetURL()); 85 // We should have one window with one tab. 86 EXPECT_EQ(1u, BrowserList::size()); 87 EXPECT_EQ(1, browser()->tab_count()); 88 } 89 90 // This test verifies that a singleton tab is refocused if one is already opened 91 // in another or an existing window, or added if it is not. 92 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SingletonTabExisting) { 93 GURL url("http://www.google.com/"); 94 GURL singleton_url1("http://maps.google.com/"); 95 96 // Register for a notification if an additional tab_contents was instantiated. 97 // Opening a Singleton tab that is already opened should not be opening a new 98 // tab nor be creating a new TabContents object 99 NotificationRegistrar registrar; 100 101 // As the registrar object goes out of scope, this will get unregistered 102 registrar.Add(this, NotificationType::RENDER_VIEW_HOST_CREATED_FOR_TAB, 103 NotificationService::AllSources()); 104 105 browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); 106 browser()->AddSelectedTabWithURL(url, PageTransition::LINK); 107 108 // We should have one browser with 3 tabs, the 3rd selected. 109 EXPECT_EQ(1u, BrowserList::size()); 110 EXPECT_EQ(2, browser()->active_index()); 111 112 unsigned int previous_tab_contents_count = 113 created_tab_contents_count_ = 0; 114 115 // Navigate to singleton_url1. 116 browser::NavigateParams p(MakeNavigateParams()); 117 p.disposition = SINGLETON_TAB; 118 p.url = singleton_url1; 119 browser::Navigate(&p); 120 121 // The middle tab should now be selected. 122 EXPECT_EQ(browser(), p.browser); 123 EXPECT_EQ(1, browser()->active_index()); 124 125 // No tab contents should have been created 126 EXPECT_EQ(previous_tab_contents_count, 127 created_tab_contents_count_); 128 } 129 130 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 131 Disposition_SingletonTabNoneExisting) { 132 GURL url("http://www.google.com/"); 133 GURL singleton_url1("http://maps.google.com/"); 134 135 // We should have one browser with 1 tab. 136 EXPECT_EQ(1u, BrowserList::size()); 137 EXPECT_EQ(0, browser()->active_index()); 138 139 // Navigate to singleton_url1. 140 browser::NavigateParams p(MakeNavigateParams()); 141 p.disposition = SINGLETON_TAB; 142 p.url = singleton_url1; 143 browser::Navigate(&p); 144 145 // We should now have 2 tabs, the 2nd one selected. 146 EXPECT_EQ(browser(), p.browser); 147 EXPECT_EQ(2, browser()->tab_count()); 148 EXPECT_EQ(1, browser()->active_index()); 149 } 150 151 // This test verifies that when a navigation results in a foreground tab, the 152 // tab count of the Browser increases and the selected tab shifts to the new 153 // foreground tab. 154 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewForegroundTab) { 155 TabContents* old_contents = browser()->GetSelectedTabContents(); 156 browser::NavigateParams p(MakeNavigateParams()); 157 p.disposition = NEW_FOREGROUND_TAB; 158 browser::Navigate(&p); 159 EXPECT_NE(old_contents, browser()->GetSelectedTabContents()); 160 EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); 161 EXPECT_EQ(2, browser()->tab_count()); 162 } 163 164 // This test verifies that when a navigation results in a background tab, the 165 // tab count of the Browser increases but the selected tab remains the same. 166 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewBackgroundTab) { 167 TabContents* old_contents = browser()->GetSelectedTabContents(); 168 browser::NavigateParams p(MakeNavigateParams()); 169 p.disposition = NEW_BACKGROUND_TAB; 170 browser::Navigate(&p); 171 TabContents* new_contents = browser()->GetSelectedTabContents(); 172 // The selected tab should have remained unchanged, since the new tab was 173 // opened in the background. 174 EXPECT_EQ(old_contents, new_contents); 175 EXPECT_EQ(2, browser()->tab_count()); 176 } 177 178 // This test verifies that when a navigation requiring a new foreground tab 179 // occurs in a Browser that cannot host multiple tabs, the new foreground tab 180 // is created in an existing compatible Browser. 181 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 182 Disposition_IncompatibleWindow_Existing) { 183 // Open a foreground tab in a window that cannot open popups when there is an 184 // existing compatible window somewhere else that they can be opened within. 185 Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP, 186 browser()->profile()); 187 browser::NavigateParams p(MakeNavigateParams(popup)); 188 p.disposition = NEW_FOREGROUND_TAB; 189 browser::Navigate(&p); 190 191 // Navigate() should have opened the tab in a different browser since the 192 // one we supplied didn't support additional tabs. 193 EXPECT_NE(popup, p.browser); 194 195 // Since browser() is an existing compatible tabbed browser, it should have 196 // opened the tab there. 197 EXPECT_EQ(browser(), p.browser); 198 199 // We should be left with 2 windows, the popup with one tab and the browser() 200 // provided by the framework with two. 201 EXPECT_EQ(2u, BrowserList::size()); 202 EXPECT_EQ(1, popup->tab_count()); 203 EXPECT_EQ(2, browser()->tab_count()); 204 } 205 206 // This test verifies that when a navigation requiring a new foreground tab 207 // occurs in a Browser that cannot host multiple tabs and no compatible Browser 208 // that can is open, a compatible Browser is created. 209 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 210 Disposition_IncompatibleWindow_NoExisting) { 211 // We want to simulate not being able to find an existing window compatible 212 // with our non-tabbed browser window so Navigate() is forced to create a 213 // new compatible window. Because browser() supplied by the in-process 214 // browser testing framework is compatible with browser()->profile(), we 215 // need a different profile, and creating a popup window with an incognito 216 // profile is a quick and dirty way of achieving this. 217 Browser* popup = CreateEmptyBrowserForType( 218 Browser::TYPE_POPUP, browser()->profile()->GetOffTheRecordProfile()); 219 browser::NavigateParams p(MakeNavigateParams(popup)); 220 p.disposition = NEW_FOREGROUND_TAB; 221 browser::Navigate(&p); 222 223 // Navigate() should have opened the tab in a different browser since the 224 // one we supplied didn't support additional tabs. 225 EXPECT_NE(popup, p.browser); 226 227 // This time, browser() is _not_ compatible with popup since it is not an 228 // incognito window. 229 EXPECT_NE(browser(), p.browser); 230 231 // We should have three windows, each with one tab: 232 // 1. the browser() provided by the framework (unchanged in this test) 233 // 2. the incognito popup we created originally 234 // 3. the new incognito tabbed browser that was created by Navigate(). 235 EXPECT_EQ(3u, BrowserList::size()); 236 EXPECT_EQ(1, browser()->tab_count()); 237 EXPECT_EQ(1, popup->tab_count()); 238 EXPECT_EQ(1, p.browser->tab_count()); 239 EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); 240 } 241 242 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 243 // from a normal Browser results in a new Browser with TYPE_POPUP. 244 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) { 245 browser::NavigateParams p(MakeNavigateParams()); 246 p.disposition = NEW_POPUP; 247 browser::Navigate(&p); 248 // Wait for new popup to to load and gain focus. 249 ui_test_utils::WaitForNavigationInCurrentTab(p.browser); 250 251 // Navigate() should have opened a new, focused popup window. 252 EXPECT_NE(browser(), p.browser); 253 #if 0 254 // TODO(stevenjb): Enable this test. See: crbug.com/79493 255 EXPECT_TRUE(p.browser->window()->IsActive()); 256 #endif 257 EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); 258 259 // We should have two windows, the browser() provided by the framework and the 260 // new popup window. 261 EXPECT_EQ(2u, BrowserList::size()); 262 EXPECT_EQ(1, browser()->tab_count()); 263 EXPECT_EQ(1, p.browser->tab_count()); 264 } 265 266 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 267 // from a normal popup results in a new Browser with TYPE_POPUP. 268 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) { 269 // Open a popup. 270 browser::NavigateParams p1(MakeNavigateParams()); 271 p1.disposition = NEW_POPUP; 272 browser::Navigate(&p1); 273 // Open another popup. 274 browser::NavigateParams p2(MakeNavigateParams(p1.browser)); 275 p2.disposition = NEW_POPUP; 276 browser::Navigate(&p2); 277 278 // Navigate() should have opened a new normal popup window. 279 EXPECT_NE(p1.browser, p2.browser); 280 EXPECT_EQ(Browser::TYPE_POPUP, p2.browser->type()); 281 282 // We should have three windows, the browser() provided by the framework, 283 // the first popup window, and the second popup window. 284 EXPECT_EQ(3u, BrowserList::size()); 285 EXPECT_EQ(1, browser()->tab_count()); 286 EXPECT_EQ(1, p1.browser->tab_count()); 287 EXPECT_EQ(1, p2.browser->tab_count()); 288 } 289 290 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 291 // from an app frame results in a new Browser with TYPE_APP_POPUP. 292 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 293 Disposition_NewPopupFromAppWindow) { 294 Browser* app_browser = CreateEmptyBrowserForType(Browser::TYPE_APP, 295 browser()->profile()); 296 browser::NavigateParams p(MakeNavigateParams(app_browser)); 297 p.disposition = NEW_POPUP; 298 browser::Navigate(&p); 299 300 // Navigate() should have opened a new popup app window. 301 EXPECT_NE(app_browser, p.browser); 302 EXPECT_NE(browser(), p.browser); 303 EXPECT_EQ(Browser::TYPE_APP_POPUP, p.browser->type()); 304 305 // We should now have three windows, the app window, the app popup it created, 306 // and the original browser() provided by the framework. 307 EXPECT_EQ(3u, BrowserList::size()); 308 EXPECT_EQ(1, browser()->tab_count()); 309 EXPECT_EQ(1, app_browser->tab_count()); 310 EXPECT_EQ(1, p.browser->tab_count()); 311 } 312 313 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 314 // from an app popup results in a new Browser also of TYPE_APP_POPUP. 315 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 316 Disposition_NewPopupFromAppPopup) { 317 Browser* app_browser = CreateEmptyBrowserForType(Browser::TYPE_APP, 318 browser()->profile()); 319 // Open an app popup. 320 browser::NavigateParams p1(MakeNavigateParams(app_browser)); 321 p1.disposition = NEW_POPUP; 322 browser::Navigate(&p1); 323 // Now open another app popup. 324 browser::NavigateParams p2(MakeNavigateParams(p1.browser)); 325 p2.disposition = NEW_POPUP; 326 browser::Navigate(&p2); 327 328 // Navigate() should have opened a new popup app window. 329 EXPECT_NE(browser(), p1.browser); 330 EXPECT_NE(p1.browser, p2.browser); 331 EXPECT_EQ(Browser::TYPE_APP_POPUP, p2.browser->type()); 332 333 // We should now have four windows, the app window, the first app popup, 334 // the second app popup, and the original browser() provided by the framework. 335 EXPECT_EQ(4u, BrowserList::size()); 336 EXPECT_EQ(1, browser()->tab_count()); 337 EXPECT_EQ(1, app_browser->tab_count()); 338 EXPECT_EQ(1, p1.browser->tab_count()); 339 EXPECT_EQ(1, p2.browser->tab_count()); 340 } 341 342 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 343 // from an extension app tab results in a new Browser with TYPE_APP_POPUP. 344 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 345 Disposition_NewPopupFromExtensionApp) { 346 // TODO(beng): TBD. 347 } 348 349 // This test verifies that navigating with window_action = SHOW_WINDOW_INACTIVE 350 // does not focus a new new popup window. 351 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) { 352 browser::NavigateParams p(MakeNavigateParams()); 353 p.disposition = NEW_POPUP; 354 p.window_action = browser::NavigateParams::SHOW_WINDOW_INACTIVE; 355 browser::Navigate(&p); 356 // Wait for new popup to load (and gain focus if the test fails). 357 ui_test_utils::WaitForNavigationInCurrentTab(p.browser); 358 359 // Navigate() should have opened a new, unfocused, popup window. 360 EXPECT_NE(browser(), p.browser); 361 EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); 362 #if 0 363 // TODO(stevenjb): Enable this test. See: crbug.com/79493 364 EXPECT_FALSE(p.browser->window()->IsActive()); 365 #endif 366 } 367 368 // This test verifies that navigating with WindowOpenDisposition = NEW_WINDOW 369 // always opens a new window. 370 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) { 371 browser::NavigateParams p(MakeNavigateParams()); 372 p.disposition = NEW_WINDOW; 373 browser::Navigate(&p); 374 375 // Navigate() should have opened a new toplevel window. 376 EXPECT_NE(browser(), p.browser); 377 EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); 378 379 // We should now have two windows, the browser() provided by the framework and 380 // the new normal window. 381 EXPECT_EQ(2u, BrowserList::size()); 382 EXPECT_EQ(1, browser()->tab_count()); 383 EXPECT_EQ(1, p.browser->tab_count()); 384 } 385 386 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO 387 // opens a new incognito window if no existing incognito window is present. 388 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) { 389 browser::NavigateParams p(MakeNavigateParams()); 390 p.disposition = OFF_THE_RECORD; 391 browser::Navigate(&p); 392 393 // Navigate() should have opened a new toplevel incognito window. 394 EXPECT_NE(browser(), p.browser); 395 EXPECT_EQ(browser()->profile()->GetOffTheRecordProfile(), 396 p.browser->profile()); 397 398 // |source_contents| should be set to NULL because the profile for the new 399 // page is different from the originating page. 400 EXPECT_EQ(NULL, p.source_contents); 401 402 // We should now have two windows, the browser() provided by the framework and 403 // the new incognito window. 404 EXPECT_EQ(2u, BrowserList::size()); 405 EXPECT_EQ(1, browser()->tab_count()); 406 EXPECT_EQ(1, p.browser->tab_count()); 407 } 408 409 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO 410 // reuses an existing incognito window when possible. 411 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IncognitoRefocus) { 412 Browser* incognito_browser = 413 CreateEmptyBrowserForType(Browser::TYPE_NORMAL, 414 browser()->profile()->GetOffTheRecordProfile()); 415 browser::NavigateParams p(MakeNavigateParams()); 416 p.disposition = OFF_THE_RECORD; 417 browser::Navigate(&p); 418 419 // Navigate() should have opened a new tab in the existing incognito window. 420 EXPECT_NE(browser(), p.browser); 421 EXPECT_EQ(p.browser, incognito_browser); 422 423 // We should now have two windows, the browser() provided by the framework and 424 // the incognito window we opened earlier. 425 EXPECT_EQ(2u, BrowserList::size()); 426 EXPECT_EQ(1, browser()->tab_count()); 427 EXPECT_EQ(2, incognito_browser->tab_count()); 428 } 429 430 // This test verifies that no navigation action occurs when 431 // WindowOpenDisposition = SUPPRESS_OPEN. 432 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SuppressOpen) { 433 RunSuppressTest(SUPPRESS_OPEN); 434 } 435 436 // This test verifies that no navigation action occurs when 437 // WindowOpenDisposition = SAVE_TO_DISK. 438 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) { 439 RunSuppressTest(SAVE_TO_DISK); 440 } 441 442 // This test verifies that no navigation action occurs when 443 // WindowOpenDisposition = IGNORE_ACTION. 444 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) { 445 RunSuppressTest(IGNORE_ACTION); 446 } 447 448 // This tests adding a foreground tab with a predefined TabContents. 449 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) { 450 browser::NavigateParams p(MakeNavigateParams()); 451 p.disposition = NEW_FOREGROUND_TAB; 452 p.target_contents = CreateTabContents(); 453 browser::Navigate(&p); 454 455 // Navigate() should have opened the contents in a new foreground in the 456 // current Browser. 457 EXPECT_EQ(browser(), p.browser); 458 EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); 459 460 // We should have one window, with two tabs. 461 EXPECT_EQ(1u, BrowserList::size()); 462 EXPECT_EQ(2, browser()->tab_count()); 463 } 464 465 #if defined(OS_WIN) 466 // This tests adding a popup with a predefined TabContents. 467 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) { 468 browser::NavigateParams p(MakeNavigateParams()); 469 p.disposition = NEW_POPUP; 470 p.target_contents = CreateTabContents(); 471 p.window_bounds = gfx::Rect(10, 10, 500, 500); 472 browser::Navigate(&p); 473 474 // Navigate() should have opened a new popup window. 475 EXPECT_NE(browser(), p.browser); 476 EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); 477 478 // The web platform is weird. The window bounds specified in 479 // |p.window_bounds| are used as follows: 480 // - the origin is used to position the window 481 // - the size is used to size the TabContents of the window. 482 // As such the position of the resulting window will always match 483 // p.window_bounds.origin(), but its size will not. We need to match 484 // the size against the selected tab's view's container size. 485 // Only Windows positions the window according to |p.window_bounds.origin()| - 486 // on Mac the window is offset from the opener and on Linux it always opens 487 // at 0,0. 488 EXPECT_EQ(p.window_bounds.origin(), 489 p.browser->window()->GetRestoredBounds().origin()); 490 // All platforms should respect size however provided width > 400 (Mac has a 491 // minimum window width of 400). 492 EXPECT_EQ(p.window_bounds.size(), 493 p.target_contents->tab_contents()->view()->GetContainerSize()); 494 495 // We should have two windows, the new popup and the browser() provided by the 496 // framework. 497 EXPECT_EQ(2u, BrowserList::size()); 498 EXPECT_EQ(1, browser()->tab_count()); 499 EXPECT_EQ(1, p.browser->tab_count()); 500 } 501 #endif 502 503 // This tests adding a tab at a specific index. 504 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Tabstrip_InsertAtIndex) { 505 // This is not meant to be a comprehensive test of whether or not the tab 506 // implementation of the browser observes the insertion index. That is 507 // covered by the unit tests for TabStripModel. This merely verifies that 508 // insertion index preference is reflected in common cases. 509 browser::NavigateParams p(MakeNavigateParams()); 510 p.disposition = NEW_FOREGROUND_TAB; 511 p.tabstrip_index = 0; 512 p.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX; 513 browser::Navigate(&p); 514 515 // Navigate() should have inserted a new tab at slot 0 in the tabstrip. 516 EXPECT_EQ(browser(), p.browser); 517 EXPECT_EQ(0, browser()->tabstrip_model()->GetIndexOfTabContents( 518 static_cast<const TabContentsWrapper*>(p.target_contents))); 519 520 // We should have one window - the browser() provided by the framework. 521 EXPECT_EQ(1u, BrowserList::size()); 522 EXPECT_EQ(2, browser()->tab_count()); 523 } 524 525 // This test verifies that constructing params with a NULL browser has 526 // the same result as navigating to a new foreground tab in the (only) 527 // active browser. Tests are the same as for Disposition_NewForegroundTab. 528 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_NewForegroundTab) { 529 TabContents* old_contents = browser()->GetSelectedTabContents(); 530 // Navigate with a NULL browser. 531 browser::NavigateParams p(MakeNavigateParams(NULL)); 532 p.disposition = NEW_FOREGROUND_TAB; 533 p.profile = browser()->profile(); 534 browser::Navigate(&p); 535 536 // Navigate() should have found browser() and create a new tab. 537 EXPECT_EQ(browser(), p.browser); 538 EXPECT_NE(old_contents, browser()->GetSelectedTabContents()); 539 EXPECT_EQ(browser()->GetSelectedTabContentsWrapper(), p.target_contents); 540 EXPECT_EQ(2, browser()->tab_count()); 541 } 542 543 // This test verifies that constructing params with a NULL browser and 544 // a specific profile matches the specified profile. 545 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_MatchProfile) { 546 // Create a new browser with using the incognito profile. 547 Browser* incognito = 548 Browser::Create(browser()->profile()->GetOffTheRecordProfile()); 549 550 // Navigate with a NULL browser and the incognito profile. 551 browser::NavigateParams p(MakeNavigateParams(NULL)); 552 p.disposition = NEW_FOREGROUND_TAB; 553 p.profile = incognito->profile(); 554 browser::Navigate(&p); 555 556 // Navigate() should have found incognito, not browser(). 557 EXPECT_EQ(incognito, p.browser); 558 EXPECT_EQ(incognito->GetSelectedTabContentsWrapper(), p.target_contents); 559 EXPECT_EQ(1, incognito->tab_count()); 560 } 561 562 // This test verifies that constructing params with a NULL browser and 563 // disposition = NEW_WINDOW always opens exactly one new window. 564 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, NullBrowser_NewWindow) { 565 browser::NavigateParams p(MakeNavigateParams(NULL)); 566 p.disposition = NEW_WINDOW; 567 p.profile = browser()->profile(); 568 browser::Navigate(&p); 569 570 // Navigate() should have created a new browser. 571 EXPECT_NE(browser(), p.browser); 572 EXPECT_EQ(Browser::TYPE_NORMAL, p.browser->type()); 573 574 // We should now have two windows, the browser() provided by the framework and 575 // the new normal window. 576 EXPECT_EQ(2u, BrowserList::size()); 577 EXPECT_EQ(1, browser()->tab_count()); 578 EXPECT_EQ(1, p.browser->tab_count()); 579 } 580 581 // This test verifies that constructing params with disposition = SINGLETON_TAB 582 // and IGNORE_AND_NAVIGATE opens a new tab navigated to the specified URL if 583 // no previous tab with that URL (minus the path) exists. 584 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 585 Disposition_SingletonTabNew_IgnorePath) { 586 GURL url("http://www.google.com/"); 587 browser()->AddSelectedTabWithURL(url, PageTransition::LINK); 588 589 // We should have one browser with 2 tabs, the 2nd selected. 590 EXPECT_EQ(1u, BrowserList::size()); 591 EXPECT_EQ(2, browser()->tab_count()); 592 EXPECT_EQ(1, browser()->active_index()); 593 594 // Navigate to a new singleton tab with a sub-page. 595 browser::NavigateParams p(MakeNavigateParams()); 596 p.disposition = SINGLETON_TAB; 597 p.url = GURL("chrome://settings/advanced"); 598 p.window_action = browser::NavigateParams::SHOW_WINDOW; 599 p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; 600 browser::Navigate(&p); 601 602 // The last tab should now be selected and navigated to the sub-page of the 603 // URL. 604 EXPECT_EQ(browser(), p.browser); 605 EXPECT_EQ(3, browser()->tab_count()); 606 EXPECT_EQ(2, browser()->active_index()); 607 EXPECT_EQ(GURL("chrome://settings/advanced"), 608 browser()->GetSelectedTabContents()->GetURL()); 609 } 610 611 // This test verifies that constructing params with disposition = SINGLETON_TAB 612 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus 613 // the path) which is navigated to the specified URL. 614 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 615 Disposition_SingletonTabExisting_IgnorePath) { 616 GURL singleton_url1("chrome://settings"); 617 GURL url("http://www.google.com/"); 618 browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); 619 browser()->AddSelectedTabWithURL(url, PageTransition::LINK); 620 621 // We should have one browser with 3 tabs, the 3rd selected. 622 EXPECT_EQ(1u, BrowserList::size()); 623 EXPECT_EQ(3, browser()->tab_count()); 624 EXPECT_EQ(2, browser()->active_index()); 625 626 // Navigate to singleton_url1. 627 browser::NavigateParams p(MakeNavigateParams()); 628 p.disposition = SINGLETON_TAB; 629 p.url = GURL("chrome://settings/advanced"); 630 p.window_action = browser::NavigateParams::SHOW_WINDOW; 631 p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; 632 browser::Navigate(&p); 633 634 // The middle tab should now be selected and navigated to the sub-page of the 635 // URL. 636 EXPECT_EQ(browser(), p.browser); 637 EXPECT_EQ(3, browser()->tab_count()); 638 EXPECT_EQ(1, browser()->active_index()); 639 EXPECT_EQ(GURL("chrome://settings/advanced"), 640 browser()->GetSelectedTabContents()->GetURL()); 641 } 642 643 // This test verifies that constructing params with disposition = SINGLETON_TAB 644 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus 645 // the path) which is navigated to the specified URL. 646 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 647 Disposition_SingletonTabExistingSubPath_IgnorePath) { 648 GURL singleton_url1("chrome://settings/advanced"); 649 GURL url("http://www.google.com/"); 650 browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); 651 browser()->AddSelectedTabWithURL(url, PageTransition::LINK); 652 653 // We should have one browser with 3 tabs, the 3rd selected. 654 EXPECT_EQ(1u, BrowserList::size()); 655 EXPECT_EQ(3, browser()->tab_count()); 656 EXPECT_EQ(2, browser()->active_index()); 657 658 // Navigate to singleton_url1. 659 browser::NavigateParams p(MakeNavigateParams()); 660 p.disposition = SINGLETON_TAB; 661 p.url = GURL("chrome://settings/personal"); 662 p.window_action = browser::NavigateParams::SHOW_WINDOW; 663 p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; 664 browser::Navigate(&p); 665 666 // The middle tab should now be selected and navigated to the sub-page of the 667 // URL. 668 EXPECT_EQ(browser(), p.browser); 669 EXPECT_EQ(3, browser()->tab_count()); 670 EXPECT_EQ(1, browser()->active_index()); 671 EXPECT_EQ(GURL("chrome://settings/personal"), 672 browser()->GetSelectedTabContents()->GetURL()); 673 } 674 675 // This test verifies that constructing params with disposition = SINGLETON_TAB 676 // and IGNORE_AND_STAY_PUT opens an existing tab with the matching URL (minus 677 // the path). 678 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 679 Disposition_SingletonTabExistingSubPath_IgnorePath2) { 680 GURL singleton_url1("chrome://settings/advanced"); 681 GURL url("http://www.google.com/"); 682 browser()->AddSelectedTabWithURL(singleton_url1, PageTransition::LINK); 683 browser()->AddSelectedTabWithURL(url, PageTransition::LINK); 684 685 // We should have one browser with 3 tabs, the 3rd selected. 686 EXPECT_EQ(1u, BrowserList::size()); 687 EXPECT_EQ(3, browser()->tab_count()); 688 EXPECT_EQ(2, browser()->active_index()); 689 690 // Navigate to singleton_url1. 691 browser::NavigateParams p(MakeNavigateParams()); 692 p.disposition = SINGLETON_TAB; 693 p.url = GURL("chrome://settings/personal"); 694 p.window_action = browser::NavigateParams::SHOW_WINDOW; 695 p.path_behavior = browser::NavigateParams::IGNORE_AND_STAY_PUT; 696 browser::Navigate(&p); 697 698 // The middle tab should now be selected. 699 EXPECT_EQ(browser(), p.browser); 700 EXPECT_EQ(3, browser()->tab_count()); 701 EXPECT_EQ(1, browser()->active_index()); 702 EXPECT_EQ(singleton_url1, 703 browser()->GetSelectedTabContents()->GetURL()); 704 } 705 706 // This test verifies that constructing params with disposition = SINGLETON_TAB 707 // and IGNORE_AND_NAVIGATE will update the current tab's URL if the currently 708 // selected tab is a match but has a different path. 709 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 710 Disposition_SingletonTabFocused_IgnorePath) { 711 GURL singleton_url_current("chrome://settings/advanced"); 712 GURL url("http://www.google.com/"); 713 browser()->AddSelectedTabWithURL(singleton_url_current, PageTransition::LINK); 714 715 // We should have one browser with 2 tabs, the 2nd selected. 716 EXPECT_EQ(1u, BrowserList::size()); 717 EXPECT_EQ(2, browser()->tab_count()); 718 EXPECT_EQ(1, browser()->active_index()); 719 720 // Navigate to a different settings path. 721 GURL singleton_url_target("chrome://settings/personal"); 722 browser::NavigateParams p(MakeNavigateParams()); 723 p.disposition = SINGLETON_TAB; 724 p.url = singleton_url_target; 725 p.window_action = browser::NavigateParams::SHOW_WINDOW; 726 p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; 727 browser::Navigate(&p); 728 729 // The second tab should still be selected, but navigated to the new path. 730 EXPECT_EQ(browser(), p.browser); 731 EXPECT_EQ(2, browser()->tab_count()); 732 EXPECT_EQ(1, browser()->active_index()); 733 EXPECT_EQ(singleton_url_target, 734 browser()->GetSelectedTabContents()->GetURL()); 735 } 736 737 // This test verifies that constructing params with disposition = SINGLETON_TAB 738 // and IGNORE_AND_NAVIGATE will open an existing matching tab with a different 739 // query. 740 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 741 Disposition_SingletonTabExisting_IgnoreQuery) { 742 int initial_tab_count = browser()->tab_count(); 743 GURL singleton_url_current("chrome://settings/internet"); 744 browser()->AddSelectedTabWithURL(singleton_url_current, PageTransition::LINK); 745 746 EXPECT_EQ(initial_tab_count + 1, browser()->tab_count()); 747 EXPECT_EQ(initial_tab_count, browser()->active_index()); 748 749 // Navigate to a different settings path. 750 GURL singleton_url_target( 751 "chrome://settings/internet?" 752 "servicePath=/profile/ethernet_00aa00aa00aa&networkType=1"); 753 browser::NavigateParams p(MakeNavigateParams()); 754 p.disposition = SINGLETON_TAB; 755 p.url = singleton_url_target; 756 p.window_action = browser::NavigateParams::SHOW_WINDOW; 757 p.path_behavior = browser::NavigateParams::IGNORE_AND_NAVIGATE; 758 browser::Navigate(&p); 759 760 // Last tab should still be selected. 761 EXPECT_EQ(browser(), p.browser); 762 EXPECT_EQ(initial_tab_count + 1, browser()->tab_count()); 763 EXPECT_EQ(initial_tab_count, browser()->active_index()); 764 } 765 766 // This test verifies that the settings page isn't opened in the incognito 767 // window. 768 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 769 Disposition_Settings_UseNonIncognitoWindow) { 770 Browser* incognito_browser = CreateIncognitoBrowser(); 771 772 EXPECT_EQ(2u, BrowserList::size()); 773 EXPECT_EQ(1, browser()->tab_count()); 774 EXPECT_EQ(1, incognito_browser->tab_count()); 775 776 // Navigate to the settings page. 777 browser::NavigateParams p(MakeNavigateParams(incognito_browser)); 778 p.disposition = SINGLETON_TAB; 779 p.url = GURL("chrome://settings"); 780 p.window_action = browser::NavigateParams::SHOW_WINDOW; 781 browser::Navigate(&p); 782 783 // The settings page should be opened in browser() window. 784 EXPECT_NE(incognito_browser, p.browser); 785 EXPECT_EQ(browser(), p.browser); 786 EXPECT_EQ(2, browser()->tab_count()); 787 EXPECT_EQ(GURL("chrome://settings"), 788 browser()->GetSelectedTabContents()->GetURL()); 789 } 790 791 // This test verifies that the bookmarks page isn't opened in the incognito 792 // window. 793 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 794 Disposition_Bookmarks_UseNonIncognitoWindow) { 795 Browser* incognito_browser = CreateIncognitoBrowser(); 796 797 EXPECT_EQ(2u, BrowserList::size()); 798 EXPECT_EQ(1, browser()->tab_count()); 799 EXPECT_EQ(1, incognito_browser->tab_count()); 800 801 // Navigate to the settings page. 802 browser::NavigateParams p(MakeNavigateParams(incognito_browser)); 803 p.disposition = SINGLETON_TAB; 804 p.url = GURL("chrome://bookmarks"); 805 p.window_action = browser::NavigateParams::SHOW_WINDOW; 806 browser::Navigate(&p); 807 808 // The bookmarks page should be opened in browser() window. 809 EXPECT_NE(incognito_browser, p.browser); 810 EXPECT_EQ(browser(), p.browser); 811 EXPECT_EQ(2, browser()->tab_count()); 812 EXPECT_EQ(GURL("chrome://bookmarks"), 813 browser()->GetSelectedTabContents()->GetURL()); 814 } 815 816 } // namespace 817