1 // Copyright (c) 2012 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 "base/prefs/pref_service.h" 9 #include "base/strings/utf_string_conversions.h" 10 #include "chrome/app/chrome_command_ids.h" 11 #include "chrome/browser/prefs/incognito_mode_prefs.h" 12 #include "chrome/browser/profiles/profile.h" 13 #include "chrome/browser/ui/browser.h" 14 #include "chrome/browser/ui/browser_commands.h" 15 #include "chrome/browser/ui/browser_finder.h" 16 #include "chrome/browser/ui/browser_navigator.h" 17 #include "chrome/browser/ui/browser_tabstrip.h" 18 #include "chrome/browser/ui/browser_window.h" 19 #include "chrome/browser/ui/chrome_pages.h" 20 #include "chrome/browser/ui/singleton_tabs.h" 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" 22 #include "chrome/common/chrome_switches.h" 23 #include "chrome/common/pref_names.h" 24 #include "chrome/common/url_constants.h" 25 #include "chrome/test/base/ui_test_utils.h" 26 #include "content/public/browser/notification_service.h" 27 #include "content/public/browser/notification_types.h" 28 #include "content/public/browser/web_contents.h" 29 #include "content/public/browser/web_contents_view.h" 30 #include "ipc/ipc_message.h" 31 32 using content::WebContents; 33 34 namespace { 35 36 const char kExpectedTitle[] = "PASSED!"; 37 const char kEchoTitleCommand[] = "echotitle"; 38 39 GURL GetGoogleURL() { 40 return GURL("http://www.google.com/"); 41 } 42 43 GURL GetSettingsURL() { 44 return GURL(chrome::kChromeUISettingsURL); 45 } 46 47 GURL GetContentSettingsURL() { 48 return GetSettingsURL().Resolve(chrome::kContentSettingsExceptionsSubPage); 49 } 50 51 GURL GetClearBrowsingDataURL() { 52 return GetSettingsURL().Resolve(chrome::kClearBrowserDataSubPage); 53 } 54 55 // Converts long uber URLs ("chrome://chrome/foo/") to short (virtual) URLs 56 // ("chrome://foo/"). This should be used to convert the return value of 57 // WebContentsImpl::GetURL before comparison because it can return either the 58 // real URL or the virtual URL. 59 GURL ShortenUberURL(const GURL& url) { 60 std::string url_string = url.spec(); 61 const std::string long_prefix = "chrome://chrome/"; 62 const std::string short_prefix = "chrome://"; 63 if (url_string.find(long_prefix) != 0) 64 return url; 65 url_string.replace(0, long_prefix.length(), short_prefix); 66 return GURL(url_string); 67 } 68 69 } // namespace 70 71 chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams() const { 72 return MakeNavigateParams(browser()); 73 } 74 75 chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams( 76 Browser* browser) const { 77 chrome::NavigateParams params(browser, GetGoogleURL(), 78 content::PAGE_TRANSITION_LINK); 79 params.window_action = chrome::NavigateParams::SHOW_WINDOW; 80 return params; 81 } 82 83 bool BrowserNavigatorTest::OpenPOSTURLInNewForegroundTabAndGetTitle( 84 const GURL& url, const std::string& post_data, bool is_browser_initiated, 85 base::string16* title) { 86 chrome::NavigateParams param(MakeNavigateParams()); 87 param.disposition = NEW_FOREGROUND_TAB; 88 param.url = url; 89 param.is_renderer_initiated = !is_browser_initiated; 90 param.uses_post = true; 91 param.browser_initiated_post_data = new base::RefCountedStaticMemory( 92 reinterpret_cast<const uint8*>(post_data.data()), post_data.size()); 93 94 ui_test_utils::NavigateToURL(¶m); 95 if (!param.target_contents) 96 return false; 97 98 // Navigate() should have opened the contents in new foreground tab in the 99 // current Browser. 100 EXPECT_EQ(browser(), param.browser); 101 EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), 102 param.target_contents); 103 // We should have one window, with one tab. 104 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 105 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 106 107 *title = param.target_contents->GetTitle(); 108 return true; 109 } 110 111 Browser* BrowserNavigatorTest::CreateEmptyBrowserForType(Browser::Type type, 112 Profile* profile) { 113 Browser* browser = new Browser( 114 Browser::CreateParams(type, profile, chrome::GetActiveDesktop())); 115 chrome::AddTabAt(browser, GURL(), -1, true); 116 return browser; 117 } 118 119 Browser* BrowserNavigatorTest::CreateEmptyBrowserForApp(Browser::Type type, 120 Profile* profile) { 121 Browser* browser = new Browser( 122 Browser::CreateParams::CreateForApp( 123 Browser::TYPE_POPUP, "Test", gfx::Rect(), profile, 124 chrome::GetActiveDesktop())); 125 chrome::AddTabAt(browser, GURL(), -1, true); 126 return browser; 127 } 128 129 WebContents* BrowserNavigatorTest::CreateWebContents() { 130 content::WebContents::CreateParams create_params(browser()->profile()); 131 content::WebContents* base_web_contents = 132 browser()->tab_strip_model()->GetActiveWebContents(); 133 if (base_web_contents) { 134 create_params.initial_size = 135 base_web_contents->GetView()->GetContainerSize(); 136 } 137 return WebContents::Create(create_params); 138 } 139 140 void BrowserNavigatorTest::RunSuppressTest(WindowOpenDisposition disposition) { 141 GURL old_url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL(); 142 chrome::NavigateParams p(MakeNavigateParams()); 143 p.disposition = disposition; 144 chrome::Navigate(&p); 145 146 // Nothing should have happened as a result of Navigate(); 147 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 148 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 149 EXPECT_EQ(old_url, 150 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 151 } 152 153 void BrowserNavigatorTest::RunUseNonIncognitoWindowTest(const GURL& url) { 154 Browser* incognito_browser = CreateIncognitoBrowser(); 155 156 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 157 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 158 EXPECT_EQ(1, incognito_browser->tab_strip_model()->count()); 159 160 // Navigate to the page. 161 chrome::NavigateParams p(MakeNavigateParams(incognito_browser)); 162 p.disposition = SINGLETON_TAB; 163 p.url = url; 164 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 165 chrome::Navigate(&p); 166 167 // This page should be opened in browser() window. 168 EXPECT_NE(incognito_browser, p.browser); 169 EXPECT_EQ(browser(), p.browser); 170 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 171 EXPECT_EQ(url, 172 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 173 } 174 175 void BrowserNavigatorTest::RunDoNothingIfIncognitoIsForcedTest( 176 const GURL& url) { 177 Browser* browser = CreateIncognitoBrowser(); 178 179 // Set kIncognitoModeAvailability to FORCED. 180 PrefService* prefs1 = browser->profile()->GetPrefs(); 181 prefs1->SetInteger(prefs::kIncognitoModeAvailability, 182 IncognitoModePrefs::FORCED); 183 PrefService* prefs2 = browser->profile()->GetOriginalProfile()->GetPrefs(); 184 prefs2->SetInteger(prefs::kIncognitoModeAvailability, 185 IncognitoModePrefs::FORCED); 186 187 // Navigate to the page. 188 chrome::NavigateParams p(MakeNavigateParams(browser)); 189 p.disposition = OFF_THE_RECORD; 190 p.url = url; 191 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 192 chrome::Navigate(&p); 193 194 // The page should not be opened. 195 EXPECT_EQ(browser, p.browser); 196 EXPECT_EQ(1, browser->tab_strip_model()->count()); 197 EXPECT_EQ(GURL(content::kAboutBlankURL), 198 browser->tab_strip_model()->GetActiveWebContents()->GetURL()); 199 } 200 201 void BrowserNavigatorTest::Observe( 202 int type, 203 const content::NotificationSource& source, 204 const content::NotificationDetails& details) { 205 switch (type) { 206 case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: { 207 ++this->created_tab_contents_count_; 208 break; 209 } 210 default: 211 break; 212 } 213 } 214 215 216 namespace { 217 218 // This test verifies that when a navigation occurs within a tab, the tab count 219 // of the Browser remains the same and the current tab bears the loaded URL. 220 // Note that network URLs are not actually loaded in tests, so this also tests 221 // that error pages leave the intended URL in the address bar. 222 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_CurrentTab) { 223 ui_test_utils::NavigateToURL(browser(), GetGoogleURL()); 224 EXPECT_EQ(GetGoogleURL(), 225 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 226 // We should have one window with one tab. 227 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 228 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 229 } 230 231 // This test verifies that a singleton tab is refocused if one is already opened 232 // in another or an existing window, or added if it is not. 233 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SingletonTabExisting) { 234 GURL singleton_url1("http://maps.google.com/"); 235 236 // Register for a notification if an additional WebContents was instantiated. 237 // Opening a Singleton tab that is already opened should not be opening a new 238 // tab nor be creating a new WebContents object. 239 content::NotificationRegistrar registrar; 240 241 // As the registrar object goes out of scope, this will get unregistered 242 registrar.Add(this, 243 content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED, 244 content::NotificationService::AllSources()); 245 246 chrome::AddSelectedTabWithURL(browser(), singleton_url1, 247 content::PAGE_TRANSITION_LINK); 248 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 249 content::PAGE_TRANSITION_LINK); 250 251 // We should have one browser with 3 tabs, the 3rd selected. 252 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 253 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 254 255 unsigned int previous_tab_contents_count = 256 created_tab_contents_count_ = 0; 257 258 // Navigate to singleton_url1. 259 chrome::NavigateParams p(MakeNavigateParams()); 260 p.disposition = SINGLETON_TAB; 261 p.url = singleton_url1; 262 chrome::Navigate(&p); 263 264 // The middle tab should now be selected. 265 EXPECT_EQ(browser(), p.browser); 266 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 267 268 // No tab contents should have been created 269 EXPECT_EQ(previous_tab_contents_count, 270 created_tab_contents_count_); 271 } 272 273 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 274 Disposition_SingletonTabRespectingRef) { 275 GURL singleton_ref_url1("http://maps.google.com/#a"); 276 GURL singleton_ref_url2("http://maps.google.com/#b"); 277 GURL singleton_ref_url3("http://maps.google.com/"); 278 279 chrome::AddSelectedTabWithURL(browser(), singleton_ref_url1, 280 content::PAGE_TRANSITION_LINK); 281 282 // We should have one browser with 2 tabs, 2nd selected. 283 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 284 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 285 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 286 287 // Navigate to singleton_url2. 288 chrome::NavigateParams p(MakeNavigateParams()); 289 p.disposition = SINGLETON_TAB; 290 p.url = singleton_ref_url2; 291 chrome::Navigate(&p); 292 293 // We should now have 2 tabs, the 2nd one selected. 294 EXPECT_EQ(browser(), p.browser); 295 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 296 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 297 298 // Navigate to singleton_url2, but with respect ref set. 299 p = MakeNavigateParams(); 300 p.disposition = SINGLETON_TAB; 301 p.url = singleton_ref_url2; 302 p.ref_behavior = chrome::NavigateParams::RESPECT_REF; 303 chrome::Navigate(&p); 304 305 // We should now have 3 tabs, the 3th one selected. 306 EXPECT_EQ(browser(), p.browser); 307 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 308 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 309 310 // Navigate to singleton_url3. 311 p = MakeNavigateParams(); 312 p.disposition = SINGLETON_TAB; 313 p.url = singleton_ref_url3; 314 p.ref_behavior = chrome::NavigateParams::RESPECT_REF; 315 chrome::Navigate(&p); 316 317 // We should now have 4 tabs, the 4th one selected. 318 EXPECT_EQ(browser(), p.browser); 319 EXPECT_EQ(4, browser()->tab_strip_model()->count()); 320 EXPECT_EQ(3, browser()->tab_strip_model()->active_index()); 321 } 322 323 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 324 Disposition_SingletonTabNoneExisting) { 325 GURL singleton_url1("http://maps.google.com/"); 326 327 // We should have one browser with 1 tab. 328 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 329 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); 330 331 // Navigate to singleton_url1. 332 chrome::NavigateParams p(MakeNavigateParams()); 333 p.disposition = SINGLETON_TAB; 334 p.url = singleton_url1; 335 chrome::Navigate(&p); 336 337 // We should now have 2 tabs, the 2nd one selected. 338 EXPECT_EQ(browser(), p.browser); 339 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 340 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 341 } 342 343 // This test verifies that when a navigation results in a foreground tab, the 344 // tab count of the Browser increases and the selected tab shifts to the new 345 // foreground tab. 346 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewForegroundTab) { 347 WebContents* old_contents = 348 browser()->tab_strip_model()->GetActiveWebContents(); 349 chrome::NavigateParams p(MakeNavigateParams()); 350 p.disposition = NEW_FOREGROUND_TAB; 351 chrome::Navigate(&p); 352 EXPECT_NE(old_contents, 353 browser()->tab_strip_model()->GetActiveWebContents()); 354 EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), 355 p.target_contents); 356 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 357 } 358 359 // This test verifies that when a navigation results in a background tab, the 360 // tab count of the Browser increases but the selected tab remains the same. 361 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewBackgroundTab) { 362 WebContents* old_contents = 363 browser()->tab_strip_model()->GetActiveWebContents(); 364 chrome::NavigateParams p(MakeNavigateParams()); 365 p.disposition = NEW_BACKGROUND_TAB; 366 chrome::Navigate(&p); 367 WebContents* new_contents = 368 browser()->tab_strip_model()->GetActiveWebContents(); 369 // The selected tab should have remained unchanged, since the new tab was 370 // opened in the background. 371 EXPECT_EQ(old_contents, new_contents); 372 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 373 } 374 375 // This test verifies that when a navigation requiring a new foreground tab 376 // occurs in a Browser that cannot host multiple tabs, the new foreground tab 377 // is created in an existing compatible Browser. 378 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 379 Disposition_IncompatibleWindow_Existing) { 380 // Open a foreground tab in a window that cannot open popups when there is an 381 // existing compatible window somewhere else that they can be opened within. 382 Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP, 383 browser()->profile()); 384 chrome::NavigateParams p(MakeNavigateParams(popup)); 385 p.disposition = NEW_FOREGROUND_TAB; 386 chrome::Navigate(&p); 387 388 // Navigate() should have opened the tab in a different browser since the 389 // one we supplied didn't support additional tabs. 390 EXPECT_NE(popup, p.browser); 391 392 // Since browser() is an existing compatible tabbed browser, it should have 393 // opened the tab there. 394 EXPECT_EQ(browser(), p.browser); 395 396 // We should be left with 2 windows, the popup with one tab and the browser() 397 // provided by the framework with two. 398 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 399 EXPECT_EQ(1, popup->tab_strip_model()->count()); 400 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 401 } 402 403 // This test verifies that when a navigation requiring a new foreground tab 404 // occurs in a Browser that cannot host multiple tabs and no compatible Browser 405 // that can is open, a compatible Browser is created. 406 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 407 Disposition_IncompatibleWindow_NoExisting) { 408 // We want to simulate not being able to find an existing window compatible 409 // with our non-tabbed browser window so Navigate() is forced to create a 410 // new compatible window. Because browser() supplied by the in-process 411 // browser testing framework is compatible with browser()->profile(), we 412 // need a different profile, and creating a popup window with an incognito 413 // profile is a quick and dirty way of achieving this. 414 Browser* popup = CreateEmptyBrowserForType( 415 Browser::TYPE_POPUP, 416 browser()->profile()->GetOffTheRecordProfile()); 417 chrome::NavigateParams p(MakeNavigateParams(popup)); 418 p.disposition = NEW_FOREGROUND_TAB; 419 chrome::Navigate(&p); 420 421 // Navigate() should have opened the tab in a different browser since the 422 // one we supplied didn't support additional tabs. 423 EXPECT_NE(popup, p.browser); 424 425 // This time, browser() is _not_ compatible with popup since it is not an 426 // incognito window. 427 EXPECT_NE(browser(), p.browser); 428 429 // We should have three windows, each with one tab: 430 // 1. the browser() provided by the framework (unchanged in this test) 431 // 2. the incognito popup we created originally 432 // 3. the new incognito tabbed browser that was created by Navigate(). 433 EXPECT_EQ(3u, chrome::GetTotalBrowserCount()); 434 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 435 EXPECT_EQ(1, popup->tab_strip_model()->count()); 436 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 437 EXPECT_TRUE(p.browser->is_type_tabbed()); 438 } 439 440 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 441 // from a normal Browser results in a new Browser with TYPE_POPUP. 442 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) { 443 chrome::NavigateParams p(MakeNavigateParams()); 444 p.disposition = NEW_POPUP; 445 p.window_bounds = gfx::Rect(0, 0, 200, 200); 446 // Wait for new popup to to load and gain focus. 447 ui_test_utils::NavigateToURL(&p); 448 449 // Navigate() should have opened a new, focused popup window. 450 EXPECT_NE(browser(), p.browser); 451 #if 0 452 // TODO(stevenjb): Enable this test. See: crbug.com/79493 453 EXPECT_TRUE(p.browser->window()->IsActive()); 454 #endif 455 EXPECT_TRUE(p.browser->is_type_popup()); 456 EXPECT_FALSE(p.browser->is_app()); 457 458 // We should have two windows, the browser() provided by the framework and the 459 // new popup window. 460 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 461 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 462 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 463 } 464 465 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 466 // from a normal Browser results in a new Browser with is_app() true. 467 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup_ExtensionId) { 468 chrome::NavigateParams p(MakeNavigateParams()); 469 p.disposition = NEW_POPUP; 470 p.extension_app_id = "extensionappid"; 471 p.window_bounds = gfx::Rect(0, 0, 200, 200); 472 // Wait for new popup to to load and gain focus. 473 ui_test_utils::NavigateToURL(&p); 474 475 // Navigate() should have opened a new, focused popup window. 476 EXPECT_NE(browser(), p.browser); 477 EXPECT_TRUE(p.browser->is_type_popup()); 478 EXPECT_TRUE(p.browser->is_app()); 479 480 // We should have two windows, the browser() provided by the framework and the 481 // new popup window. 482 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 483 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 484 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 485 } 486 487 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 488 // from a normal popup results in a new Browser with TYPE_POPUP. 489 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) { 490 // Open a popup. 491 chrome::NavigateParams p1(MakeNavigateParams()); 492 p1.disposition = NEW_POPUP; 493 p1.window_bounds = gfx::Rect(0, 0, 200, 200); 494 chrome::Navigate(&p1); 495 // Open another popup. 496 chrome::NavigateParams p2(MakeNavigateParams(p1.browser)); 497 p2.disposition = NEW_POPUP; 498 p2.window_bounds = gfx::Rect(0, 0, 200, 200); 499 chrome::Navigate(&p2); 500 501 // Navigate() should have opened a new normal popup window. 502 EXPECT_NE(p1.browser, p2.browser); 503 EXPECT_TRUE(p2.browser->is_type_popup()); 504 EXPECT_FALSE(p2.browser->is_app()); 505 506 // We should have three windows, the browser() provided by the framework, 507 // the first popup window, and the second popup window. 508 EXPECT_EQ(3u, chrome::GetTotalBrowserCount()); 509 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 510 EXPECT_EQ(1, p1.browser->tab_strip_model()->count()); 511 EXPECT_EQ(1, p2.browser->tab_strip_model()->count()); 512 } 513 514 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 515 // from an app frame results in a new Browser with TYPE_APP_POPUP. 516 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 517 Disposition_NewPopupFromAppWindow) { 518 Browser* app_browser = CreateEmptyBrowserForApp(Browser::TYPE_TABBED, 519 browser()->profile()); 520 chrome::NavigateParams p(MakeNavigateParams(app_browser)); 521 p.disposition = NEW_POPUP; 522 p.window_bounds = gfx::Rect(0, 0, 200, 200); 523 chrome::Navigate(&p); 524 525 // Navigate() should have opened a new popup app window. 526 EXPECT_NE(app_browser, p.browser); 527 EXPECT_NE(browser(), p.browser); 528 EXPECT_TRUE(p.browser->is_type_popup()); 529 EXPECT_TRUE(p.browser->is_app()); 530 531 // We should now have three windows, the app window, the app popup it created, 532 // and the original browser() provided by the framework. 533 EXPECT_EQ(3u, chrome::GetTotalBrowserCount()); 534 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 535 EXPECT_EQ(1, app_browser->tab_strip_model()->count()); 536 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 537 } 538 539 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 540 // from an app popup results in a new Browser also of TYPE_APP_POPUP. 541 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 542 Disposition_NewPopupFromAppPopup) { 543 Browser* app_browser = CreateEmptyBrowserForApp(Browser::TYPE_TABBED, 544 browser()->profile()); 545 // Open an app popup. 546 chrome::NavigateParams p1(MakeNavigateParams(app_browser)); 547 p1.disposition = NEW_POPUP; 548 p1.window_bounds = gfx::Rect(0, 0, 200, 200); 549 chrome::Navigate(&p1); 550 // Now open another app popup. 551 chrome::NavigateParams p2(MakeNavigateParams(p1.browser)); 552 p2.disposition = NEW_POPUP; 553 p2.window_bounds = gfx::Rect(0, 0, 200, 200); 554 chrome::Navigate(&p2); 555 556 // Navigate() should have opened a new popup app window. 557 EXPECT_NE(browser(), p1.browser); 558 EXPECT_NE(p1.browser, p2.browser); 559 EXPECT_TRUE(p2.browser->is_type_popup()); 560 EXPECT_TRUE(p2.browser->is_app()); 561 562 // We should now have four windows, the app window, the first app popup, 563 // the second app popup, and the original browser() provided by the framework. 564 EXPECT_EQ(4u, chrome::GetTotalBrowserCount()); 565 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 566 EXPECT_EQ(1, app_browser->tab_strip_model()->count()); 567 EXPECT_EQ(1, p1.browser->tab_strip_model()->count()); 568 EXPECT_EQ(1, p2.browser->tab_strip_model()->count()); 569 } 570 571 // This test verifies that navigating with WindowOpenDisposition = NEW_POPUP 572 // from an extension app tab results in a new Browser with TYPE_APP_POPUP. 573 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 574 Disposition_NewPopupFromExtensionApp) { 575 // TODO(beng): TBD. 576 } 577 578 // This test verifies that navigating with window_action = SHOW_WINDOW_INACTIVE 579 // does not focus a new new popup window. 580 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) { 581 chrome::NavigateParams p(MakeNavigateParams()); 582 p.disposition = NEW_POPUP; 583 p.window_bounds = gfx::Rect(0, 0, 200, 200); 584 p.window_action = chrome::NavigateParams::SHOW_WINDOW_INACTIVE; 585 // Wait for new popup to load (and gain focus if the test fails). 586 ui_test_utils::NavigateToURL(&p); 587 588 // Navigate() should have opened a new, unfocused, popup window. 589 EXPECT_NE(browser(), p.browser); 590 EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type()); 591 #if 0 592 // TODO(stevenjb): Enable this test. See: crbug.com/79493 593 EXPECT_FALSE(p.browser->window()->IsActive()); 594 #endif 595 } 596 597 // This test verifies that navigating with WindowOpenDisposition = NEW_WINDOW 598 // always opens a new window. 599 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) { 600 chrome::NavigateParams p(MakeNavigateParams()); 601 p.disposition = NEW_WINDOW; 602 chrome::Navigate(&p); 603 604 // Navigate() should have opened a new toplevel window. 605 EXPECT_NE(browser(), p.browser); 606 EXPECT_TRUE(p.browser->is_type_tabbed()); 607 608 // We should now have two windows, the browser() provided by the framework and 609 // the new normal window. 610 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 611 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 612 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 613 } 614 615 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO 616 // opens a new incognito window if no existing incognito window is present. 617 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) { 618 chrome::NavigateParams p(MakeNavigateParams()); 619 p.disposition = OFF_THE_RECORD; 620 chrome::Navigate(&p); 621 622 // Navigate() should have opened a new toplevel incognito window. 623 EXPECT_NE(browser(), p.browser); 624 EXPECT_EQ(browser()->profile()->GetOffTheRecordProfile(), 625 p.browser->profile()); 626 627 // |source_contents| should be set to NULL because the profile for the new 628 // page is different from the originating page. 629 EXPECT_EQ(NULL, p.source_contents); 630 631 // We should now have two windows, the browser() provided by the framework and 632 // the new incognito window. 633 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 634 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 635 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 636 } 637 638 // This test verifies that navigating with WindowOpenDisposition = INCOGNITO 639 // reuses an existing incognito window when possible. 640 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IncognitoRefocus) { 641 Browser* incognito_browser = 642 CreateEmptyBrowserForType(Browser::TYPE_TABBED, 643 browser()->profile()->GetOffTheRecordProfile()); 644 chrome::NavigateParams p(MakeNavigateParams()); 645 p.disposition = OFF_THE_RECORD; 646 chrome::Navigate(&p); 647 648 // Navigate() should have opened a new tab in the existing incognito window. 649 EXPECT_NE(browser(), p.browser); 650 EXPECT_EQ(p.browser, incognito_browser); 651 652 // We should now have two windows, the browser() provided by the framework and 653 // the incognito window we opened earlier. 654 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 655 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 656 EXPECT_EQ(2, incognito_browser->tab_strip_model()->count()); 657 } 658 659 // This test verifies that no navigation action occurs when 660 // WindowOpenDisposition = SUPPRESS_OPEN. 661 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SuppressOpen) { 662 RunSuppressTest(SUPPRESS_OPEN); 663 } 664 665 // This test verifies that no navigation action occurs when 666 // WindowOpenDisposition = SAVE_TO_DISK. 667 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) { 668 RunSuppressTest(SAVE_TO_DISK); 669 } 670 671 // This test verifies that no navigation action occurs when 672 // WindowOpenDisposition = IGNORE_ACTION. 673 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) { 674 RunSuppressTest(IGNORE_ACTION); 675 } 676 677 // This tests adding a foreground tab with a predefined WebContents. 678 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) { 679 chrome::NavigateParams p(MakeNavigateParams()); 680 p.disposition = NEW_FOREGROUND_TAB; 681 p.target_contents = CreateWebContents(); 682 chrome::Navigate(&p); 683 684 // Navigate() should have opened the contents in a new foreground in the 685 // current Browser. 686 EXPECT_EQ(browser(), p.browser); 687 EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(), 688 p.target_contents); 689 690 // We should have one window, with two tabs. 691 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 692 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 693 } 694 695 #if defined(OS_WIN) 696 // This tests adding a popup with a predefined WebContents. 697 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) { 698 chrome::NavigateParams p(MakeNavigateParams()); 699 p.disposition = NEW_POPUP; 700 p.target_contents = CreateWebContents(); 701 p.window_bounds = gfx::Rect(10, 10, 500, 500); 702 chrome::Navigate(&p); 703 704 // Navigate() should have opened a new popup window. 705 EXPECT_NE(browser(), p.browser); 706 EXPECT_TRUE(p.browser->is_type_popup()); 707 EXPECT_FALSE(p.browser->is_app()); 708 709 // The web platform is weird. The window bounds specified in 710 // |p.window_bounds| are used as follows: 711 // - the origin is used to position the window 712 // - the size is used to size the WebContents of the window. 713 // As such the position of the resulting window will always match 714 // p.window_bounds.origin(), but its size will not. We need to match 715 // the size against the selected tab's view's container size. 716 // Only Windows positions the window according to |p.window_bounds.origin()| - 717 // on Mac the window is offset from the opener and on Linux it always opens 718 // at 0,0. 719 EXPECT_EQ(p.window_bounds.origin(), 720 p.browser->window()->GetRestoredBounds().origin()); 721 // All platforms should respect size however provided width > 400 (Mac has a 722 // minimum window width of 400). 723 EXPECT_EQ(p.window_bounds.size(), 724 p.target_contents->GetView()->GetContainerSize()); 725 726 // We should have two windows, the new popup and the browser() provided by the 727 // framework. 728 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 729 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 730 EXPECT_EQ(1, p.browser->tab_strip_model()->count()); 731 } 732 #endif 733 734 // This tests adding a tab at a specific index. 735 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Tabstrip_InsertAtIndex) { 736 // This is not meant to be a comprehensive test of whether or not the tab 737 // implementation of the browser observes the insertion index. That is 738 // covered by the unit tests for TabStripModel. This merely verifies that 739 // insertion index preference is reflected in common cases. 740 chrome::NavigateParams p(MakeNavigateParams()); 741 p.disposition = NEW_FOREGROUND_TAB; 742 p.tabstrip_index = 0; 743 p.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX; 744 chrome::Navigate(&p); 745 746 // Navigate() should have inserted a new tab at slot 0 in the tabstrip. 747 EXPECT_EQ(browser(), p.browser); 748 EXPECT_EQ(0, browser()->tab_strip_model()->GetIndexOfWebContents( 749 static_cast<const WebContents*>(p.target_contents))); 750 751 // We should have one window - the browser() provided by the framework. 752 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 753 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 754 } 755 756 // This test verifies that constructing params with disposition = SINGLETON_TAB 757 // and IGNORE_AND_NAVIGATE opens a new tab navigated to the specified URL if 758 // no previous tab with that URL (minus the path) exists. 759 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 760 Disposition_SingletonTabNew_IgnorePath) { 761 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 762 content::PAGE_TRANSITION_LINK); 763 764 // We should have one browser with 2 tabs, the 2nd selected. 765 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 766 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 767 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 768 769 // Navigate to a new singleton tab with a sub-page. 770 chrome::NavigateParams p(MakeNavigateParams()); 771 p.disposition = SINGLETON_TAB; 772 p.url = GetContentSettingsURL(); 773 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 774 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 775 chrome::Navigate(&p); 776 777 // The last tab should now be selected and navigated to the sub-page of the 778 // URL. 779 EXPECT_EQ(browser(), p.browser); 780 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 781 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 782 EXPECT_EQ(GetContentSettingsURL(), 783 ShortenUberURL(browser()->tab_strip_model()-> 784 GetActiveWebContents()->GetURL())); 785 } 786 787 // This test verifies that constructing params with disposition = SINGLETON_TAB 788 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus 789 // the path) which is navigated to the specified URL. 790 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 791 Disposition_SingletonTabExisting_IgnorePath) { 792 GURL singleton_url1(GetSettingsURL()); 793 chrome::AddSelectedTabWithURL(browser(), singleton_url1, 794 content::PAGE_TRANSITION_LINK); 795 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 796 content::PAGE_TRANSITION_LINK); 797 798 // We should have one browser with 3 tabs, the 3rd selected. 799 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 800 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 801 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 802 803 // Navigate to singleton_url1. 804 chrome::NavigateParams p(MakeNavigateParams()); 805 p.disposition = SINGLETON_TAB; 806 p.url = GetContentSettingsURL(); 807 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 808 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 809 chrome::Navigate(&p); 810 811 // The middle tab should now be selected and navigated to the sub-page of the 812 // URL. 813 EXPECT_EQ(browser(), p.browser); 814 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 815 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 816 EXPECT_EQ(GetContentSettingsURL(), 817 ShortenUberURL(browser()->tab_strip_model()-> 818 GetActiveWebContents()->GetURL())); 819 } 820 821 // This test verifies that constructing params with disposition = SINGLETON_TAB 822 // and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus 823 // the path) which is navigated to the specified URL. 824 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 825 Disposition_SingletonTabExistingSubPath_IgnorePath) { 826 GURL singleton_url1(GetContentSettingsURL()); 827 chrome::AddSelectedTabWithURL(browser(), singleton_url1, 828 content::PAGE_TRANSITION_LINK); 829 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 830 content::PAGE_TRANSITION_LINK); 831 832 // We should have one browser with 3 tabs, the 3rd selected. 833 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 834 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 835 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 836 837 // Navigate to singleton_url1. 838 chrome::NavigateParams p(MakeNavigateParams()); 839 p.disposition = SINGLETON_TAB; 840 p.url = GetClearBrowsingDataURL(); 841 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 842 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 843 chrome::Navigate(&p); 844 845 // The middle tab should now be selected and navigated to the sub-page of the 846 // URL. 847 EXPECT_EQ(browser(), p.browser); 848 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 849 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 850 EXPECT_EQ(GetClearBrowsingDataURL(), 851 ShortenUberURL(browser()->tab_strip_model()-> 852 GetActiveWebContents()->GetURL())); 853 } 854 855 // This test verifies that constructing params with disposition = SINGLETON_TAB 856 // and IGNORE_AND_STAY_PUT opens an existing tab with the matching URL (minus 857 // the path). 858 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 859 Disposition_SingletonTabExistingSubPath_IgnorePath2) { 860 GURL singleton_url1(GetContentSettingsURL()); 861 chrome::AddSelectedTabWithURL(browser(), singleton_url1, 862 content::PAGE_TRANSITION_LINK); 863 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 864 content::PAGE_TRANSITION_LINK); 865 866 // We should have one browser with 3 tabs, the 3rd selected. 867 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 868 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 869 EXPECT_EQ(2, browser()->tab_strip_model()->active_index()); 870 871 // Navigate to singleton_url1. 872 chrome::NavigateParams p(MakeNavigateParams()); 873 p.disposition = SINGLETON_TAB; 874 p.url = GetClearBrowsingDataURL(); 875 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 876 p.path_behavior = chrome::NavigateParams::IGNORE_AND_STAY_PUT; 877 chrome::Navigate(&p); 878 879 // The middle tab should now be selected. 880 EXPECT_EQ(browser(), p.browser); 881 EXPECT_EQ(3, browser()->tab_strip_model()->count()); 882 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 883 EXPECT_EQ(singleton_url1, 884 ShortenUberURL(browser()->tab_strip_model()-> 885 GetActiveWebContents()->GetURL())); 886 } 887 888 // This test verifies that constructing params with disposition = SINGLETON_TAB 889 // and IGNORE_AND_NAVIGATE will update the current tab's URL if the currently 890 // selected tab is a match but has a different path. 891 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 892 Disposition_SingletonTabFocused_IgnorePath) { 893 GURL singleton_url_current(GetContentSettingsURL()); 894 chrome::AddSelectedTabWithURL(browser(), singleton_url_current, 895 content::PAGE_TRANSITION_LINK); 896 897 // We should have one browser with 2 tabs, the 2nd selected. 898 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 899 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 900 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 901 902 // Navigate to a different settings path. 903 GURL singleton_url_target(GetClearBrowsingDataURL()); 904 chrome::NavigateParams p(MakeNavigateParams()); 905 p.disposition = SINGLETON_TAB; 906 p.url = singleton_url_target; 907 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 908 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 909 chrome::Navigate(&p); 910 911 // The second tab should still be selected, but navigated to the new path. 912 EXPECT_EQ(browser(), p.browser); 913 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 914 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 915 EXPECT_EQ(singleton_url_target, 916 ShortenUberURL(browser()->tab_strip_model()-> 917 GetActiveWebContents()->GetURL())); 918 } 919 920 // This test verifies that constructing params with disposition = SINGLETON_TAB 921 // and IGNORE_AND_NAVIGATE will open an existing matching tab with a different 922 // query. 923 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 924 Disposition_SingletonTabExisting_IgnoreQuery) { 925 int initial_tab_count = browser()->tab_strip_model()->count(); 926 GURL singleton_url_current("chrome://settings/internet"); 927 chrome::AddSelectedTabWithURL(browser(), singleton_url_current, 928 content::PAGE_TRANSITION_LINK); 929 930 EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count()); 931 EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index()); 932 933 // Navigate to a different settings path. 934 GURL singleton_url_target( 935 "chrome://settings/internet?" 936 "servicePath=/profile/ethernet_00aa00aa00aa&networkType=1"); 937 chrome::NavigateParams p(MakeNavigateParams()); 938 p.disposition = SINGLETON_TAB; 939 p.url = singleton_url_target; 940 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 941 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 942 chrome::Navigate(&p); 943 944 // Last tab should still be selected. 945 EXPECT_EQ(browser(), p.browser); 946 EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count()); 947 EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index()); 948 } 949 950 // This test verifies that the settings page isn't opened in the incognito 951 // window. 952 // Disabled until fixed for uber settings: http://crbug.com/111243 953 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 954 DISABLED_Disposition_Settings_UseNonIncognitoWindow) { 955 RunUseNonIncognitoWindowTest(GetSettingsURL()); 956 } 957 958 // This test verifies that the view-source settings page isn't opened in the 959 // incognito window. 960 IN_PROC_BROWSER_TEST_F( 961 BrowserNavigatorTest, 962 Disposition_ViewSource_Settings_DoNothingIfIncognitoForced) { 963 std::string view_source(content::kViewSourceScheme); 964 view_source.append(":"); 965 view_source.append(chrome::kChromeUISettingsURL); 966 RunDoNothingIfIncognitoIsForcedTest(GURL(view_source)); 967 } 968 969 // This test verifies that the view-source settings page isn't opened in the 970 // incognito window even if incognito mode is forced (does nothing in that 971 // case). 972 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 973 Disposition_ViewSource_Settings_UseNonIncognitoWindow) { 974 std::string view_source(content::kViewSourceScheme); 975 view_source.append(":"); 976 view_source.append(chrome::kChromeUISettingsURL); 977 RunUseNonIncognitoWindowTest(GURL(view_source)); 978 } 979 980 // This test verifies that the settings page isn't opened in the incognito 981 // window from a non-incognito window (bookmark open-in-incognito trigger). 982 // Disabled until fixed for uber settings: http://crbug.com/111243 983 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 984 DISABLED_Disposition_Settings_UseNonIncognitoWindowForBookmark) { 985 chrome::NavigateParams params(browser(), GetSettingsURL(), 986 content::PAGE_TRANSITION_AUTO_BOOKMARK); 987 params.disposition = OFF_THE_RECORD; 988 { 989 content::WindowedNotificationObserver observer( 990 content::NOTIFICATION_LOAD_STOP, 991 content::NotificationService::AllSources()); 992 chrome::Navigate(¶ms); 993 observer.Wait(); 994 } 995 996 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 997 EXPECT_EQ(GetSettingsURL(), 998 ShortenUberURL(browser()->tab_strip_model()-> 999 GetActiveWebContents()->GetURL())); 1000 } 1001 1002 // Settings page is expected to always open in normal mode regardless 1003 // of whether the user is trying to open it in incognito mode or not. 1004 // This test verifies that if incognito mode is forced (by policy), settings 1005 // page doesn't open at all. 1006 // Disabled until fixed for uber settings: http://crbug.com/111243 1007 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1008 DISABLED_Disposition_Settings_DoNothingIfIncognitoIsForced) { 1009 RunDoNothingIfIncognitoIsForcedTest(GetSettingsURL()); 1010 } 1011 1012 // This test verifies that the bookmarks page isn't opened in the incognito 1013 // window. 1014 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1015 Disposition_Bookmarks_UseNonIncognitoWindow) { 1016 RunUseNonIncognitoWindowTest(GURL(chrome::kChromeUIBookmarksURL)); 1017 } 1018 1019 // Bookmark manager is expected to always open in normal mode regardless 1020 // of whether the user is trying to open it in incognito mode or not. 1021 // This test verifies that if incognito mode is forced (by policy), bookmark 1022 // manager doesn't open at all. 1023 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1024 Disposition_Bookmarks_DoNothingIfIncognitoIsForced) { 1025 RunDoNothingIfIncognitoIsForcedTest(GURL(chrome::kChromeUIBookmarksURL)); 1026 } 1027 1028 // This test makes sure a crashed singleton tab reloads from a new navigation. 1029 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1030 NavigateToCrashedSingletonTab) { 1031 GURL singleton_url(GetContentSettingsURL()); 1032 WebContents* web_contents = chrome::AddSelectedTabWithURL( 1033 browser(), singleton_url, content::PAGE_TRANSITION_LINK); 1034 1035 // We should have one browser with 2 tabs, the 2nd selected. 1036 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 1037 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1038 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); 1039 1040 // Kill the singleton tab. 1041 web_contents->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, -1); 1042 EXPECT_TRUE(web_contents->IsCrashed()); 1043 1044 chrome::NavigateParams p(MakeNavigateParams()); 1045 p.disposition = SINGLETON_TAB; 1046 p.url = singleton_url; 1047 p.window_action = chrome::NavigateParams::SHOW_WINDOW; 1048 p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE; 1049 ui_test_utils::NavigateToURL(&p); 1050 1051 // The tab should not be sad anymore. 1052 EXPECT_FALSE(web_contents->IsCrashed()); 1053 } 1054 1055 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1056 NavigateFromDefaultToOptionsInSameTab) { 1057 { 1058 content::WindowedNotificationObserver observer( 1059 content::NOTIFICATION_LOAD_STOP, 1060 content::NotificationService::AllSources()); 1061 chrome::ShowSettings(browser()); 1062 observer.Wait(); 1063 } 1064 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1065 EXPECT_EQ(GetSettingsURL(), 1066 ShortenUberURL(browser()->tab_strip_model()-> 1067 GetActiveWebContents()->GetURL())); 1068 } 1069 1070 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1071 NavigateFromBlankToOptionsInSameTab) { 1072 chrome::NavigateParams p(MakeNavigateParams()); 1073 p.url = GURL(content::kAboutBlankURL); 1074 ui_test_utils::NavigateToURL(&p); 1075 1076 { 1077 content::WindowedNotificationObserver observer( 1078 content::NOTIFICATION_LOAD_STOP, 1079 content::NotificationService::AllSources()); 1080 chrome::ShowSettings(browser()); 1081 observer.Wait(); 1082 } 1083 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1084 EXPECT_EQ(GetSettingsURL(), 1085 ShortenUberURL(browser()->tab_strip_model()-> 1086 GetActiveWebContents()->GetURL())); 1087 } 1088 1089 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1090 NavigateFromNTPToOptionsInSameTab) { 1091 chrome::NavigateParams p(MakeNavigateParams()); 1092 p.url = GURL(chrome::kChromeUINewTabURL); 1093 ui_test_utils::NavigateToURL(&p); 1094 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1095 EXPECT_EQ(GURL(chrome::kChromeUINewTabURL), 1096 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1097 1098 { 1099 content::WindowedNotificationObserver observer( 1100 content::NOTIFICATION_LOAD_STOP, 1101 content::NotificationService::AllSources()); 1102 chrome::ShowSettings(browser()); 1103 observer.Wait(); 1104 } 1105 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1106 EXPECT_EQ(GetSettingsURL(), 1107 ShortenUberURL(browser()->tab_strip_model()-> 1108 GetActiveWebContents()->GetURL())); 1109 } 1110 1111 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1112 NavigateFromPageToOptionsInNewTab) { 1113 chrome::NavigateParams p(MakeNavigateParams()); 1114 ui_test_utils::NavigateToURL(&p); 1115 EXPECT_EQ(GetGoogleURL(), 1116 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1117 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 1118 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1119 1120 { 1121 content::WindowedNotificationObserver observer( 1122 content::NOTIFICATION_LOAD_STOP, 1123 content::NotificationService::AllSources()); 1124 chrome::ShowSettings(browser()); 1125 observer.Wait(); 1126 } 1127 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1128 EXPECT_EQ(GetSettingsURL(), 1129 ShortenUberURL(browser()->tab_strip_model()-> 1130 GetActiveWebContents()->GetURL())); 1131 } 1132 1133 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1134 NavigateFromNTPToOptionsSingleton) { 1135 { 1136 content::WindowedNotificationObserver observer( 1137 content::NOTIFICATION_LOAD_STOP, 1138 content::NotificationService::AllSources()); 1139 chrome::ShowSettings(browser()); 1140 observer.Wait(); 1141 } 1142 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1143 1144 chrome::NewTab(browser()); 1145 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1146 1147 { 1148 content::WindowedNotificationObserver observer( 1149 content::NOTIFICATION_LOAD_STOP, 1150 content::NotificationService::AllSources()); 1151 chrome::ShowSettings(browser()); 1152 observer.Wait(); 1153 } 1154 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1155 EXPECT_EQ(GetSettingsURL(), 1156 ShortenUberURL(browser()->tab_strip_model()-> 1157 GetActiveWebContents()->GetURL())); 1158 } 1159 1160 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1161 NavigateFromNTPToOptionsPageInSameTab) { 1162 { 1163 content::WindowedNotificationObserver observer( 1164 content::NOTIFICATION_LOAD_STOP, 1165 content::NotificationService::AllSources()); 1166 chrome::ShowClearBrowsingDataDialog(browser()); 1167 observer.Wait(); 1168 } 1169 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1170 EXPECT_EQ(GetClearBrowsingDataURL(), 1171 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1172 1173 chrome::NewTab(browser()); 1174 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1175 1176 { 1177 content::WindowedNotificationObserver observer( 1178 content::NOTIFICATION_LOAD_STOP, 1179 content::NotificationService::AllSources()); 1180 chrome::ShowClearBrowsingDataDialog(browser()); 1181 observer.Wait(); 1182 } 1183 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1184 EXPECT_EQ(GetClearBrowsingDataURL(), 1185 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1186 } 1187 1188 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1189 NavigateFromOtherTabToSingletonOptions) { 1190 { 1191 content::WindowedNotificationObserver observer( 1192 content::NOTIFICATION_LOAD_STOP, 1193 content::NotificationService::AllSources()); 1194 chrome::ShowSettings(browser()); 1195 observer.Wait(); 1196 } 1197 { 1198 content::WindowedNotificationObserver observer( 1199 content::NOTIFICATION_LOAD_STOP, 1200 content::NotificationService::AllSources()); 1201 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 1202 content::PAGE_TRANSITION_LINK); 1203 observer.Wait(); 1204 } 1205 1206 // This load should simply cause a tab switch. 1207 chrome::ShowSettings(browser()); 1208 1209 EXPECT_EQ(2, browser()->tab_strip_model()->count()); 1210 EXPECT_EQ(GetSettingsURL(), 1211 ShortenUberURL(browser()->tab_strip_model()-> 1212 GetActiveWebContents()->GetURL())); 1213 } 1214 1215 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, CloseSingletonTab) { 1216 for (int i = 0; i < 2; ++i) { 1217 content::WindowedNotificationObserver observer( 1218 content::NOTIFICATION_LOAD_STOP, 1219 content::NotificationService::AllSources()); 1220 chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(), 1221 content::PAGE_TRANSITION_TYPED); 1222 observer.Wait(); 1223 } 1224 1225 browser()->tab_strip_model()->ActivateTabAt(0, true); 1226 1227 { 1228 content::WindowedNotificationObserver observer( 1229 content::NOTIFICATION_LOAD_STOP, 1230 content::NotificationService::AllSources()); 1231 chrome::ShowSettings(browser()); 1232 observer.Wait(); 1233 } 1234 1235 EXPECT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt( 1236 2, TabStripModel::CLOSE_USER_GESTURE)); 1237 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); 1238 } 1239 1240 // TODO(csilv): Update this for uber page. http://crbug.com/111579. 1241 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1242 DISABLED_NavigateFromDefaultToHistoryInSameTab) { 1243 { 1244 content::WindowedNotificationObserver observer( 1245 content::NOTIFICATION_LOAD_STOP, 1246 content::NotificationService::AllSources()); 1247 chrome::ShowHistory(browser()); 1248 observer.Wait(); 1249 } 1250 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1251 EXPECT_EQ(GURL(chrome::kChromeUIHistoryFrameURL), 1252 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1253 } 1254 1255 // TODO(linux_aura) http://crbug.com/163931 1256 #if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA) 1257 #define MAYBE_NavigateFromDefaultToBookmarksInSameTab DISABLED_NavigateFromDefaultToBookmarksInSameTab 1258 #else 1259 #define MAYBE_NavigateFromDefaultToBookmarksInSameTab NavigateFromDefaultToBookmarksInSameTab 1260 #endif 1261 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1262 MAYBE_NavigateFromDefaultToBookmarksInSameTab) { 1263 { 1264 content::WindowedNotificationObserver observer( 1265 content::NOTIFICATION_LOAD_STOP, 1266 content::NotificationService::AllSources()); 1267 chrome::ShowBookmarkManager(browser()); 1268 observer.Wait(); 1269 } 1270 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1271 EXPECT_TRUE(StartsWithASCII( 1272 browser()->tab_strip_model()->GetActiveWebContents()->GetURL().spec(), 1273 chrome::kChromeUIBookmarksURL, 1274 true)); 1275 } 1276 1277 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1278 NavigateFromDefaultToDownloadsInSameTab) { 1279 { 1280 content::WindowedNotificationObserver observer( 1281 content::NOTIFICATION_LOAD_STOP, 1282 content::NotificationService::AllSources()); 1283 chrome::ShowDownloads(browser()); 1284 observer.Wait(); 1285 } 1286 EXPECT_EQ(1, browser()->tab_strip_model()->count()); 1287 EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL), 1288 browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); 1289 } 1290 1291 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1292 NavigateWithoutBrowser) { 1293 // First navigate using the profile of the existing browser window, and 1294 // check that the window is reused. 1295 chrome::NavigateParams params(browser()->profile(), GetGoogleURL(), 1296 content::PAGE_TRANSITION_LINK); 1297 ui_test_utils::NavigateToURL(¶ms); 1298 EXPECT_EQ(1u, chrome::GetTotalBrowserCount()); 1299 1300 // Now navigate using the incognito profile and check that a new window 1301 // is created. 1302 chrome::NavigateParams params_incognito( 1303 browser()->profile()->GetOffTheRecordProfile(), 1304 GetGoogleURL(), content::PAGE_TRANSITION_LINK); 1305 ui_test_utils::NavigateToURL(¶ms_incognito); 1306 EXPECT_EQ(2u, chrome::GetTotalBrowserCount()); 1307 } 1308 1309 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, ViewSourceIsntSingleton) { 1310 const std::string viewsource_ntp_url = 1311 std::string(content::kViewSourceScheme) + ":" + 1312 chrome::kChromeUIVersionURL; 1313 1314 chrome::NavigateParams viewsource_params(browser(), 1315 GURL(viewsource_ntp_url), 1316 content::PAGE_TRANSITION_LINK); 1317 ui_test_utils::NavigateToURL(&viewsource_params); 1318 1319 chrome::NavigateParams singleton_params(browser(), 1320 GURL(chrome::kChromeUIVersionURL), 1321 content::PAGE_TRANSITION_LINK); 1322 singleton_params.disposition = SINGLETON_TAB; 1323 EXPECT_EQ(-1, chrome::GetIndexOfSingletonTab(&singleton_params)); 1324 } 1325 1326 // This test verifies that browser initiated navigations can send requests 1327 // using POST. 1328 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1329 SendBrowserInitiatedRequestUsingPOST) { 1330 // Uses a test sever to verify POST request. 1331 ASSERT_TRUE(test_server()->Start()); 1332 1333 // Open a browser initiated POST request in new foreground tab. 1334 base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle)); 1335 std::string post_data = kExpectedTitle; 1336 base::string16 title; 1337 ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle( 1338 test_server()->GetURL(kEchoTitleCommand), post_data, true, &title)); 1339 EXPECT_EQ(expected_title, title); 1340 } 1341 1342 // This test verifies that renderer initiated navigations can NOT send requests 1343 // using POST. 1344 IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, 1345 SendRendererInitiatedRequestUsingPOST) { 1346 // Uses a test sever to verify POST request. 1347 ASSERT_TRUE(test_server()->Start()); 1348 1349 // Open a renderer initiated POST request in new foreground tab. 1350 base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle)); 1351 std::string post_data = kExpectedTitle; 1352 base::string16 title; 1353 ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle( 1354 test_server()->GetURL(kEchoTitleCommand), post_data, false, &title)); 1355 EXPECT_NE(expected_title, title); 1356 } 1357 1358 } // namespace 1359