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"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/extensions/extension_tab_helper.h"
1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/pinned_tab_codec.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/translate/translate_tab_helper.h"
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/js_modal_dialog.h"
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_init.h"
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_list.h"
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h"
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_switches.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/common/url_constants.h"
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_process_host.h"
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_source.h"
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/page_transition_types.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/mock_host_resolver.h"
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h"
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_WIN)
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/i18n/rtl.h"
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/browser_process.h"
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char* kBeforeUnloadHTML =
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "<html><head><title>beforeunload</title></head><body>"
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "</body></html>";
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst char* kOpenNewBeforeUnloadPage =
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    "w=window.open(); w.onbeforeunload=function(e){return 'foo'};";
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst FilePath::CharType* kTitle2File = FILE_PATH_LITERAL("title2.html");
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickconst FilePath::CharType kDocRoot[] = FILE_PATH_LITERAL("chrome/test/data");
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Given a page title, returns the expected window caption string.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring WindowCaptionFromPageTitle(std::wstring page_title) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // On Mac or ChromeOS, we don't want to suffix the page title with
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the application name.
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  if (page_title.empty()) {
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return UTF16ToWideHack(
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen        l10n_util::GetStringUTF16(IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED));
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  }
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return page_title;
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (page_title.empty())
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen    return UTF16ToWideHack(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME));
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  return UTF16ToWideHack(
803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT,
813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                 WideToUTF16Hack(page_title)));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Returns the number of active RenderProcessHosts.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint CountRenderProcessHosts() {
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int result = 0;
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (RenderProcessHost::iterator i(RenderProcessHost::AllHostsIterator());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       !i.IsAtEnd(); i.Advance())
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ++result;
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return result;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockTabStripModelObserver : public TabStripModelObserver {
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabStripModelObserver() : closing_count_(0) {}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void TabClosingAt(TabStripModel* tab_strip_model,
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                            TabContentsWrapper* contents,
100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                            int index) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    closing_count_++;
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closing_count() const { return closing_count_; }
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int closing_count_;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(MockTabStripModelObserver);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used by CloseWithAppMenuOpen. Invokes CloseWindow on the supplied browser.
113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass CloseWindowTask : public Task {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit CloseWindowTask(Browser* browser) : browser_(browser) {}
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void Run() {
118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    browser_->CloseWindow();
119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* browser_;
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(CloseWindowTask);
125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used by CloseWithAppMenuOpen. Posts a CloseWindowTask and shows the app menu.
128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass RunCloseWithAppMenuTask : public Task {
129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public:
130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  explicit RunCloseWithAppMenuTask(Browser* browser) : browser_(browser) {}
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  virtual void Run() {
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    // ShowAppMenu is modal under views. Schedule a task that closes the window.
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    MessageLoop::current()->PostTask(FROM_HERE, new CloseWindowTask(browser_));
135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    browser_->ShowAppMenu();
136731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
138731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private:
139731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* browser_;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  DISALLOW_COPY_AND_ASSIGN(RunCloseWithAppMenuTask);
142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick};
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
144731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}  // namespace
145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass BrowserTest : public ExtensionBrowserTest {
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // In RTL locales wrap the page title with RTL embedding characters so that it
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // matches the value returned by GetWindowTitle().
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::wstring LocaleWindowCaptionFromPageTitle(
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const std::wstring& expected_title) {
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::wstring page_title = WindowCaptionFromPageTitle(expected_title);
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    std::string locale = g_browser_process->GetApplicationLocale();
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (base::i18n::GetTextDirectionForLocale(locale.c_str()) ==
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        base::i18n::RIGHT_TO_LEFT) {
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      base::i18n::WrapStringWithLTRFormatting(&page_title);
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return page_title;
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Do we need to use the above code on POSIX as well?
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return page_title;
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
167731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the app extension aptly named "App Test".
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* GetExtension() {
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const ExtensionList* extensions =
17021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        browser()->profile()->GetExtensionService()->extensions();
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    for (size_t i = 0; i < extensions->size(); ++i) {
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if ((*extensions)[i]->name() == "App Test")
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        return (*extensions)[i];
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NOTREACHED();
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return NULL;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Launch the app on a page with no title, check that the app title was set
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// correctly.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, NoTitle) {
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle1File)));
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(L"title1.html"),
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UTF16ToWideHack(browser()->GetWindowTitleForCurrentTab()));
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 tab_title;
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("title1.html"), tab_title);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Launch the app, navigate to a page with a title, check that the app title
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// was set correctly.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, Title) {
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle2File)));
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::wstring test_title(L"Title Of Awesomeness");
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(test_title),
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            UTF16ToWideHack(browser()->GetWindowTitleForCurrentTab()));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 tab_title;
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(WideToUTF16(test_title), tab_title);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) {
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     FilePath(kTitle1File)));
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
211513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AddTabAtIndex(0, url, PageTransition::TYPED);
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(0, browser()->active_index());
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* second_tab = browser()->GetTabContentsAt(1);
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(second_tab);
21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  second_tab->render_view_host()->ExecuteJavascriptInWebFrame(
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      string16(),
21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ASCIIToUTF16("alert('Activate!');"));
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert->CloseModalDialog();
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ(1, browser()->active_index());
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#if defined(OS_WIN)
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// http://crbug.com/75274. On XP crashes inside
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// URLFetcher::Core::Registry::RemoveURLFetcherCore.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define MAYBE_ThirtyFourTabs FLAKY_ThirtyFourTabs
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#else
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#define MAYBE_ThirtyFourTabs ThirtyFourTabs
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#endif
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Create 34 tabs and verify that a lot of processes have been created. The
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// exact number of processes depends on the amount of memory. Previously we
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// had a hard limit of 31 processes and this test is mainly directed at
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// verifying that we don't crash when we pass this limit.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Warning: this test can take >30 seconds when running on a slow (low
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// memory?) Mac builder.
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_ThirtyFourTabs) {
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                     FilePath(kTitle2File)));
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There is one initial tab.
246513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (int ix = 0; ix != 33; ++ix)
247513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(34, browser()->tab_count());
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See browser\renderer_host\render_process_host.cc for the algorithm to
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // decide how many processes to create.
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (base::SysInfo::AmountOfPhysicalMemoryMB() >= 2048) {
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_GE(CountRenderProcessHosts(), 24);
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  } else {
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_LE(CountRenderProcessHosts(), 23);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test for crbug.com/22004.  Reloading a page with a before unload handler and
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// then canceling the dialog should not leave the throbber spinning.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to another page, but click cancel in the dialog.  Make sure that
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the throbber stops spinning.
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->Reload(CURRENT_TAB);
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert->CloseModalDialog();
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(browser()->GetSelectedTabContents()->is_loading());
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clear the beforeunload handler so the test can easily exit.
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetSelectedTabContents()->render_view_host()->
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16("onbeforeunload=null;"));
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Crashy on mac.  http://crbug.com/38522
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_SingleBeforeUnloadAfterWindowClose \
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        DISABLED_SingleBeforeUnloadAfterWindowClose
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_SingleBeforeUnloadAfterWindowClose \
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        SingleBeforeUnloadAfterWindowClose
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test for crbug.com/11647.  A page closed with window.close() should not have
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// two beforeunload dialogs shown.
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_SingleBeforeUnloadAfterWindowClose) {
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetSelectedTabContents()->render_view_host()->
29172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
29272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16(kOpenNewBeforeUnloadPage));
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the new window with JavaScript, which should show a single
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // beforeunload dialog.  Then show another alert, to make it easy to verify
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that a second beforeunload dialog isn't shown.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetTabContentsAt(0)->render_view_host()->
29872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ExecuteJavascriptInWebFrame(string16(),
29972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  ASCIIToUTF16("w.close(); alert('bar');"));
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  alert->native_dialog()->AcceptAppModalDialog();
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  alert = ui_test_utils::WaitForAppModalDialog();
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   is_before_unload_dialog());
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  alert->native_dialog()->AcceptAppModalDialog();
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that get_process_idle_time() returns reasonable values when compared
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with time deltas measured locally.
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::TimeTicks start = base::TimeTicks::Now();
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(),
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                FilePath(kTitle1File)));
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  RenderProcessHost::iterator it(RenderProcessHost::AllHostsIterator());
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; !it.IsAtEnd(); it.Advance()) {
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeDelta renderer_td =
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        it.GetCurrentValue()->get_child_process_idle_time();
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    base::TimeDelta browser_td = base::TimeTicks::Now() - start;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(browser_td >= renderer_td);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test IDC_CREATE_SHORTCUTS command is enabled for url scheme file, ftp, http
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// and https and disabled for chrome://, about:// etc.
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(pinkerton): Disable app-mode in the model until we implement it
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// on the Mac. http://crbug.com/13148
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_MACOSX)
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kEmptyFile = FILE_PATH_LITERAL("empty.html");
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(kEmptyFile)));
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), file_url);
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
3453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL http_url(test_server()->GetURL(""));
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), http_url);
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_HTTPS, FilePath(kDocRoot));
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
3563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL https_url(test_server.GetURL("/"));
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(https_url.SchemeIs(chrome::kHttpsScheme));
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), https_url);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  net::TestServer test_server(net::TestServer::TYPE_FTP, FilePath(kDocRoot));
3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server.Start());
3673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL ftp_url(test_server.GetURL(""));
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(ftp_url.SchemeIs(chrome::kFtpScheme));
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), ftp_url);
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutInvalid) {
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CommandUpdater* command_updater = browser()->command_updater();
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Urls that should not have shortcuts.
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL new_tab_url(chrome::kChromeUINewTabURL);
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), new_tab_url);
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL history_url(chrome::kChromeUIHistoryURL);
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), history_url);
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL downloads_url(chrome::kChromeUIDownloadsURL);
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), downloads_url);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL blank_url(chrome::kAboutBlankURL);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), blank_url);
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
393201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
394201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Change a tab into an application window.
39572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// DISABLED: http://crbug.com/72310
39672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_ConvertTabToAppShortcut) {
397201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(test_server()->Start());
398201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GURL http_url(test_server()->GetURL(""));
399201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
400201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
401201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, browser()->tab_count());
402201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* initial_tab = browser()->GetTabContentsAt(0);
403201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* app_tab = browser()->AddSelectedTabWithURL(
404201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      http_url, PageTransition::TYPED)->tab_contents();
405201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2, browser()->tab_count());
406201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1u, BrowserList::GetBrowserCount(browser()->profile()));
407201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
408201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Normal tabs should accept load drops.
409201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
410201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
411201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
412201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Turn |app_tab| into a tab in an app panel.
413201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  browser()->ConvertContentsToApplication(app_tab);
414201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
415201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The launch should have created a new browser.
416201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
417201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
418201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the new browser.
419201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* app_browser = NULL;
420201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
421201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       i != BrowserList::end() && !app_browser; ++i) {
422201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (*i != browser())
423201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      app_browser = *i;
424201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
425201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(app_browser);
426201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
427201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Check that the tab contents is in the new browser, and not in the old.
428201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, browser()->tab_count());
429201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(initial_tab, browser()->GetTabContentsAt(0));
430201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
431201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Check that the appliaction browser has a single tab, and that tab contains
432201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the content that we app-ified.
433201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(1, app_browser->tab_count());
434201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(app_tab, app_browser->GetTabContentsAt(0));
435201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
436201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Normal tabs should accept load drops.
437201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
438201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The tab in an app window should not.
440201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_FALSE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
441201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
442201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_MACOSX)
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test RenderView correctly send back favicon url for web page that redirects
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to an anchor in javascript body.onload handler.
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, FaviconOfOnloadRedirectToAnchorPage) {
4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("files/onload_redirect_to_anchor.html"));
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL expected_favicon_url(test_server()->GetURL("files/test.png"));
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationEntry* entry = browser()->GetSelectedTabContents()->
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller().GetActiveEntry();
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test that an icon can be changed from JS.
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, FaviconChange) {
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kFile =
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FILE_PATH_LITERAL("onload_change_favicon.html");
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          FilePath(kFile)));
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), file_url);
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationEntry* entry = browser()->GetSelectedTabContents()->
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      controller().GetActiveEntry();
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const FilePath::CharType* kIcon =
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FILE_PATH_LITERAL("test1.png");
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL expected_favicon_url(
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         FilePath(kIcon)));
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure TabClosing is sent when uninstalling an extension that is an app
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// tab.
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, TabClosingWhenRemovingExtension) {
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
4833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("empty.html"));
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* model = browser()->tabstrip_model();
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_app = GetExtension();
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
492201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContentsWrapper* app_contents =
493201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      Browser::TabContentsFactory(browser()->profile(), NULL,
494201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  MSG_ROUTING_NONE, NULL, NULL);
495ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  app_contents->extension_tab_helper()->SetExtensionApp(extension_app);
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(0, true);
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockTabStripModelObserver observer;
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddObserver(&observer);
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Uninstall the extension and make sure TabClosing is sent.
50521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ExtensionService* service = browser()->profile()->GetExtensionService();
506ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  service->UninstallExtension(GetExtension()->id(), false, NULL);
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, observer.closing_count());
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->RemoveObserver(&observer);
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // There should only be one tab now.
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(1, browser()->tab_count());
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if !defined(OS_MACOSX)
51672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Open with --app-id=<id>, and see that an app window opens.
51772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) {
51872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(test_server()->Start());
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Load an app.
52172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  host_resolver()->AddRule("www.example.com", "127.0.0.1");
52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const Extension* extension_app = GetExtension();
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  CommandLine command_line(CommandLine::NO_PROGRAM);
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BrowserInit::LaunchWithProfile launch(FilePath(), command_line);
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(launch.OpenApplicationWindow(browser()->profile()));
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Check that the new browser has an app name.
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The launch should have created a new browser.
53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Find the new browser.
53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  Browser* new_browser = NULL;
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  for (BrowserList::const_iterator i = BrowserList::begin();
53872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen       i != BrowserList::end() && !new_browser; ++i) {
53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (*i != browser())
54072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new_browser = *i;
54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(new_browser);
54372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(new_browser != browser());
54472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
54572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The browser's app_name should include the app's ID.
54672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_NE(
54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      new_browser->app_name_.find(extension_app->id()),
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      std::string::npos) << new_browser->app_name_;
54972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
55072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
55172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif
55272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN)
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://crbug.com/46198. On XP/Vista, the failure rate is 5 ~ 6%.
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_PageLanguageDetection FLAKY_PageLanguageDetection
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_PageLanguageDetection PageLanguageDetection
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that the CLD (Compact Language Detection) works properly.
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_PageLanguageDetection) {
5613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabContents* current_tab = browser()->GetSelectedTabContents();
564ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* wrapper = browser()->GetSelectedTabContentsWrapper();
565ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TranslateTabHelper* helper = wrapper->translate_tab_helper();
56621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Source<TabContents> source(current_tab);
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate to a page in English.
56921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      en_language_detected_signal(NotificationType::TAB_LANGUAGE_DETERMINED,
57121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  source);
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(
5733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      browser(), GURL(test_server()->GetURL("files/english_page.html")));
574ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(helper->language_state().original_language().empty());
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  en_language_detected_signal.Wait();
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string lang;
57721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
57821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        source.map_key(), &lang));
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("en", lang);
580ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ("en", helper->language_state().original_language());
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now navigate to a page in French.
58321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  ui_test_utils::WindowedNotificationObserverWithDetails<std::string>
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      fr_language_detected_signal(NotificationType::TAB_LANGUAGE_DETERMINED,
58521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  source);
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(
5873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      browser(), GURL(test_server()->GetURL("files/french_page.html")));
588ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_TRUE(helper->language_state().original_language().empty());
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  fr_language_detected_signal.Wait();
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  lang.clear();
59121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
59221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen        source.map_key(), &lang));
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("fr", lang);
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_EQ("fr", helper->language_state().original_language());
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Chromeos defaults to restoring the last session, so this test isn't
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// applicable.
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_CHROMEOS)
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Crashy, http://crbug.com/38522
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define RestorePinnedTabs DISABLED_RestorePinnedTabs
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure pinned tabs are restored correctly on start.
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
6063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add an pinned app tab.
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
6103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url(test_server()->GetURL("empty.html"));
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* model = browser()->tabstrip_model();
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
613513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const Extension* extension_app = GetExtension();
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
615201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContentsWrapper* app_contents =
616201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    Browser::TabContentsFactory(browser()->profile(), NULL,
617201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                MSG_ROUTING_NONE, NULL, NULL);
618ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  app_contents->extension_tab_helper()->SetExtensionApp(extension_app);
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->AddTabContents(app_contents, 0, 0, TabStripModel::ADD_NONE);
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(0, true);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a non pinned tab.
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add a pinned non-app tab.
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), GURL("about:blank"));
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model->SetTabPinned(2, true);
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Write out the pinned tabs.
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PinnedTabCodec::WritePinnedTabs(browser()->profile());
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate launching again.
635731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  CommandLine dummy(CommandLine::NO_PROGRAM);
6363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  BrowserInit::LaunchWithProfile launch(FilePath(), dummy);
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  launch.profile_ = browser()->profile();
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  launch.ProcessStartupURLs(std::vector<GURL>());
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The launch should have created a new browser.
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find the new browser.
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* new_browser = NULL;
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       i != BrowserList::end() && !new_browser; ++i) {
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (*i != browser())
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_browser = *i;
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_browser);
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(new_browser != browser());
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
653dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // We should get back an additional tab for the app, and another for the
654dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // default home page.
655dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_EQ(3, new_browser->tab_count());
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the state matches.
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TabStripModel* new_model = new_browser->tabstrip_model();
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsAppTab(0));
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(new_model->IsAppTab(1));
661dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(new_model->IsAppTab(2));
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsTabPinned(0));
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_model->IsTabPinned(1));
665dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_FALSE(new_model->IsTabPinned(2));
666dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
667dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(browser()->GetHomePage(),
668dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      new_model->GetTabContentsAt(2)->tab_contents()->GetURL());
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
670201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_TRUE(
671ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      new_model->GetTabContentsAt(0)->extension_tab_helper()->extension_app() ==
672201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch          extension_app);
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !defined(OS_CHROMEOS)
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
676731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// This test verifies we don't crash when closing the last window and the app
677731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// menu is showing.
678513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, CloseWithAppMenuOpen) {
679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  if (browser_defaults::kBrowserAliveWithNoWindows)
680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return;
681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // We need a message loop running for menus on windows.
683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  MessageLoop::current()->PostTask(FROM_HERE,
684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                   new RunCloseWithAppMenuTask(browser()));
685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
687201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#if !defined(OS_MACOSX)
688201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
689201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(test_server()->Start());
690201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
691201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Load an app
692201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
693201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
694201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const Extension* extension_app = GetExtension();
695201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
696201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
697201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  TabContents* app_window = Browser::OpenApplication(
698201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      browser()->profile(), extension_app, extension_misc::LAUNCH_WINDOW, NULL);
699201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(app_window);
700201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
701201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Apps launched in a window from the NTP do not have extension_app set in
702201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // tab contents.
703ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* wrapper =
704ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          TabContentsWrapper::GetCurrentWrapperForContents(app_window);
705ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EXPECT_FALSE(wrapper->extension_tab_helper()->extension_app());
706201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(extension_app->GetFullLaunchURL(), app_window->GetURL());
707201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
708201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // The launch should have created a new browser.
709201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_EQ(2u, BrowserList::GetBrowserCount(browser()->profile()));
710201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
711201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the new browser.
712201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  Browser* new_browser = NULL;
713201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  for (BrowserList::const_iterator i = BrowserList::begin();
714201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch       i != BrowserList::end() && !new_browser; ++i) {
715201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    if (*i != browser())
716201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      new_browser = *i;
717201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
718201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(new_browser);
719201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ASSERT_TRUE(new_browser != browser());
720201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
721201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  EXPECT_EQ(Browser::TYPE_APP, new_browser->type());
72272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
72372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The browser's app name should include the extension's id.
72472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string app_name = new_browser->app_name_;
72572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_NE(app_name.find(extension_app->id()), std::string::npos)
72672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      << "Name " << app_name << " should contain id "<< extension_app->id();
727201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}
728201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#endif  // !defined(OS_MACOSX)
729201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(ben): this test was never enabled. It has bit-rotted since being added.
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// It originally lived in browser_unittest.cc, but has been moved here to make
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// room for real browser unit tests.
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if 0
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserTest2 : public InProcessBrowserTest {
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  BrowserTest2() {
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Avoid making external DNS lookups. In this test we don't need this
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // to succeed.
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    host_resolver_proc_->AddSimulatedFailure("*.google.com");
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_;
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  net::ScopedDefaultHostResolverProc scoped_host_resolver_proc_;
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest2, NoTabsInPopups) {
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser::RegisterAppPrefs(L"Test");
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We start with a normal browser with one tab.
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, browser()->tab_count());
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open a popup browser with a single blank foreground tab.
756731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  Browser* popup_browser = browser()->CreateForType(Browser::TYPE_POPUP,
757731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                                    browser()->profile());
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_browser->AddBlankTab(true);
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, popup_browser->tab_count());
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the popup browser.
762731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params1(url, PageTransition::TYPED);
763731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  popup_browser->AddTabWithURL(&params1);
764731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(popup_browser, params1.target);
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, popup_browser->tab_count());
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have two.
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, browser()->tab_count());
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an app frame browser with a single blank foreground tab.
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* app_browser =
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->CreateForApp(L"Test", browser()->profile(), false);
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_browser->AddBlankTab(true);
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_browser->tab_count());
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the app browser.
779731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params2(GURL(chrome::kAboutBlankURL),
780731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              PageTransition::TYPED);
781731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  app_browser->AddTabWithURL(&params2);
782731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(app_browser, params2.target);
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_browser->tab_count());
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have three.
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, browser()->tab_count());
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open an app frame popup browser with a single blank foreground tab.
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* app_popup_browser =
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      browser()->CreateForApp(L"Test", browser()->profile(), false);
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_popup_browser->AddBlankTab(true);
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_popup_browser->tab_count());
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now try opening another tab in the app popup browser.
797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  AddTabWithURLParams params3(GURL(chrome::kAboutBlankURL),
798731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                              PageTransition::TYPED);
799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  app_popup_browser->AddTabWithURL(&params3);
800731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_EQ(app_popup_browser, params3.target);
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The popup should still only have one tab.
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, app_popup_browser->tab_count());
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The normal browser should now have four.
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4, browser()->tab_count());
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the additional browsers.
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  popup_browser->CloseAllTabs();
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_browser->CloseAllTabs();
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  app_popup_browser->CloseAllTabs();
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
814