15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator_browsertest.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/strings/string_util.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
21a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "chrome/browser/ui/singleton_tabs.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kExpectedTitle[] = "PASSED!";
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const char kEchoTitleCommand[] = "echotitle";
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetGoogleURL() {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL("http://www.google.com/");
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetSettingsURL() {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(chrome::kChromeUISettingsURL);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetContentSettingsURL() {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSettingsURL().Resolve(chrome::kContentSettingsExceptionsSubPage);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL GetClearBrowsingDataURL() {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetSettingsURL().Resolve(chrome::kClearBrowserDataSubPage);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Converts long uber URLs ("chrome://chrome/foo/") to short (virtual) URLs
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ("chrome://foo/"). This should be used to convert the return value of
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsImpl::GetURL before comparison because it can return either the
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// real URL or the virtual URL.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL ShortenUberURL(const GURL& url) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_string = url.spec();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string long_prefix = "chrome://chrome/";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string short_prefix = "chrome://";
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url_string.find(long_prefix) != 0)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return url;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url_string.replace(0, long_prefix.length(), short_prefix);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(url_string);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams() const {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return MakeNavigateParams(browser());
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)chrome::NavigateParams BrowserNavigatorTest::MakeNavigateParams(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser) const {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser, GetGoogleURL(),
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.window_action = chrome::NavigateParams::SHOW_WINDOW;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return params;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool BrowserNavigatorTest::OpenPOSTURLInNewForegroundTabAndGetTitle(
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const GURL& url, const std::string& post_data, bool is_browser_initiated,
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    base::string16* title) {
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  chrome::NavigateParams param(MakeNavigateParams());
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  param.disposition = NEW_FOREGROUND_TAB;
87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  param.url = url;
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  param.is_renderer_initiated = !is_browser_initiated;
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  param.uses_post = true;
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  param.browser_initiated_post_data = new base::RefCountedStaticMemory(
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      post_data.data(), post_data.size());
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui_test_utils::NavigateToURL(&param);
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (!param.target_contents)
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return false;
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Navigate() should have opened the contents in new foreground tab in the
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // current Browser.
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(browser(), param.browser);
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            param.target_contents);
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // We should have one window, with one tab.
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  *title = param.target_contents->GetTitle();
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return true;
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Browser* BrowserNavigatorTest::CreateEmptyBrowserForType(Browser::Type type,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                         Profile* profile) {
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser = new Browser(
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      Browser::CreateParams(type, profile, chrome::GetActiveDesktop()));
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(browser, GURL(), -1, true);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
118a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochBrowser* BrowserNavigatorTest::CreateEmptyBrowserForApp(Profile* profile) {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = new Browser(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::CreateParams::CreateForApp(
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          "Test", false /* trusted_source */, gfx::Rect(), profile,
122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch          chrome::GetActiveDesktop()));
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(browser, GURL(), -1, true);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return browser;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContents* BrowserNavigatorTest::CreateWebContents() {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents::CreateParams create_params(browser()->profile());
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::WebContents* base_web_contents =
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base_web_contents) {
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    create_params.initial_size =
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        base_web_contents->GetContainerBounds().size();
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return WebContents::Create(create_params);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNavigatorTest::RunSuppressTest(WindowOpenDisposition disposition) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL old_url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = disposition;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Nothing should have happened as a result of Navigate();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(old_url,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNavigatorTest::RunUseNonIncognitoWindowTest(const GURL& url) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito_browser = CreateIncognitoBrowser();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, incognito_browser->tab_strip_model()->count());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to the page.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams(incognito_browser));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = url;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This page should be opened in browser() window.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(incognito_browser, p.browser);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(url,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNavigatorTest::RunDoNothingIfIncognitoIsForcedTest(
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser = CreateIncognitoBrowser();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set kIncognitoModeAvailability to FORCED.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs1 = browser->profile()->GetPrefs();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs1->SetInteger(prefs::kIncognitoModeAvailability,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IncognitoModePrefs::FORCED);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs2 = browser->profile()->GetOriginalProfile()->GetPrefs();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs2->SetInteger(prefs::kIncognitoModeAvailability,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     IncognitoModePrefs::FORCED);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to the page.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams(browser));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = OFF_THE_RECORD;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = url;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The page should not be opened.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser, p.browser);
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser->tab_strip_model()->count());
195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(GURL(url::kAboutBlankURL),
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser->tab_strip_model()->GetActiveWebContents()->GetURL());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void BrowserNavigatorTest::SetUpCommandLine(base::CommandLine* command_line) {
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Disable settings-in-a-window so that we can use the settings page and
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // sub-pages to test browser navigation.
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  command_line->AppendSwitch(::switches::kDisableSettingsWindow);
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserNavigatorTest::Observe(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED: {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ++this->created_tab_contents_count_;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that when a navigation occurs within a tab, the tab count
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the Browser remains the same and the current tab bears the loaded URL.
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Note that network URLs are not actually loaded in tests, so this also tests
225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// that error pages leave the intended URL in the address bar.
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_CurrentTab) {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GetGoogleURL());
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetGoogleURL(),
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one window with one tab.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that a singleton tab is refocused if one is already opened
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in another or an existing window, or added if it is not.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SingletonTabExisting) {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url1("http://maps.google.com/");
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Register for a notification if an additional WebContents was instantiated.
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opening a Singleton tab that is already opened should not be opening a new
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // tab nor be creating a new WebContents object.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As the registrar object goes out of scope, this will get unregistered
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar.Add(this,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                content::NOTIFICATION_WEB_CONTENTS_RENDER_VIEW_HOST_CREATED,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                content::NotificationService::AllSources());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url1,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 3 tabs, the 3rd selected.
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int previous_tab_contents_count =
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      created_tab_contents_count_ = 0;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url1.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_url1;
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The middle tab should now be selected.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No tab contents should have been created
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(previous_tab_contents_count,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            created_tab_contents_count_);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabRespectingRef) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_ref_url1("http://maps.google.com/#a");
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_ref_url2("http://maps.google.com/#b");
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_ref_url3("http://maps.google.com/");
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_ref_url1,
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 2 tabs, 2nd selected.
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url2.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_ref_url2;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have 2 tabs, the 2nd one selected.
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url2, but with respect ref set.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = MakeNavigateParams();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_ref_url2;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.ref_behavior = chrome::NavigateParams::RESPECT_REF;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have 3 tabs, the 3th one selected.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url3.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p = MakeNavigateParams();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_ref_url3;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.ref_behavior = chrome::NavigateParams::RESPECT_REF;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have 4 tabs, the 4th one selected.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, browser()->tab_strip_model()->count());
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->active_index());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabNoneExisting) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url1("http://maps.google.com/");
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 1 tab.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url1.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_url1;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have 2 tabs, the 2nd one selected.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that when a navigation results in a foreground tab, the
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab count of the Browser increases and the selected tab shifts to the new
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// foreground tab.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewForegroundTab) {
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* old_contents =
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_FOREGROUND_TAB;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_NE(old_contents,
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents());
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            p.target_contents);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that when a navigation results in a background tab, the
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab count of the Browser increases but the selected tab remains the same.
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewBackgroundTab) {
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* old_contents =
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_BACKGROUND_TAB;
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* new_contents =
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The selected tab should have remained unchanged, since the new tab was
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened in the background.
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(old_contents, new_contents);
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that when a navigation requiring a new foreground tab
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// occurs in a Browser that cannot host multiple tabs, the new foreground tab
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is created in an existing compatible Browser.
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_IncompatibleWindow_Existing) {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a foreground tab in a window that cannot open popups when there is an
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // existing compatible window somewhere else that they can be opened within.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup = CreateEmptyBrowserForType(Browser::TYPE_POPUP,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             browser()->profile());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams(popup));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_FOREGROUND_TAB;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened the tab in a different browser since the
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one we supplied didn't support additional tabs.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(popup, p.browser);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since browser() is an existing compatible tabbed browser, it should have
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // opened the tab there.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should be left with 2 windows, the popup with one tab and the browser()
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provided by the framework with two.
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup->tab_strip_model()->count());
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that when a navigation requiring a new foreground tab
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// occurs in a Browser that cannot host multiple tabs and no compatible Browser
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that can is open, a compatible Browser is created.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_IncompatibleWindow_NoExisting) {
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We want to simulate not being able to find an existing window compatible
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with our non-tabbed browser window so Navigate() is forced to create a
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new compatible window. Because browser() supplied by the in-process
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser testing framework is compatible with browser()->profile(), we
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // need a different profile, and creating a popup window with an incognito
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile is a quick and dirty way of achieving this.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup = CreateEmptyBrowserForType(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::TYPE_POPUP,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile()->GetOffTheRecordProfile());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams(popup));
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_FOREGROUND_TAB;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened the tab in a different browser since the
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // one we supplied didn't support additional tabs.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(popup, p.browser);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This time, browser() is _not_ compatible with popup since it is not an
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // incognito window.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have three windows, each with one tab:
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1. the browser() provided by the framework (unchanged in this test)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 2. the incognito popup we created originally
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3. the new incognito tabbed browser that was created by Navigate().
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup->tab_strip_model()->count());
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_tabbed());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from a normal Browser results in a new Browser with TYPE_POPUP.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup) {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_POPUP;
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_bounds = gfx::Rect(0, 0, 200, 200);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for new popup to to load and gain focus.
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new, focused popup window.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(stevenjb): Enable this test. See: crbug.com/79493
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->window()->IsActive());
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_popup());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p.browser->is_app());
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have two windows, the browser() provided by the framework and the
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new popup window.
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from a normal Browser results in a new Browser with is_app() true.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopup_ExtensionId) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_POPUP;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.extension_app_id = "extensionappid";
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_bounds = gfx::Rect(0, 0, 200, 200);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for new popup to to load and gain focus.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new, focused popup window.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_popup());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_app());
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have two windows, the browser() provided by the framework and the
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new popup window.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from a normal popup results in a new Browser with TYPE_POPUP.
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupFromPopup) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a popup.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p1(MakeNavigateParams());
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1.disposition = NEW_POPUP;
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1.window_bounds = gfx::Rect(0, 0, 200, 200);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p1);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open another popup.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p2(MakeNavigateParams(p1.browser));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2.disposition = NEW_POPUP;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2.window_bounds = gfx::Rect(0, 0, 200, 200);
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p2);
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new normal popup window.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(p1.browser, p2.browser);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p2.browser->is_type_popup());
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p2.browser->is_app());
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have three windows, the browser() provided by the framework,
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first popup window, and the second popup window.
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p1.browser->tab_strip_model()->count());
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p2.browser->tab_strip_model()->count());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
519a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// from an app frame results in a new Browser with TYPE_POPUP.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_NewPopupFromAppWindow) {
522a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams(app_browser));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_POPUP;
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_bounds = gfx::Rect(0, 0, 200, 200);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new popup app window.
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(app_browser, p.browser);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_popup());
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_app());
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have three windows, the app window, the app popup it created,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the original browser() provided by the framework.
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3u, chrome::GetTotalBrowserCount());
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
543a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// from an app popup results in a new Browser also of TYPE_POPUP.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_NewPopupFromAppPopup) {
546a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  Browser* app_browser = CreateEmptyBrowserForApp(browser()->profile());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app popup.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p1(MakeNavigateParams(app_browser));
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1.disposition = NEW_POPUP;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p1.window_bounds = gfx::Rect(0, 0, 200, 200);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p1);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open another app popup.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p2(MakeNavigateParams(p1.browser));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2.disposition = NEW_POPUP;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p2.window_bounds = gfx::Rect(0, 0, 200, 200);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p2);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new popup app window.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p1.browser);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(p1.browser, p2.browser);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p2.browser->is_type_popup());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p2.browser->is_app());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have four windows, the app window, the first app popup,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the second app popup, and the original browser() provided by the framework.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4u, chrome::GetTotalBrowserCount());
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p1.browser->tab_strip_model()->count());
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p2.browser->tab_strip_model()->count());
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from an extension app tab results in a new Browser with TYPE_APP_POPUP.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_NewPopupFromExtensionApp) {
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(beng): TBD.
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with window_action = SHOW_WINDOW_INACTIVE
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// does not focus a new new popup window.
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupUnfocused) {
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_POPUP;
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_bounds = gfx::Rect(0, 0, 200, 200);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW_INACTIVE;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for new popup to load (and gain focus if the test fails).
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new, unfocused, popup window.
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(Browser::TYPE_POPUP, p.browser->type());
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(stevenjb): Enable this test. See: crbug.com/79493
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p.browser->window()->IsActive());
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
599a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// This test verifies that navigating with WindowOpenDisposition = NEW_POPUP
600a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// and trusted_source = true results in a new Browser where is_trusted_source()
601a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch// is true.
602a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewPopupTrusted) {
603a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  chrome::NavigateParams p(MakeNavigateParams());
604a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  p.disposition = NEW_POPUP;
605a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  p.trusted_source = true;
606a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  p.window_bounds = gfx::Rect(0, 0, 200, 200);
607a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Wait for new popup to to load and gain focus.
608a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ui_test_utils::NavigateToURL(&p);
609a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
610a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  // Navigate() should have opened a new popup window of TYPE_TRUSTED_POPUP.
611a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_NE(browser(), p.browser);
612a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(p.browser->is_type_popup());
613a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  EXPECT_TRUE(p.browser->is_trusted_source());
614a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
615a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
616a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = NEW_WINDOW
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// always opens a new window.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_NewWindow) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_WINDOW;
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new toplevel window.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_tabbed());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have two windows, the browser() provided by the framework and
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the new normal window.
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = INCOGNITO
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// opens a new incognito window if no existing incognito window is present.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_Incognito) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = OFF_THE_RECORD;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new toplevel incognito window.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser()->profile()->GetOffTheRecordProfile(),
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p.browser->profile());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |source_contents| should be set to NULL because the profile for the new
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page is different from the originating page.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, p.source_contents);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have two windows, the browser() provided by the framework and
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the new incognito window.
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that navigating with WindowOpenDisposition = INCOGNITO
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reuses an existing incognito window when possible.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IncognitoRefocus) {
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* incognito_browser =
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CreateEmptyBrowserForType(Browser::TYPE_TABBED,
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                browser()->profile()->GetOffTheRecordProfile());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = OFF_THE_RECORD;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new tab in the existing incognito window.
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p.browser, incognito_browser);
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should now have two windows, the browser() provided by the framework and
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the incognito window we opened earlier.
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, incognito_browser->tab_strip_model()->count());
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that no navigation action occurs when
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowOpenDisposition = SUPPRESS_OPEN.
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SuppressOpen) {
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunSuppressTest(SUPPRESS_OPEN);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that no navigation action occurs when
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowOpenDisposition = SAVE_TO_DISK.
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_SaveToDisk) {
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunSuppressTest(SAVE_TO_DISK);
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that no navigation action occurs when
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WindowOpenDisposition = IGNORE_ACTION.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Disposition_IgnoreAction) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunSuppressTest(IGNORE_ACTION);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This tests adding a foreground tab with a predefined WebContents.
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, TargetContents_ForegroundTab) {
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_FOREGROUND_TAB;
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.target_contents = CreateWebContents();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened the contents in a new foreground in the
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current Browser.
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(browser()->tab_strip_model()->GetActiveWebContents(),
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            p.target_contents);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one window, with two tabs.
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This tests adding a popup with a predefined WebContents.
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, DISABLED_TargetContents_Popup) {
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_POPUP;
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.target_contents = CreateWebContents();
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_bounds = gfx::Rect(10, 10, 500, 500);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have opened a new popup window.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(browser(), p.browser);
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(p.browser->is_type_popup());
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(p.browser->is_app());
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The web platform is weird. The window bounds specified in
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |p.window_bounds| are used as follows:
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - the origin is used to position the window
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // - the size is used to size the WebContents of the window.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As such the position of the resulting window will always match
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // p.window_bounds.origin(), but its size will not. We need to match
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the size against the selected tab's view's container size.
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only Windows positions the window according to |p.window_bounds.origin()| -
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // on Mac the window is offset from the opener and on Linux it always opens
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at 0,0.
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p.window_bounds.origin(),
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            p.browser->window()->GetRestoredBounds().origin());
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // All platforms should respect size however provided width > 400 (Mac has a
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimum window width of 400).
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(p.window_bounds.size(),
744010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            p.target_contents->GetContainerBounds().size());
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have two windows, the new popup and the browser() provided by the
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // framework.
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, p.browser->tab_strip_model()->count());
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This tests adding a tab at a specific index.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, Tabstrip_InsertAtIndex) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is not meant to be a comprehensive test of whether or not the tab
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // implementation of the browser observes the insertion index. That is
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // covered by the unit tests for TabStripModel. This merely verifies that
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // insertion index preference is reflected in common cases.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = NEW_FOREGROUND_TAB;
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.tabstrip_index = 0;
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.tabstrip_add_types = TabStripModel::ADD_FORCE_INDEX;
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate() should have inserted a new tab at slot 0 in the tabstrip.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->GetIndexOfWebContents(
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<const WebContents*>(p.target_contents)));
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one window - the browser() provided by the framework.
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_NAVIGATE opens a new tab navigated to the specified URL if
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// no previous tab with that URL (minus the path) exists.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabNew_IgnorePath) {
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
7821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 2 tabs, the 2nd selected.
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a new singleton tab with a sub-page.
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = GetContentSettingsURL();
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last tab should now be selected and navigated to the sub-page of the
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetContentSettingsURL(),
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the path) which is navigated to the specified URL.
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabExisting_IgnorePath) {
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url1(GetSettingsURL());
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url1,
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 3 tabs, the 3rd selected.
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url1.
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = GetContentSettingsURL();
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The middle tab should now be selected and navigated to the sub-page of the
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL.
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetContentSettingsURL(),
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_NAVIGATE opens an existing tab with the matching URL (minus
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the path) which is navigated to the specified URL.
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabExistingSubPath_IgnorePath) {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url1(GetContentSettingsURL());
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url1,
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 3 tabs, the 3rd selected.
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url1.
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = GetClearBrowsingDataURL();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The middle tab should now be selected and navigated to the sub-page of the
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL.
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetClearBrowsingDataURL(),
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_STAY_PUT opens an existing tab with the matching URL (minus
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the path).
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabExistingSubPath_IgnorePath2) {
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url1(GetContentSettingsURL());
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url1,
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 3 tabs, the 3rd selected.
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
8892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->active_index());
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to singleton_url1.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = GetClearBrowsingDataURL();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_STAY_PUT;
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The middle tab should now be selected.
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(singleton_url1,
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_NAVIGATE will update the current tab's URL if the currently
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// selected tab is a match but has a different path.
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabFocused_IgnorePath) {
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url_current(GetContentSettingsURL());
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url_current,
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 2 tabs, the 2nd selected.
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a different settings path.
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url_target(GetClearBrowsingDataURL());
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_url_target;
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The second tab should still be selected, but navigated to the new path.
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(singleton_url_target,
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that constructing params with disposition = SINGLETON_TAB
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and IGNORE_AND_NAVIGATE will open an existing matching tab with a different
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// query.
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_SingletonTabExisting_IgnoreQuery) {
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int initial_tab_count = browser()->tab_strip_model()->count();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url_current("chrome://settings/internet");
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddSelectedTabWithURL(browser(), singleton_url_current,
9481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count());
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index());
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a different settings path.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url_target(
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "chrome://settings/internet?"
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "servicePath=/profile/ethernet_00aa00aa00aa&networkType=1");
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_url_target;
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Navigate(&p);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Last tab should still be selected.
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(browser(), p.browser);
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->count());
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(initial_tab_count, browser()->tab_strip_model()->active_index());
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that the settings page isn't opened in the incognito
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window.
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled until fixed for uber settings: http://crbug.com/111243
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_Disposition_Settings_UseNonIncognitoWindow) {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunUseNonIncognitoWindowTest(GetSettingsURL());
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
978c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that the view-source settings page isn't opened in the
979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// incognito window.
980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    BrowserNavigatorTest,
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Disposition_ViewSource_Settings_DoNothingIfIncognitoForced) {
983868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string view_source(content::kViewSourceScheme);
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_source.append(":");
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_source.append(chrome::kChromeUISettingsURL);
986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunDoNothingIfIncognitoIsForcedTest(GURL(view_source));
987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
988c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
989c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test verifies that the view-source settings page isn't opened in the
990c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// incognito window even if incognito mode is forced (does nothing in that
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// case).
992c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       Disposition_ViewSource_Settings_UseNonIncognitoWindow) {
994868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  std::string view_source(content::kViewSourceScheme);
995c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_source.append(":");
996c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  view_source.append(chrome::kChromeUISettingsURL);
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RunUseNonIncognitoWindowTest(GURL(view_source));
998c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that the settings page isn't opened in the incognito
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window from a non-incognito window (bookmark open-in-incognito trigger).
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled until fixed for uber settings: http://crbug.com/111243
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_Disposition_Settings_UseNonIncognitoWindowForBookmark) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser(), GetSettingsURL(),
10061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_AUTO_BOOKMARK);
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.disposition = OFF_THE_RECORD;
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Navigate(&params);
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Settings page is expected to always open in normal mode regardless
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of whether the user is trying to open it in incognito mode or not.
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that if incognito mode is forced (by policy), settings
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page doesn't open at all.
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled until fixed for uber settings: http://crbug.com/111243
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISABLED_Disposition_Settings_DoNothingIfIncognitoIsForced) {
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDoNothingIfIncognitoIsForcedTest(GetSettingsURL());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that the bookmarks page isn't opened in the incognito
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window.
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_Bookmarks_UseNonIncognitoWindow) {
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunUseNonIncognitoWindowTest(GURL(chrome::kChromeUIBookmarksURL));
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bookmark manager is expected to always open in normal mode regardless
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of whether the user is trying to open it in incognito mode or not.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that if incognito mode is forced (by policy), bookmark
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// manager doesn't open at all.
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       Disposition_Bookmarks_DoNothingIfIncognitoIsForced) {
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunDoNothingIfIncognitoIsForcedTest(GURL(chrome::kChromeUIBookmarksURL));
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test makes sure a crashed singleton tab reloads from a new navigation.
10495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396371
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       DISABLED_NavigateToCrashedSingletonTab) {
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL singleton_url(GetContentSettingsURL());
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents = chrome::AddSelectedTabWithURL(
10541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), singleton_url, ui::PAGE_TRANSITION_LINK);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should have one browser with 2 tabs, the 2nd selected.
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Kill the singleton tab.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents->SetIsCrashed(base::TERMINATION_STATUS_PROCESS_CRASHED, -1);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(web_contents->IsCrashed());
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.disposition = SINGLETON_TAB;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = singleton_url;
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.path_behavior = chrome::NavigateParams::IGNORE_AND_NAVIGATE;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab should not be sad anymore.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(web_contents->IsCrashed());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromDefaultToOptionsInSameTab) {
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromBlankToOptionsInSameTab) {
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
1094f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  p.url = GURL(url::kAboutBlankURL);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromNTPToOptionsInSameTab) {
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  p.url = GURL(chrome::kChromeUINewTabURL);
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
1116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
1117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromPageToOptionsInNewTab) {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams p(MakeNavigateParams());
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&p);
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetGoogleURL(),
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromNTPToOptionsSingleton) {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromNTPToOptionsPageInSameTab) {
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowClearBrowsingDataDialog(browser());
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetClearBrowsingDataURL(),
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowClearBrowsingDataDialog(browser());
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GetClearBrowsingDataURL(),
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       NavigateFromOtherTabToSingletonOptions) {
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowSettings(browser());
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
12231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ui::PAGE_TRANSITION_LINK);
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This load should simply cause a tab switch.
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ShowSettings(browser());
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(GetSettingsURL(),
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            ShortenUberURL(browser()->tab_strip_model()->
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetActiveWebContents()->GetURL()));
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, CloseSingletonTab) {
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < 2; ++i) {
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), GetGoogleURL(),
12421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ui::PAGE_TRANSITION_TYPED);
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(0, true);
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WindowedNotificationObserver observer(
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content::NotificationService::AllSources());
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::ShowSettings(browser());
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    observer.Wait();
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(browser()->tab_strip_model()->CloseWebContentsAt(
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2, TabStripModel::CLOSE_USER_GESTURE));
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csilv): Update this for uber page. http://crbug.com/111579.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_NavigateFromDefaultToHistoryInSameTab) {
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowHistory(browser());
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUIHistoryFrameURL),
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NavigateFromDefaultToBookmarksInSameTab DISABLED_NavigateFromDefaultToBookmarksInSameTab
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NavigateFromDefaultToBookmarksInSameTab NavigateFromDefaultToBookmarksInSameTab
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MAYBE_NavigateFromDefaultToBookmarksInSameTab) {
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowBookmarkManager(browser());
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(StartsWithASCII(
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->GetURL().spec(),
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::kChromeUIBookmarksURL,
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      true));
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateFromDefaultToDownloadsInSameTab) {
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::ShowDownloads(browser());
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUIDownloadsURL),
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NavigateWithoutBrowser) {
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First navigate using the profile of the existing browser window, and
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // check that the window is reused.
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params(browser()->profile(), GetGoogleURL(),
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                ui::PAGE_TRANSITION_LINK);
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&params);
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate using the incognito profile and check that a new window
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is created.
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NavigateParams params_incognito(
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->profile()->GetOffTheRecordProfile(),
13251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      GetGoogleURL(), ui::PAGE_TRANSITION_LINK);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(&params_incognito);
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2u, chrome::GetTotalBrowserCount());
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1330a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest, ViewSourceIsntSingleton) {
1331a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  const std::string viewsource_ntp_url =
1332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      std::string(content::kViewSourceScheme) + ":" +
1333a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      chrome::kChromeUIVersionURL;
1334a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1335a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  chrome::NavigateParams viewsource_params(browser(),
1336a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                           GURL(viewsource_ntp_url),
13371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                           ui::PAGE_TRANSITION_LINK);
1338a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  ui_test_utils::NavigateToURL(&viewsource_params);
1339a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1340a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  chrome::NavigateParams singleton_params(browser(),
1341a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                          GURL(chrome::kChromeUIVersionURL),
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                          ui::PAGE_TRANSITION_LINK);
1343a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  singleton_params.disposition = SINGLETON_TAB;
1344a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(-1, chrome::GetIndexOfSingletonTab(&singleton_params));
1345a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1346a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
1347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This test verifies that browser initiated navigations can send requests
1348a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// using POST.
1349a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       SendBrowserInitiatedRequestUsingPOST) {
1351a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Uses a test sever to verify POST request.
1352a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1353a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1354a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Open a browser initiated POST request in new foreground tab.
1355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle));
1356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string post_data = kExpectedTitle;
1357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
1358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle(
1359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      test_server()->GetURL(kEchoTitleCommand), post_data, true, &title));
1360a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(expected_title, title);
1361a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This test verifies that renderer initiated navigations can NOT send requests
1364a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// using POST.
1365a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserNavigatorTest,
1366a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                       SendRendererInitiatedRequestUsingPOST) {
1367a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Uses a test sever to verify POST request.
1368a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1369a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1370a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Open a renderer initiated POST request in new foreground tab.
1371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 expected_title(base::ASCIIToUTF16(kExpectedTitle));
1372a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  std::string post_data = kExpectedTitle;
1373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title;
1374a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(OpenPOSTURLInNewForegroundTabAndGetTitle(
1375a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      test_server()->GetURL(kEchoTitleCommand), post_data, false, &title));
1376a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_NE(expected_title, title);
1377a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
1378a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1379a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
1380