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