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(¶ms1); 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(¶ms2); 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(¶ms3); 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