browser_browsertest.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/sys_info.h"
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/defaults.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browsertest.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/extensions/extension_service.h"
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_host/render_process_host.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/renderer_host/render_view_host.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_contents.h"
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/pinned_tab_codec.h"
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_init.h"
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_list.h"
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h"
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/notification_source.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/page_transition_types.h"
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/url_constants.h"
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/mock_host_resolver.h"
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/i18n/rtl.h"
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/browser_process.h"
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char* kBeforeUnloadHTML =
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "<html><head><title>beforeunload</title></head><body>"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "</body></html>";
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char* kOpenNewBeforeUnloadPage =
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    "w=window.open(); w.onbeforeunload=function(e){return 'foo'};";
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst FilePath::CharType* kTitle2File = FILE_PATH_LITERAL("title2.html");
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data");
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Given a page title, returns the expected window caption string.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring WindowCaptionFromPageTitle(std::wstring page_title) {
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On Mac or ChromeOS, we don't want to suffix the page title with
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the application name.
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (page_title.empty()) {
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return UTF16ToWideHack(
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        l10n_util::GetStringUTF16(IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED));
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return page_title;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (page_title.empty())
753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return UTF16ToWideHack(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  return UTF16ToWideHack(
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT,
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                 WideToUTF16Hack(page_title)));
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of active RenderProcessHosts.
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint CountRenderProcessHosts() {
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int result = 0;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       !i.IsAtEnd(); i.Advance())
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ++result;
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockTabStripModelObserver : public TabStripModelObserver {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabStripModelObserver() : closing_count_(0) {}
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TabClosingAt(TabStripModel* tab_strip_model,
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                            TabContentsWrapper* contents,
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            int index) {
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    closing_count_++;
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closing_count() const { return closing_count_; }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closing_count_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockTabStripModelObserver);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used by CloseWithAppMenuOpen. Invokes CloseWindow on the supplied browser.
111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CloseWindowTask : public Task {
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit CloseWindowTask(Browser* browser) : browser_(browser) {}
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void Run() {
116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    browser_->CloseWindow();
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* browser_;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(CloseWindowTask);
123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used by CloseWithAppMenuOpen. Posts a CloseWindowTask and shows the app menu.
126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RunCloseWithAppMenuTask : public Task {
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit RunCloseWithAppMenuTask(Browser* browser) : browser_(browser) {}
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void Run() {
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // ShowAppMenu is modal under views. Schedule a task that closes the window.
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MessageLoop::current()->PostTask(FROM_HERE, new CloseWindowTask(browser_));
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    browser_->ShowAppMenu();
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
137731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* browser_;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(RunCloseWithAppMenuTask);
140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace
143731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass BrowserTest : public ExtensionBrowserTest {
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // In RTL locales wrap the page title with RTL embedding characters so that it
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // matches the value returned by GetWindowTitle().
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring LocaleWindowCaptionFromPageTitle(
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::wstring& expected_title) {
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::wstring page_title = WindowCaptionFromPageTitle(expected_title);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string locale = g_browser_process->GetApplicationLocale();
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (base::i18n::GetTextDirectionForLocale(locale.c_str()) ==
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        base::i18n::RIGHT_TO_LEFT) {
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::i18n::WrapStringWithLTRFormatting(&page_title);
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return page_title;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Do we need to use the above code on POSIX as well?
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return page_title;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
165731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the app extension aptly named "App Test".
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* GetExtension() {
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const ExtensionList* extensions =
16821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        browser()->profile()->GetExtensionService()->extensions();
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < extensions->size(); ++i) {
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if ((*extensions)[i]->name() == "App Test")
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return (*extensions)[i];
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Launch the app on a page with no title, check that the app title was set
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// correctly.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, NoTitle) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle1File)));
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(L"title1.html"),
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UTF16ToWideHack(browser()->GetWindowTitleForCurrentTab()));
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 tab_title;
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("title1.html"), tab_title);
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Launch the app, navigate to a page with a title, check that the app title
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// was set correctly.
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, Title) {
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle2File)));
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring test_title(L"Title Of Awesomeness");
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(test_title),
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UTF16ToWideHack(browser()->GetWindowTitleForCurrentTab()));
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 tab_title;
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(test_title), tab_title);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) {
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     FilePath(kTitle1File)));
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
209513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddTabAtIndex(0, url, PageTransition::TYPED);
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, browser()->selected_index());
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* second_tab = browser()->GetTabContentsAt(1);
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(second_tab);
21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  second_tab->render_view_host()->ExecuteJavascriptInWebFrame(
21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16(),
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ASCIIToUTF16("alert('Activate!');"));
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert->CloseModalDialog();
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->selected_index());
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create 34 tabs and verify that a lot of processes have been created. The
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// exact number of processes depends on the amount of memory. Previously we
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// had a hard limit of 31 processes and this test is mainly directed at
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// verifying that we don't crash when we pass this limit.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Warning: this test can take >30 seconds when running on a slow (low
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// memory?) Mac builder.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, ThirtyFourTabs) {
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     FilePath(kTitle2File)));
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There is one initial tab.
234513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (int ix = 0; ix != 33; ++ix)
235513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(34, browser()->tab_count());
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See browser\renderer_host\render_process_host.cc for the algorithm to
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // decide how many processes to create.
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (base::SysInfo::AmountOfPhysicalMemoryMB() >= 2048) {
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_GE(CountRenderProcessHosts(), 24);
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_LE(CountRenderProcessHosts(), 23);
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test for crbug.com/22004.  Reloading a page with a before unload handler and
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// then canceling the dialog should not leave the throbber spinning.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
25072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to another page, but click cancel in the dialog.  Make sure that
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the throbber stops spinning.
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->Reload(CURRENT_TAB);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert->CloseModalDialog();
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(browser()->GetSelectedTabContents()->is_loading());
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clear the beforeunload handler so the test can easily exit.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetSelectedTabContents()->render_view_host()->
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16("onbeforeunload=null;"));
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Crashy on mac.  http://crbug.com/38522
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_SingleBeforeUnloadAfterWindowClose \
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DISABLED_SingleBeforeUnloadAfterWindowClose
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_SingleBeforeUnloadAfterWindowClose \
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SingleBeforeUnloadAfterWindowClose
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test for crbug.com/11647.  A page closed with window.close() should not have
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// two beforeunload dialogs shown.
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_SingleBeforeUnloadAfterWindowClose) {
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetSelectedTabContents()->render_view_host()->
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16(kOpenNewBeforeUnloadPage));
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the new window with JavaScript, which should show a single
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // beforeunload dialog.  Then show another alert, to make it easy to verify
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that a second beforeunload dialog isn't shown.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetTabContentsAt(0)->render_view_host()->
28672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16("w.close(); alert('bar');"));
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
2893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  alert->native_dialog()->AcceptAppModalDialog();
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert = ui_test_utils::WaitForAppModalDialog();
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   is_before_unload_dialog());
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  alert->native_dialog()->AcceptAppModalDialog();
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that get_process_idle_time() returns reasonable values when compared
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with time deltas measured locally.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks start = base::TimeTicks::Now();
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle1File)));
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; !it.IsAtEnd(); it.Advance()) {
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeDelta renderer_td =
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        it.GetCurrentValue()->get_child_process_idle_time();
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeDelta browser_td = base::TimeTicks::Now() - start;
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser_td >= renderer_td);
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test IDC_CREATE_SHORTCUTS command is enabled for url scheme file, ftp, http
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and https and disabled for chrome://, about:// etc.
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(pinkerton): Disable app-mode in the model until we implement it
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// on the Mac. http://crbug.com/13148
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX)
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kEmptyFile = FILE_PATH_LITERAL("empty.html");
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(kEmptyFile)));
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), file_url);
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url(test_server()->GetURL(""));
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), http_url);
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTPS, FilePath(kDocRoot));
3433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL https_url(test_server.GetURL("/"));
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(https_url.SchemeIs(chrome::kHttpsScheme));
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), https_url);
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_FTP, FilePath(kDocRoot));
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL ftp_url(test_server.GetURL(""));
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ftp_url.SchemeIs(chrome::kFtpScheme));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), ftp_url);
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutInvalid) {
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Urls that should not have shortcuts.
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL new_tab_url(chrome::kChromeUINewTabURL);
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), new_tab_url);
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL history_url(chrome::kChromeUIHistoryURL);
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), history_url);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL downloads_url(chrome::kChromeUIDownloadsURL);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), downloads_url);
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL blank_url(chrome::kAboutBlankURL);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), blank_url);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Change a tab into an application window.
38372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// DISABLED: http://crbug.com/72310
38472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_ConvertTabToAppShortcut) {
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(test_server()->Start());
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL http_url(test_server()->GetURL(""));
387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
389201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, browser()->tab_count());
390201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* initial_tab = browser()->GetTabContentsAt(0);
391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* app_tab = browser()->AddSelectedTabWithURL(
392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      http_url, PageTransition::TYPED)->tab_contents();
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2, browser()->tab_count());
394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
395201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
396201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Normal tabs should accept load drops.
397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Turn |app_tab| into a tab in an app panel.
401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  browser()->ConvertContentsToApplication(app_tab);
402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The launch should have created a new browser.
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the new browser.
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* app_browser = NULL;
408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       i != BrowserList::end() && !app_browser; ++i) {
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (*i != browser())
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      app_browser = *i;
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(app_browser);
414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Check that the tab contents is in the new browser, and not in the old.
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, browser()->tab_count());
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(initial_tab, browser()->GetTabContentsAt(0));
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Check that the appliaction browser has a single tab, and that tab contains
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the content that we app-ified.
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, app_browser->tab_count());
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(app_tab, app_browser->GetTabContentsAt(0));
423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
424201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Normal tabs should accept load drops.
425201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
42772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The tab in an app window should not.
428201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_MACOSX)
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test RenderView correctly send back favicon url for web page that redirects
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to an anchor in javascript body.onload handler.
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, FaviconOfOnloadRedirectToAnchorPage) {
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("files/onload_redirect_to_anchor.html"));
4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL expected_favicon_url(test_server()->GetURL("files/test.png"));
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationEntry* entry = browser()->GetSelectedTabContents()->
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller().GetActiveEntry();
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that an icon can be changed from JS.
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, FaviconChange) {
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kFile =
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FILE_PATH_LITERAL("onload_change_favicon.html");
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(kFile)));
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), file_url);
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationEntry* entry = browser()->GetSelectedTabContents()->
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller().GetActiveEntry();
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kIcon =
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FILE_PATH_LITERAL("test1.png");
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL expected_favicon_url(
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         FilePath(kIcon)));
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure TabClosing is sent when uninstalling an extension that is an app
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab.
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) {
4693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
4713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("empty.html"));
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* model = browser()->tabstrip_model();
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_app = GetExtension();
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
480201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContentsWrapper* app_contents =
481201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      Browser::TabContentsFactory(browser()->profile(), NULL,
482201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  MSG_ROUTING_NONE, NULL, NULL);
483201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  app_contents->tab_contents()->SetExtensionApp(extension_app);
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(0, true);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabStripModelObserver observer;
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddObserver(&observer);
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Uninstall the extension and make sure TabClosing is sent.
49321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  service->UninstallExtension(GetExtension()->id(), false);
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, observer.closing_count());
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->RemoveObserver(&observer);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There should only be one tab now.
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, browser()->tab_count());
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if !defined(OS_MACOSX)
50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Open with --app-id=<id>, and see that an app window opens.
50572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) {
50672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(test_server()->Start());
50772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Load an app.
50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  host_resolver()->AddRule("www.example.com", "127.0.0.1");
51072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const Extension* extension_app = GetExtension();
51272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CommandLine command_line(CommandLine::NO_PROGRAM);
51472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserInit::LaunchWithProfile launch(FilePath(), command_line);
51772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(launch.OpenApplicationWindow(browser()->profile()));
51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Check that the new browser has an app name.
52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The launch should have created a new browser.
52172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Find the new browser.
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Browser* new_browser = NULL;
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (BrowserList::const_iterator i = BrowserList::begin();
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i != BrowserList::end() && !new_browser; ++i) {
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (*i != browser())
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new_browser = *i;
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(new_browser);
53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(new_browser != browser());
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The browser's app_name should include the app's ID.
53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_NE(
53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new_browser->app_name_.find(extension_app->id()),
53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      std::string::npos) << new_browser->app_name_;
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://crbug.com/46198. On XP/Vista, the failure rate is 5 ~ 6%.
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_PageLanguageDetection FLAKY_PageLanguageDetection
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_PageLanguageDetection PageLanguageDetection
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the CLD (Compact Language Detection) works properly.
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_PageLanguageDetection) {
5493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* current_tab = browser()->GetSelectedTabContents();
55221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Source<TabContents> source(current_tab);
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to a page in English.
55521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      en_language_detected_signal(NotificationType::TAB_LANGUAGE_DETERMINED,
55721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  source);
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      browser(), GURL(test_server()->GetURL("files/english_page.html")));
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(current_tab->language_state().original_language().empty());
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  en_language_detected_signal.Wait();
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string lang;
56321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
56421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        source.map_key(), &lang));
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("en", lang);
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("en", current_tab->language_state().original_language());
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now navigate to a page in French.
56921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      fr_language_detected_signal(NotificationType::TAB_LANGUAGE_DETERMINED,
57121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  source);
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      browser(), GURL(test_server()->GetURL("files/french_page.html")));
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(current_tab->language_state().original_language().empty());
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fr_language_detected_signal.Wait();
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  lang.clear();
57721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
57821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        source.map_key(), &lang));
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("fr", lang);
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("fr", current_tab->language_state().original_language());
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chromeos defaults to restoring the last session, so this test isn't
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// applicable.
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_CHROMEOS)
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Crashy, http://crbug.com/38522
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define RestorePinnedTabs DISABLED_RestorePinnedTabs
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure pinned tabs are restored correctly on start.
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
5923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add an pinned app tab.
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
5963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("empty.html"));
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* model = browser()->tabstrip_model();
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
599513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_app = GetExtension();
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
601201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContentsWrapper* app_contents =
602201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser::TabContentsFactory(browser()->profile(), NULL,
603201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                MSG_ROUTING_NONE, NULL, NULL);
604201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  app_contents->tab_contents()->SetExtensionApp(extension_app);
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(0, true);
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a non pinned tab.
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a pinned non-app tab.
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(2, true);
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Write out the pinned tabs.
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PinnedTabCodec::WritePinnedTabs(browser()->profile());
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate launching again.
621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CommandLine dummy(CommandLine::NO_PROGRAM);
6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BrowserInit::LaunchWithProfile launch(FilePath(), dummy);
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  launch.profile_ = browser()->profile();
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  launch.ProcessStartupURLs(std::vector<GURL>());
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The launch should have created a new browser.
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find the new browser.
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* new_browser = NULL;
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != BrowserList::end() && !new_browser; ++i) {
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (*i != browser())
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_browser = *i;
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_browser);
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_browser != browser());
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should get back an additional tab for the app.
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2, new_browser->tab_count());
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the state matches.
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* new_model = new_browser->tabstrip_model();
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsAppTab(0));
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(new_model->IsAppTab(1));
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsTabPinned(0));
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsTabPinned(1));
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
650201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(
651201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      new_model->GetTabContentsAt(0)->tab_contents()->extension_app() ==
652201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          extension_app);
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_CHROMEOS)
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This test verifies we don't crash when closing the last window and the app
657731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// menu is showing.
658513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CloseWithAppMenuOpen) {
659731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (browser_defaults::kBrowserAliveWithNoWindows)
660731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
661731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
662731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We need a message loop running for menus on windows.
663731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MessageLoop::current()->PostTask(FROM_HERE,
664731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                   new RunCloseWithAppMenuTask(browser()));
665731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
667201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if !defined(OS_MACOSX)
668201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
669201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(test_server()->Start());
670201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
671201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Load an app
672201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
673201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
674201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const Extension* extension_app = GetExtension();
675201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
676201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
677201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* app_window = Browser::OpenApplication(
678201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      browser()->profile(), extension_app, extension_misc::LAUNCH_WINDOW, NULL);
679201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(app_window);
680201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
681201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Apps launched in a window from the NTP do not have extension_app set in
682201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // tab contents.
683201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(app_window->extension_app());
684201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(extension_app->GetFullLaunchURL(), app_window->GetURL());
685201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
686201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The launch should have created a new browser.
687201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the new browser.
690201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* new_browser = NULL;
691201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       i != BrowserList::end() && !new_browser; ++i) {
693201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (*i != browser())
694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      new_browser = *i;
695201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
696201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(new_browser);
697201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(new_browser != browser());
698201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
699201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(Browser::TYPE_APP, new_browser->type());
70072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
70172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The browser's app name should include the extension's id.
70272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string app_name = new_browser->app_name_;
70372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_NE(app_name.find(extension_app->id()), std::string::npos)
70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      << "Name " << app_name << " should contain id "<< extension_app->id();
705201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
706201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif  // !defined(OS_MACOSX)
707201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(ben): this test was never enabled. It has bit-rotted since being added.
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It originally lived in browser_unittest.cc, but has been moved here to make
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// room for real browser unit tests.
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if 0
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserTest2 : public InProcessBrowserTest {
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserTest2() {
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Avoid making external DNS lookups. In this test we don't need this
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // to succeed.
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_resolver_proc_->AddSimulatedFailure("*.google.com");
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_;
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::ScopedDefaultHostResolverProc scoped_host_resolver_proc_;
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest2, NoTabsInPopups) {
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser::RegisterAppPrefs(L"Test");
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We start with a normal browser with one tab.
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open a popup browser with a single blank foreground tab.
734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* popup_browser = browser()->CreateForType(Browser::TYPE_POPUP,
735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                    browser()->profile());
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_browser->AddBlankTab(true);
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, popup_browser->tab_count());
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the popup browser.
740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params1(url, PageTransition::TYPED);
741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  popup_browser->AddTabWithURL(&params1);
742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(popup_browser, params1.target);
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, popup_browser->tab_count());
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have two.
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an app frame browser with a single blank foreground tab.
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* app_browser =
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->CreateForApp(L"Test", browser()->profile(), false);
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_browser->AddBlankTab(true);
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_browser->tab_count());
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the app browser.
757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params2(GURL(chrome::kAboutBlankURL),
758731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              PageTransition::TYPED);
759731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  app_browser->AddTabWithURL(&params2);
760731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(app_browser, params2.target);
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_browser->tab_count());
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have three.
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser()->tab_count());
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an app frame popup browser with a single blank foreground tab.
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* app_popup_browser =
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->CreateForApp(L"Test", browser()->profile(), false);
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_popup_browser->AddBlankTab(true);
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_popup_browser->tab_count());
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the app popup browser.
775731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params3(GURL(chrome::kAboutBlankURL),
776731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              PageTransition::TYPED);
777731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  app_popup_browser->AddTabWithURL(&params3);
778731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(app_popup_browser, params3.target);
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_popup_browser->tab_count());
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have four.
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4, browser()->tab_count());
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the additional browsers.
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_browser->CloseAllTabs();
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_browser->CloseAllTabs();
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_popup_browser->CloseAllTabs();
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
792