15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
8558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "base/command_line.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/devtools/devtools_window_testing.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/search/search.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/translate/chrome_translate_client.h"
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/translate/cld_data_harness.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog_queue.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_ui_prefs.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_codec.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/common/pref_names.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
61558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/test/base/test_switches.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/translate/core/browser/language_state.h"
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/translate/core/common/language_detection_details.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/render_frame_host.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/resource_context.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/common/frame_navigate_params.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h"
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension_set.h"
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/base/page_transition_types.h"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h"
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/run_loop_testing.h"
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::HostZoomMap;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsObserver;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kBeforeUnloadHTML =
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<html><head><title>beforeunload</title></head><body>"
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</body></html>";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kOpenNewBeforeUnloadPage =
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "w=window.open(); w.onbeforeunload=function(e){return 'foo'};";
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kBeforeUnloadFile =
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("beforeunload.html");
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle2File = FILE_PATH_LITERAL("title2.html");
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data");
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a page title, returns the expected window caption string.
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 WindowCaptionFromPageTitle(const base::string16& page_title) {
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac or ChromeOS, we don't want to suffix the page title with
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the application name.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_title;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    page_title);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the number of active RenderProcessHosts.
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CountRenderProcessHosts() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (content::RenderProcessHost::iterator i(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::RenderProcessHost::AllHostsIterator());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       !i.IsAtEnd(); i.Advance())
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++result;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTabStripModelObserver : public TabStripModelObserver {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver() : closing_count_(0) {}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabClosingAt(TabStripModel* tab_strip_model,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WebContents* contents,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            int index) OVERRIDE {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++closing_count_;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count() const { return closing_count_; }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count_;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTabStripModelObserver);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InterstitialObserver : public content::WebContentsObserver {
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialObserver(content::WebContents* web_contents,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& attach_callback,
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& detach_callback)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(web_contents),
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        attach_callback_(attach_callback),
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        detach_callback_(detach_callback) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidAttachInterstitialPage() OVERRIDE {
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    attach_callback_.Run();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidDetachInterstitialPage() OVERRIDE {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detach_callback_.Run();
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure attach_callback_;
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure detach_callback_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
203868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Causes the browser to swap processes on a redirect to an HTTPS URL.
204868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TransferHttpsRedirectsContentBrowserClient
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public chrome::ChromeContentBrowserClient {
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ShouldSwapProcessesForRedirect(
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::ResourceContext* resource_context,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& current_url,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& new_url) OVERRIDE {
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return new_url.SchemeIs(url::kHttpsScheme);
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Invokes CloseWindow on the supplied browser.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseWindowCallback(Browser* browser) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Posts a CloseWindowCallback and shows the app
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunCloseWithAppMenuCallback(Browser* browser) {
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowAppMenu is modal under views. Schedule a task that closes the window.
224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&CloseWindowCallback, browser));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowAppMenu(browser);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Displays "INTERSTITIAL" while the interstitial is attached.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (InterstitialPage can be used in a test directly, but there would be no way
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to visually tell if it is showing or not.)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterstitialPage : public content::InterstitialPageDelegate {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterstitialPage(WebContents* tab, bool new_navigation, const GURL& url) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab, new_navigation, url , this);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestInterstitialPage() { }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Proceed() {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Proceed();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DontProceed() {
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    interstitial_page_->DontProceed();
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<h1>INTERSTITIAL</h1>";
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class RenderViewSizeObserver : public content::WebContentsObserver {
256424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) public:
257424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderViewSizeObserver(content::WebContents* web_contents,
258424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                         BrowserWindow* browser_window)
259424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      : WebContentsObserver(web_contents),
260424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        browser_window_(browser_window) {
261424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
262424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
263424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void GetSizeForRenderViewHost(
264424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      content::RenderViewHost* render_view_host,
265424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      gfx::Size* rwhv_create_size,
266424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      gfx::Size* rwhv_commit_size,
267424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      gfx::Size* wcv_commit_size) {
268424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    RenderViewSizes::const_iterator result = render_view_sizes_.end();
269424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    result = render_view_sizes_.find(render_view_host);
270424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (result != render_view_sizes_.end()) {
271424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      *rwhv_create_size = result->second.rwhv_create_size;
272424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      *rwhv_commit_size = result->second.rwhv_commit_size;
273424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      *wcv_commit_size = result->second.wcv_commit_size;
274424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    }
275424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
276424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
277424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  void set_wcv_resize_insets(const gfx::Size& wcv_resize_insets) {
278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    wcv_resize_insets_ = wcv_resize_insets;
279424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
280424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
281424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Cache the size when RenderViewHost is first created.
282424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void RenderViewCreated(
283424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      content::RenderViewHost* render_view_host) OVERRIDE {
284424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    render_view_sizes_[render_view_host].rwhv_create_size =
285424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        render_view_host->GetView()->GetViewBounds().size();
286424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
287424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
288424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Enlarge WebContentsView by |wcv_resize_insets_| while the navigation entry
289424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // is pending.
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void DidStartNavigationToPendingEntry(
291424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      const GURL& url,
292424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      NavigationController::ReloadType reload_type) OVERRIDE {
293424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    if (wcv_resize_insets_.IsEmpty())
294424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      return;
295424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Resizing the main browser window by |wcv_resize_insets_| will
296424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // automatically resize the WebContentsView by the same amount.
297424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Just resizing WebContentsView directly doesn't work on Linux, because the
298424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // next automatic layout of the browser window will resize WebContentsView
299424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // back to the previous size.  To make it consistent, resize main browser
300424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // window on all platforms.
301424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    gfx::Rect bounds(browser_window_->GetBounds());
302424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    gfx::Size size(bounds.size());
303424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    size.Enlarge(wcv_resize_insets_.width(), wcv_resize_insets_.height());
304424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    bounds.set_size(size);
305424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    browser_window_->SetBounds(bounds);
306424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // Let the message loop run so that resize actually takes effect.
307424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
308424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
309424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
310424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Cache the sizes of RenderWidgetHostView and WebContentsView when the
311424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // navigation entry is committed, which is before
312424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // WebContentsDelegate::DidNavigateMainFramePostCommit is called.
313424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  virtual void NavigationEntryCommitted(
314424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      const content::LoadCommittedDetails& details) OVERRIDE {
315424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    content::RenderViewHost* rvh = web_contents()->GetRenderViewHost();
316424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    render_view_sizes_[rvh].rwhv_commit_size =
317424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)        web_contents()->GetRenderWidgetHostView()->GetViewBounds().size();
318424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    render_view_sizes_[rvh].wcv_commit_size =
319010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        web_contents()->GetContainerBounds().size();
320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
321424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
322424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) private:
323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  struct Sizes {
324424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    gfx::Size rwhv_create_size;  // Size of RenderWidgetHostView when created.
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    gfx::Size rwhv_commit_size;  // Size of RenderWidgetHostView when committed.
326424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    gfx::Size wcv_commit_size;   // Size of WebContentsView when committed.
327424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  };
328424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
329424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  typedef std::map<content::RenderViewHost*, Sizes> RenderViewSizes;
330424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderViewSizes render_view_sizes_;
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Enlarge WebContentsView by this size insets in
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // DidStartNavigationToPendingEntry.
333424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size wcv_resize_insets_;
334424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  BrowserWindow* browser_window_;  // Weak ptr.
335424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
336424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderViewSizeObserver);
337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)};
338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest : public ExtensionBrowserTest {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In RTL locales wrap the page title with RTL embedding characters so that it
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches the value returned by GetWindowTitle().
345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 LocaleWindowCaptionFromPageTitle(
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const base::string16& expected_title) {
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 page_title = WindowCaptionFromPageTitle(expected_title);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string locale = g_browser_process->GetApplicationLocale();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::i18n::GetTextDirectionForLocale(locale.c_str()) ==
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::i18n::RIGHT_TO_LEFT) {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::WrapStringWithLTRFormatting(&page_title);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do we need to use the above code on POSIX as well?
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the app extension aptly named "App Test".
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* GetExtension() {
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const extensions::ExtensionSet* extensions =
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extensions::ExtensionSystem::Get(
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            browser()->profile())->extension_service()->extensions();
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (extensions::ExtensionSet::const_iterator it = extensions->begin();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != extensions->end(); ++it) {
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*it)->name() == "App Test")
3707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return it->get();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app on a page with no title, check that the app title was set
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoTitle) {
380558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
381558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
382a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
383558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
384558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
385558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(ASCIIToUTF16("title1.html")),
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 tab_title;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("title1.html"), tab_title);
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app, navigate to a page with a title, check that the app title
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// was set correctly.
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, Title) {
400558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
401558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
402a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
403558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
404558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
405558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle2File)));
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const base::string16 test_title(ASCIIToUTF16("Title Of Awesomeness"));
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(test_title),
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 tab_title;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_title, tab_title);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) {
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddTabAtIndex(0, url, ui::PAGE_TRANSITION_TYPED);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* second_tab = browser()->tab_strip_model()->GetWebContentsAt(1);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(second_tab);
427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  second_tab->GetMainFrame()->ExecuteJavaScript(
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("alert('Activate!');"));
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114859. Times out frequently on Windows.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs DISABLED_ThirtyFourTabs
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs ThirtyFourTabs
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create 34 tabs and verify that a lot of processes have been created. The
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exact number of processes depends on the amount of memory. Previously we
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// had a hard limit of 31 processes and this test is mainly directed at
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// verifying that we don't crash when we pass this limit.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Warning: this test can take >30 seconds when running on a slow (low
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory?) Mac builder.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_ThirtyFourTabs) {
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle2File)));
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is one initial tab.
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTabCount = 34;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int ix = 0; ix != (kTabCount - 1); ++ix) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), url,
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ui::PAGE_TRANSITION_TYPED);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kTabCount, browser()->tab_strip_model()->count());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See GetMaxRendererProcessCount() in
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content/browser/renderer_host/render_process_host_impl.cc
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the algorithm to decide how many processes to create.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kExpectedProcessCount =
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ARCH_CPU_64_BITS)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      17;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      25;
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::SysInfo::AmountOfPhysicalMemoryMB() >= 2048) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(CountRenderProcessHosts(), kExpectedProcessCount);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(CountRenderProcessHosts(), kExpectedProcessCount);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Test that a browser-initiated navigation to an aborted URL load leaves around
4780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// a pending entry if we start from the NTP but not from a normal page.
4790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// See http://crbug.com/355537.
4800529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, ClearPendingOnFailUnlessNTP) {
4810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(test_server()->Start());
4820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  WebContents* web_contents =
4830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      browser()->tab_strip_model()->GetActiveWebContents();
4840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL ntp_url(chrome::GetNewTabPageURL(browser()->profile()));
4850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ui_test_utils::NavigateToURL(browser(), ntp_url);
4860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
4870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Navigate to a 204 URL (aborts with no content) on the NTP and make sure it
4880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // sticks around so that the user can edit it.
4890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL abort_url(test_server()->GetURL("nocontent"));
4900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
4910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    content::WindowedNotificationObserver stop_observer(
4920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        content::NOTIFICATION_LOAD_STOP,
4930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        content::Source<NavigationController>(
4940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            &web_contents->GetController()));
4950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    browser()->OpenURL(OpenURLParams(abort_url, Referrer(), CURRENT_TAB,
4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ui::PAGE_TRANSITION_TYPED, false));
4970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    stop_observer.Wait();
4980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_TRUE(web_contents->GetController().GetPendingEntry());
4990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(abort_url, web_contents->GetVisibleURL());
5000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Navigate to a real URL.
5030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  GURL real_url(test_server()->GetURL("title1.html"));
5040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ui_test_utils::NavigateToURL(browser(), real_url);
5050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(real_url, web_contents->GetVisibleURL());
5060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Now navigating to a 204 URL should clear the pending entry.
5080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  {
5090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    content::WindowedNotificationObserver stop_observer(
5100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        content::NOTIFICATION_LOAD_STOP,
5110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        content::Source<NavigationController>(
5120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            &web_contents->GetController()));
5130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    browser()->OpenURL(OpenURLParams(abort_url, Referrer(), CURRENT_TAB,
5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     ui::PAGE_TRANSITION_TYPED, false));
5150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    stop_observer.Wait();
5160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_FALSE(web_contents->GetController().GetPendingEntry());
5170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    EXPECT_EQ(real_url, web_contents->GetVisibleURL());
5180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
5190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
5200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Test for crbug.com/297289.  Ensure that modal dialogs are closed when a
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// cross-process navigation is ready to commit.
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CrossProcessNavCancelsDialogs) {
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
5254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
5264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Test this with multiple alert dialogs to ensure that we can navigate away
530f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // even if the renderer tries to synchronously create more.
531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // See http://crbug.com/312490.
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  contents->GetMainFrame()->ExecuteJavaScript(
534f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASCIIToUTF16("alert('one'); alert('two');"));
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(alert->IsValid());
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_TRUE(dialog_queue->HasActiveDialog());
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // A cross-site navigation should force the dialog to close.
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GURL url2("http://www.example.com/empty.html");
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url2);
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(dialog_queue->HasActiveDialog());
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Make sure input events still work in the renderer process.
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents());
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
549a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Make sure that dialogs are closed after a renderer process dies, and that
550a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// subsequent navigations work.  See http://crbug/com/343265.
551a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsDialogs) {
552a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
553a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
554a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL beforeunload_url(test_server()->GetURL("files/beforeunload.html"));
555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), beforeunload_url);
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Start a navigation to trigger the beforeunload dialog.
558a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
559a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  contents->GetMainFrame()->ExecuteJavaScript(
560a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ASCIIToUTF16("window.location.href = 'data:text/html,foo'"));
561a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(alert->IsValid());
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
564a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_TRUE(dialog_queue->HasActiveDialog());
565a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
566a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Crash the renderer process and ensure the dialog is gone.
567a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::RenderProcessHost* child_process = contents->GetRenderProcessHost();
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  content::RenderProcessHostWatcher crash_observer(
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      child_process,
570a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
571a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::KillProcess(child_process->GetHandle(), 0, false);
572a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  crash_observer.Wait();
573a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_FALSE(dialog_queue->HasActiveDialog());
574a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Make sure subsequent navigations work.
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  GURL url2("http://www.example.com/files/empty.html");
577a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url2);
578a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
579a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Make sure that dialogs opened by subframes are closed when the process dies.
5815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// See http://crbug.com/366510.
5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIN_PROC_BROWSER_TEST_F(BrowserTest, SadTabCancelsSubframeDialogs) {
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Navigate to an iframe that opens an alert dialog.
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  contents->GetMainFrame()->ExecuteJavaScript(
5865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      ASCIIToUTF16("window.location.href = 'data:text/html,"
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                   "<iframe srcdoc=\"<script>alert(1)</script>\">'"));
5885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(alert->IsValid());
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
5915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(dialog_queue->HasActiveDialog());
5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Crash the renderer process and ensure the dialog is gone.
5945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::RenderProcessHost* child_process = contents->GetRenderProcessHost();
5955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  content::RenderProcessHostWatcher crash_observer(
5965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      child_process,
5975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
5985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  base::KillProcess(child_process->GetHandle(), 0, false);
5995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  crash_observer.Wait();
6005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(dialog_queue->HasActiveDialog());
6015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Make sure subsequent navigations work.
6035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GURL url2("data:text/html,foo");
6045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui_test_utils::NavigateToURL(browser(), url2);
6055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
6065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/22004.  Reloading a page with a before unload handler and
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then canceling the dialog should not leave the throbber spinning.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page, but click cancel in the dialog.  Make sure that
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the throbber stops spinning.
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()->
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ExecuteJavaScript(ASCIIToUTF16("onbeforeunload=null;"));
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class RedirectObserver : public content::WebContentsObserver {
6271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
6281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit RedirectObserver(content::WebContents* web_contents)
6291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : WebContentsObserver(web_contents) {
6301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
6311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void DidNavigateAnyFrame(
6331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const content::LoadCommittedDetails& details,
6341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      const content::FrameNavigateParams& params) OVERRIDE {
6351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    params_ = params;
6361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
6371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
638010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE {
6390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // Make sure we don't close the tab while the observer is in scope.
6400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // See http://crbug.com/314036.
6410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    FAIL() << "WebContents closed during navigation (http://crbug.com/314036).";
6420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
6430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const content::FrameNavigateParams& params() const {
6451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return params_;
6461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
6471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
6491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  content::FrameNavigateParams params_;
6501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
6511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RedirectObserver);
6521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)};
6531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Ensure that a transferred cross-process navigation does not generate
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// DidStopLoading events until the navigation commits.  If it did, then
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// ui_test_utils::NavigateToURL would proceed before the URL had committed.
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/243957.
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoStopDuringTransferUntilCommit) {
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::FilePath(kDocRoot));
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
669868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::ContentBrowserClient* old_client =
670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetBrowserClientForTesting(&new_client);
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
672868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL init_url(test_server()->GetURL("files/title1.html"));
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), init_url);
674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
675868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Navigate to a same-site page that redirects, causing a transfer.
6761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
6770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Create a RedirectObserver that goes away before we close the tab.
6790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  {
6800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    RedirectObserver redirect_observer(contents);
6810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GURL dest_url(https_test_server.GetURL("files/title2.html"));
6820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    GURL redirect_url(test_server()->GetURL("server-redirect?" +
6830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        dest_url.spec()));
6840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser(), redirect_url);
6850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // We should immediately see the new committed entry.
6870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_FALSE(contents->GetController().GetPendingEntry());
6880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(dest_url,
6890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              contents->GetController().GetLastCommittedEntry()->GetURL());
6900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
6910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // We should keep track of the original request URL, redirect chain, and
6920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // page transition type during a transfer, since these are necessary for
6930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // history autocomplete to work.
6940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(redirect_url, contents->GetController().GetLastCommittedEntry()->
6950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  GetOriginalRequestURL());
6960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(2U, redirect_observer.params().redirects.size());
6970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(redirect_url, redirect_observer.params().redirects.at(0));
6980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(dest_url, redirect_observer.params().redirects.at(1));
6991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_TRUE(ui::PageTransitionCoreTypeIs(
7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        redirect_observer.params().transition, ui::PAGE_TRANSITION_TYPED));
7010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
7021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
703868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Restore previous browser client.
704868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetBrowserClientForTesting(old_client);
705868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
706868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that a cross-process redirect will only cause the beforeunload
708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler to run once.
709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, SingleBeforeUnloadAfterRedirect) {
710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
711c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
718868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
719868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::ContentBrowserClient* old_client =
721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetBrowserClientForTesting(&new_client);
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a page with a beforeunload handler.
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url(test_server()->GetURL("files/beforeunload.html"));
725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a URL that redirects to another process and approve the
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // beforeunload dialog that pops up.
729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL("files/title1.html"));
733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL redirect_url(test_server()->GetURL("server-redirect?" +
734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_url.spec()));
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser()->OpenURL(OpenURLParams(redirect_url, Referrer(), CURRENT_TAB,
7361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   ui::PAGE_TRANSITION_TYPED, false));
737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  nav_observer.Wait();
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Restore previous browser client.
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBrowserClientForTesting(old_client);
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/80401.  Canceling a before unload dialog should reset
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the URL to the previous page's URL.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) {
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kBeforeUnloadFile)));
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page that triggers a cross-site transition.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(test_server()->GetURL("files/title1.html"));
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
7581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      url2, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver host_destroyed_observer(
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the dialog.
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify there are no pending history items after the dialog is cancelled.
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (see crbug.com/93858)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetPendingEntry();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, entry);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the ShouldClose_ACK to arrive.  We can detect it by waiting for
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pending RVH to be destroyed.
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_destroyed_observer.Wait();
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, browser()->toolbar_model()->GetURL());
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
782a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()->
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ExecuteJavaScript(ASCIIToUTF16("onbeforeunload=null;"));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/11647.  A page closed with window.close() should not have
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// two beforeunload dialogs shown.
7881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// http://crbug.com/410891
7891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(BrowserTest,
7901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       DISABLED_SingleBeforeUnloadAfterWindowClose) {
791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetMainFrame()->
7921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteJavaScriptForTests(ASCIIToUTF16(kOpenNewBeforeUnloadPage));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the new window with JavaScript, which should show a single
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // beforeunload dialog.  Then show another alert, to make it easy to verify
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that a second beforeunload dialog isn't shown.
797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser()->tab_strip_model()->GetWebContentsAt(0)->GetMainFrame()->
7981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteJavaScriptForTests(ASCIIToUTF16("w.close(); alert('bar');"));
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   is_before_unload_dialog());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserTest.BeforeUnloadVsBeforeReload times out on Windows.
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/130411
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload DISABLED_BeforeUnloadVsBeforeReload
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload BeforeUnloadVsBeforeReload
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when a page has an onunload handler, reloading a page shows a
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different dialog than navigating to a different page.
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_BeforeUnloadVsBeforeReload) {
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the page, and check that we get a "before reload" dialog.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the reload.
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->CancelAppModalDialog();
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another url, and check that we get a "before unload" dialog.
831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GURL url2(url::kAboutBlankURL);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      url2, Referrer(), CURRENT_TAB, ui::PAGE_TRANSITION_TYPED, false));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept the navigation so we end up on a page without a beforeunload hook.
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BeforeUnloadAtQuitWithTwoWindows is a regression test for
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/11842. It opens two windows, one of which has a
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// beforeunload handler and attempts to exit cleanly.
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BeforeUnloadAtQuitWithTwoWindows : public InProcessBrowserTest {
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is for testing a specific shutdown behavior. This mimics what
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens in InProcessBrowserTest::RunTestOnMainThread and QuitBrowsers, but
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensures that it happens through the single IDC_EXIT of the test.
8505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cycle both the MessageLoop and the Cocoa runloop twice to flush out any
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Chrome work that generates Cocoa work. Do this twice since there are two
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browsers that must be closed.
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the application event loop to completion, which will cycle the
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // native MessagePump on all platforms.
859b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
860b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
861b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->Run();
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Take care of any remaining Cocoa work.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At this point, quit should be for real now.
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(0u, chrome::GetTotalBrowserCount());
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper function that cycles the MessageLoop, and on Mac, the Cocoa run
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop. It also drains the NSAutoreleasePool.
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CycleRunLoops() {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::testing::NSRunLoopRunAllPending();
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutoreleasePool()->Recycle();
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, http://crbug.com/159214 .
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BeforeUnloadAtQuitWithTwoWindows,
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_IfThisTestTimesOutItIndicatesFAILURE) {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the first browser, set up a page that has a beforeunload handler.
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a second browser window at about:blank.
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(browser()->profile(), chrome::GetActiveDesktop());
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* second_window = browser_added_observer.WaitForSingleNewBrowser();
892f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui_test_utils::NavigateToURL(second_window, GURL(url::kAboutBlankURL));
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the application to quit. IDC_EXIT calls AttemptUserExit, which on
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // everything but ChromeOS allows unload handlers to block exit. On that
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform, though, it exits unconditionally. See the comment and bug ID
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in AttemptUserExit() in application_lifetime.cc.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AttemptExit();
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ExecuteCommand(second_window, IDC_EXIT);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The beforeunload handler will run at exit, ensure it does, and then accept
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it to allow shutdown to proceed.
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(alert);
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But wait there's more! If this test times out, it likely means that the
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser has not been able to quit correctly, indicating there's a
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regression of the bug noted above.
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that scripts can fork a new renderer process for a cross-site popup,
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab.
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The script must open a new tab, set its window.opener to null, and navigate
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it to a cross-site URL.  It should also work for meta-refreshes.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/93517.
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NullOpenerRedirectForksProcess) {
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
933c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_popup = "w=window.open();";
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.opener=null;";
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.document.location=\"";
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += https_url.spec();
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "\";";
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  oldtab->GetMainFrame()->
9551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteJavaScriptForTests(ASCIIToUTF16(redirect_popup));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should not be in the opener's process.
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process);
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and use a
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // meta-refresh to navigate it instead.
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string refresh_popup = "w=window.open();";
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.opener=null;";
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.document.write(";
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "'<META HTTP-EQUIV=\"refresh\" content=\"0; url=";
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += https_url.spec();
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "\">');w.document.close();";
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer2(
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
9881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  oldtab->GetMainFrame()->
9891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteJavaScriptForTests(ASCIIToUTF16(refresh_popup));
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer2.Wait();
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, browser()->tab_strip_model()->count());
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab2 = browser()->tab_strip_model()->GetActiveWebContents();
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab2);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab2);
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab2->GetController().GetLastCommittedEntry());
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab2->GetController().GetLastCommittedEntry()->GetURL().spec());
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This popup window should also not be in the opener's process.
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process2 =
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab2->GetRenderProcessHost();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process2);
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that other popup navigations that do not follow the steps at
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab will not
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fork a new renderer process.
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OtherRedirectsDontForkProcess) {
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1017c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
1019c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
1022c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string dont_fork_popup = "w=window.open();";
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "w.document.location=\"";
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += https_url.spec();
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "\";";
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
10421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  oldtab->GetMainFrame()->
10431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ExecuteJavaScriptForTests(ASCIIToUTF16(dont_fork_popup));
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should still be in the opener's process.
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, popup_process);
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same thing if the current tab tries to navigate itself.
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string navigate_str = "document.location=\"";
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += https_url.spec();
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += "\";";
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_COMMITTED,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
10691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  oldtab->GetMainFrame()->ExecuteJavaScriptForTests(ASCIIToUTF16(navigate_str));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(oldtab->GetController().GetLastCommittedEntry());
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            oldtab->GetController().GetLastCommittedEntry()->GetURL().spec());
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Original window should still be in the original process.
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* new_process = newtab->GetRenderProcessHost();
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, new_process);
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that get_process_idle_time() returns reasonable values when compared
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with time deltas measured locally.
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks start = base::TimeTicks::Now();
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost::iterator it(
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderProcessHost::AllHostsIterator());
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; !it.IsAtEnd(); it.Advance()) {
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta renderer_td =
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it.GetCurrentValue()->GetChildProcessIdleTime();
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta browser_td = base::TimeTicks::Now() - start;
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(browser_td >= renderer_td);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test IDC_CREATE_SHORTCUTS command is enabled for url scheme file, ftp, http
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and https and disabled for chrome://, about:// etc.
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(pinkerton): Disable app-mode in the model until we implement it
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the Mac. http://crbug.com/13148
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kEmptyFile =
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FILE_PATH_LITERAL("empty.html");
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kEmptyFile)));
1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(url::kFileScheme));
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(url::kHttpScheme));
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
1133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url(test_server.GetURL("/"));
1136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(https_url.SchemeIs(url::kHttpsScheme));
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_url);
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_FTP,
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL ftp_url(test_server.GetURL(std::string()));
1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(ftp_url.SchemeIs(url::kFtpScheme));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), ftp_url);
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutInvalid) {
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Urls that should not have shortcuts.
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_tab_url(chrome::kChromeUINewTabURL);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), new_tab_url);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL history_url(chrome::kChromeUIHistoryURL);
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), history_url);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL downloads_url(chrome::kChromeUIDownloadsURL);
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), downloads_url);
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GURL blank_url(url::kAboutBlankURL);
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change a tab into an application window.
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/72310
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_ConvertTabToAppShortcut) {
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
1182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(url::kHttpScheme));
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* initial_tab = browser()->tab_strip_model()->GetWebContentsAt(0);
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* app_tab = chrome::AddSelectedTabWithURL(
11871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), http_url, ui::PAGE_TRANSITION_TYPED);
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn |app_tab| into a tab in an app panel.
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ConvertTabToAppWindow(browser(), app_tab);
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = NULL;
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !app_browser; it.Next()) {
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      app_browser = *it;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser);
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the tab contents is in the new browser, and not in the old.
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(initial_tab, browser()->tab_strip_model()->GetWebContentsAt(0));
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the appliaction browser has a single tab, and that tab contains
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the content that we app-ified.
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, app_browser->tab_strip_model()->count());
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(app_tab, app_browser->tab_strip_model()->GetWebContentsAt(0));
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab in an app window should not.
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test RenderView correctly send back favicon url for web page that redirects
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an anchor in javascript body.onload handler.
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_FaviconOfOnloadRedirectToAnchorPage) {
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("files/onload_redirect_to_anchor.html"));
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_favicon_url(test_server()->GetURL("files/test.png"));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
124046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetActiveWebContents()->GetController().GetLastCommittedEntry();
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_LINUX) || defined (OS_WIN)
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/83828. On Mac 10.6, the failure rate is 14%
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange DISABLED_FaviconChange
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange FaviconChange
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an icon can be changed from JS.
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_FaviconChange) {
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kFile =
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("onload_change_favicon.html");
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kFile)));
1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(url::kFileScheme));
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
126046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      GetActiveWebContents()->GetController().GetLastCommittedEntry();
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kIcon =
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("test1.png");
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL expected_favicon_url(ui_test_utils::GetTestUrl(base::FilePath(
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kIcon)));
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/172336
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension \
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_TabClosingWhenRemovingExtension
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension TabClosingWhenRemovingExtension
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure TabClosing is sent when uninstalling an extension that is an app
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab.
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_TabClosingWhenRemovingExtension) {
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model->AddWebContents(app_contents, 0, ui::PageTransitionFromInt(0),
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver observer;
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->AddObserver(&observer);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the extension and make sure TabClosing is sent.
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
1307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service->UninstallExtension(GetExtension()->id(),
13085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              extensions::UNINSTALL_REASON_FOR_TESTING,
13095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              base::Bind(&base::DoNothing),
1310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              NULL);
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.closing_count());
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->RemoveObserver(&observer);
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should only be one tab now.
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open with --app-id=<id>, and see that an app window opens.
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) {
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app.
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.OpenApplicationWindow(browser()->profile(), NULL));
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the new browser has an app name.
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should include the app's ID.
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Open an app window and the dev tools window and ensure that the location
13580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// bar settings are correct.
13590529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochIN_PROC_BROWSER_TEST_F(BrowserTest, ShouldShowLocationBar) {
13600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(test_server()->Start());
13610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Load an app.
13630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  host_resolver()->AddRule("www.example.com", "127.0.0.1");
13640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
13650529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const Extension* extension_app = GetExtension();
13660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
13680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  WebContents* app_window =
13690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      OpenApplication(AppLaunchParams(browser()->profile(),
13700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      extension_app,
13710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      extensions::LAUNCH_CONTAINER_WINDOW,
13720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                      NEW_WINDOW));
13730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(app_window);
13740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DevToolsWindow* devtools_window =
13765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      DevToolsWindowTesting::OpenDevToolsWindowSync(browser(), false);
13770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The launch should have created a new app browser and a dev tools browser.
13790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(3u,
13800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            chrome::GetBrowserCount(browser()->profile(),
13810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                    browser()->host_desktop_type()));
13820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Find the new browsers.
13840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Browser* app_browser = NULL;
13850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  Browser* dev_tools_browser = NULL;
13860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (chrome::BrowserIterator it; !it.done(); it.Next()) {
13870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (*it == browser()) {
13880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      continue;
13890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    } else if ((*it)->app_name() == DevToolsWindow::kDevToolsApp) {
13900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      dev_tools_browser = *it;
13910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    } else {
13920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      app_browser = *it;
13930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
13940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
13950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(dev_tools_browser);
13960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(app_browser);
13970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_TRUE(app_browser != browser());
13980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
13990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(
14000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      dev_tools_browser->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR));
14010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_FALSE(
14020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      app_browser->SupportsWindowFeature(Browser::FEATURE_LOCATIONBAR));
14035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
14045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DevToolsWindowTesting::CloseDevToolsWindowSync(devtools_window);
14050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the CLD (Compact Language Detection) works properly.
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, PageLanguageDetection) {
1410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<test::CldDataHarness> cld_data_harness =
1411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test::CreateCldDataHarness();
1412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_NO_FATAL_FAILURE(cld_data_harness->Init());
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  translate::LanguageDetectionDetails details;
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab with a page in English.
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, GURL(test_server()->GetURL("files/english_page.html")),
14191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                ui::PAGE_TRANSITION_TYPED);
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_web_contents =
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
142346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ChromeTranslateClient* chrome_translate_client =
142446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ChromeTranslateClient::FromWebContents(current_web_contents);
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::Source<WebContents> source(current_web_contents);
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
14285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::LanguageDetectionDetails>
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      en_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
143146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("",
143246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            chrome_translate_client->GetLanguageState().original_language());
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  en_language_detected_signal.Wait();
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
143590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
143690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("en", details.adopted_language);
143746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("en",
143846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            chrome_translate_client->GetLanguageState().original_language());
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a page in French.
144190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
14425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      translate::LanguageDetectionDetails>
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), GURL(test_server()->GetURL("files/french_page.html")));
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fr_language_detected_signal.Wait();
144890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details.adopted_language.clear();
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
145090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
145190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("fr", details.adopted_language);
145246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("fr",
145346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            chrome_translate_client->GetLanguageState().original_language());
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromeos defaults to restoring the last session, so this test isn't
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// applicable.
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy, http://crbug.com/38522
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RestorePinnedTabs DISABLED_RestorePinnedTabs
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure pinned tabs are restored correctly on start.
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an pinned app tab.
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
14801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  model->AddWebContents(app_contents, 0, ui::PageTransitionFromInt(0),
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a non pinned tab.
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a pinned non-app tab.
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
1490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(2, true);
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write out the pinned tabs.
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PinnedTabCodec::WritePinnedTabs(browser()->profile());
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate launching again.
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch.profile_ = browser()->profile();
150290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  launch.ProcessStartupURLs(std::vector<GURL>(),
150390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            browser()->host_desktop_type());
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should get back an additional tab for the app, and another for the
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default home page.
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, new_browser->tab_strip_model()->count());
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the state matches.
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* new_model = new_browser->tab_strip_model();
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsAppTab(0));
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(1));
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(2));
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(0));
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(1));
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsTabPinned(2));
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
1533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            new_model->GetWebContentsAt(2)->GetURL());
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new_model->GetWebContentsAt(0))->extension_app() == extension_app);
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies we don't crash when closing the last window and the app
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu is showing.
1543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CloseWithAppMenuOpen) {
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_defaults::kBrowserAliveWithNoWindows)
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need a message loop running for menus on windows.
1548b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&RunCloseWithAppMenuCallback, browser()));
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
15624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  WebContents* app_window = OpenApplication(
15634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      AppLaunchParams(browser()->profile(), extension_app,
1564a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      extensions::LAUNCH_CONTAINER_WINDOW, NEW_WINDOW));
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_window);
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Apps launched in a window from the NTP have an extensions tab helper but
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do not have extension_app set in it.
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extensions::TabHelper::FromWebContents(app_window));
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(app_window)->extension_app());
1572868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(extensions::AppLaunchInfo::GetFullLaunchURL(extension_app),
1573868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            app_window->GetURL());
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
15822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
15832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_app());
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app name should include the extension's id.
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_name = new_browser->app_name_;
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(app_name.find(extension_app->id()), std::string::npos)
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Name " << app_name << " should contain id "<< extension_app->id();
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MAXIMIZED) has been invoked.
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, StartMaximized) {
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
16032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MAXIMIZED;
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura doesn't support minimized window. crbug.com/104571.
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized DISABLED_StartMinimized
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized StartMinimized
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MINIMIZED) has been invoked.
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_StartMinimized) {
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MINIMIZED;
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the forward button is disabled immediately when navigating
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forward to a slow-to-commit page.
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ForwardDisabledOnForward) {
1630f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  GURL blank_url(url::kAboutBlankURL);
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
16342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
16352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
16362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver back_nav_load_observer(
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
16412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_nav_load_observer.Wait();
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_FORWARD));
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver forward_nav_load_observer(
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
16522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
16532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoForward(browser(), CURRENT_TAB);
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This check will happen before the navigation completes, since the browser
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // won't process the renderer's response until the Wait() call below.
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_FORWARD));
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_nav_load_observer.Wait();
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure certain commands are disabled when Incognito mode is forced.
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At the beginning, all commands are enabled.
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmarks & Settings commands should get disabled.
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New Incognito Window command, however, should be enabled.
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
1687868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new Browser(Browser::CreateParams(
1688868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->profile()->GetOffTheRecordProfile(),
1689868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->host_desktop_type()));
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should have Bookmarks & Settings commands disabled by default.
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure New Incognito Window command is disabled when Incognito mode is
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not available.
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NoNewIncognitoWindowWhenIncognitoIsDisabled) {
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure New Incognito Window command is disabled. All remaining commands
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be enabled.
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Browser(Browser::CreateParams(browser()->profile(),
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableExtensionsAndSettingsWhenIncognitoIsDisabled) {
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable extensions. This should disable Extensions menu.
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionSystem::Get(browser()->profile())->extension_service()->
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_extensions_enabled(false);
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure Manage Extensions command is disabled.
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup (non-main-UI-type) browser. Settings command as well
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as Extensions should be disabled.
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* popup_command_updater =
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_OPTIONS));
17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(popup_command_updater->IsCommandEnabled(
17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableOptionsAndImportMenuItemsConsistently) {
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup browser.
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
17732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
17742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled for a non-normal UI.
17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled when Incognito is forced.
17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to AVAILABLE.
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::ENABLED);
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are still disabled since it is a non-normal UI.
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
17962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnZoomLevelChanged(const base::Closure& callback,
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const HostZoomMap::ZoomLevelChange& host) {
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run();
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
18032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flakes regularly on Windows XP
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/146040
18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom DISABLED_PageZoom
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom PageZoom
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1811116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1812116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
1813116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1814116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint GetZoomPercent(const content::WebContents* contents,
1815116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   bool* enable_plus,
1816116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   bool* enable_minus) {
1817116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int percent = ZoomController::FromWebContents(contents)->GetZoomPercent();
1818116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *enable_plus = percent < contents->GetMaximumZoomPercent();
1819116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  *enable_minus = percent > contents->GetMinimumZoomPercent();
1820116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return percent;
1821116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1822116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1823116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
1824116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_PageZoom) {
18262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_plus, enable_minus;
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
18312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
18322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
18332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
18344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<content::HostZoomMap::Subscription> sub =
18351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::HostZoomMap::GetDefaultForBrowserContext(
18364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            browser()->profile())->AddZoomLevelChangedCallback(callback);
18372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_IN);
18382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
18394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sub.reset();
1840116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(GetZoomPercent(contents, &enable_plus, &enable_minus), 110);
18412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
18422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
18432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
18462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
18472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
18482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
18504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<content::HostZoomMap::Subscription> sub =
18511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::HostZoomMap::GetDefaultForBrowserContext(
18524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            browser()->profile())->AddZoomLevelChangedCallback(callback);
18532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
18542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
18554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sub.reset();
1856116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(GetZoomPercent(contents, &enable_plus, &enable_minus), 100);
18572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
18582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
18592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
18622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
18632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
18642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
18652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
18664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    scoped_ptr<content::HostZoomMap::Subscription> sub =
18671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        content::HostZoomMap::GetDefaultForBrowserContext(
18684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            browser()->profile())->AddZoomLevelChangedCallback(callback);
18692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_OUT);
18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
18714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    sub.reset();
1872116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(GetZoomPercent(contents, &enable_plus, &enable_minus), 90);
18732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
18742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
18752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCommandDisable) {
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestInterstitialPage* interstitial = NULL;
18962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
18972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
18982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
18992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
19012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial = new TestInterstitialPage(contents, false, GURL());
19042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
19052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_PRINT));
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure(),
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial->Proceed();
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Ensure that creating an interstitial page closes any JavaScript dialogs
193368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// that were present on the previous page.  See http://crbug.com/295695.
193468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialClosesDialogs) {
193568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
193668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
193768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
193868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
193968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
194068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
1941a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  contents->GetMainFrame()->ExecuteJavaScript(
194268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      ASCIIToUTF16("alert('Dialog showing!');"));
194368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
194468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(alert->IsValid());
194568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  AppModalDialogQueue* dialog_queue = AppModalDialogQueue::GetInstance();
194668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(dialog_queue->HasActiveDialog());
194768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
194868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TestInterstitialPage* interstitial = NULL;
194968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
195068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
195168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        new content::MessageLoopRunner);
195268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
195368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    InterstitialObserver observer(contents,
195468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  loop_runner->QuitClosure(),
195568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  base::Closure());
195668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    interstitial = new TestInterstitialPage(contents, false, GURL());
195768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    loop_runner->Run();
195868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
195968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
196068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // The interstitial should have closed the dialog.
196168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
196268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(dialog_queue->HasActiveDialog());
196368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
196468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  {
196568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
196668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        new content::MessageLoopRunner);
196768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
196868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    InterstitialObserver observer(contents,
196968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  base::Closure(),
197068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                  loop_runner->QuitClosure());
197168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    interstitial->DontProceed();
197268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    loop_runner->Run();
197368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // interstitial is deleted now.
197468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
197568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
197668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Make sure input events still work in the renderer process.
197768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  EXPECT_FALSE(contents->GetRenderProcessHost()->IgnoreInputEvents());
197868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
197968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
19801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
19811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCloseTab) {
19822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
19852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
19892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
19902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
19912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Interstitial will delete itself when we close the tab.
19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new TestInterstitialPage(contents, false, GURL());
19932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
20022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
20032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure(),
20042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
20052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseTab(browser());
20062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
20072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
20082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebContentsObserver : public WebContentsObserver {
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockWebContentsObserver(WebContents* web_contents)
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WebContentsObserver(web_contents),
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        got_user_gesture_(false) {
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidGetUserGesture() OVERRIDE {
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = true;
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture() const {
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return got_user_gesture_;
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_got_user_gesture(bool got_it) {
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = got_it;
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture_;
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockWebContentsObserver);
20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, UserGesturesReported) {
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Regression test for http://crbug.com/110707.  Also tests that a user
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gesture is sent when a normal navigation (via e.g. the omnibox) is
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // performed.
20402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
20412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWebContentsObserver mock_observer(web_contents);
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_observer.set_got_user_gesture(false);
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ben): this test was never enabled. It has bit-rotted since being added.
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It originally lived in browser_unittest.cc, but has been moved here to make
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// room for real browser unit tests.
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest2 : public InProcessBrowserTest {
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserTest2() {
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid making external DNS lookups. In this test we don't need this
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to succeed.
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_->AddSimulatedFailure("*.google.com");
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_;
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ScopedDefaultHostResolverProc scoped_host_resolver_proc_;
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest2, NoTabsInPopups) {
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::RegisterAppPrefs(L"Test");
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We start with a normal browser with one tab.
20782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a popup browser with a single blank foreground tab.
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
2083f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(popup_browser, GURL(), -1, true);
20842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the popup browser.
20871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  AddTabWithURLParams params1(url, ui::PAGE_TRANSITION_TYPED);
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_browser->AddTabWithURL(&params1);
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(popup_browser, params1.target);
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have two.
20952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame browser with a single blank foreground tab.
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = new Browser(Browser::CreateParams::CreateForApp(
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
2100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(app_browser, GURL(), -1, true);
21012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app browser.
2104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AddTabWithURLParams params2(GURL(url::kAboutBlankURL),
21051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              ui::PAGE_TRANSITION_TYPED);
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_browser->AddTabWithURL(&params2);
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_browser, params2.target);
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
21102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have three.
21132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame popup browser with a single blank foreground tab.
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_popup_browser = new Browser(Browser::CreateParams::CreateForApp(
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
2118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(app_popup_browser, GURL(), -1, true);
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app popup browser.
2122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AddTabWithURLParams params3(GURL(url::kAboutBlankURL),
21231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                              ui::PAGE_TRANSITION_TYPED);
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_popup_browser->AddTabWithURL(&params3);
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_popup_browser, params3.target);
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
21282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have four.
21312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, browser()->tab_strip_model()->count());
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the additional browsers.
21342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_browser->tab_strip_model()->CloseAllTabs();
21352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_browser->tab_strip_model()->CloseAllTabs();
21362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_popup_browser->tab_strip_model()->CloseAllTabs();
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, WindowOpenClose) {
2141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
2142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      switches::kDisablePopupBlocking);
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
21442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), base::FilePath().AppendASCII("window.close.html"));
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 title = ASCIIToUTF16("Title Of Awesomeness");
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
21482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), title);
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2);
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
21542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Mac disabled: http://crbug.com/169820
2155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if !defined(OS_MACOSX) && \
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, FullscreenBookmarkBar) {
2158558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
2159558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
2160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
2161558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
2162558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
2163558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
21642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleBookmarkBar(browser());
21652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
21662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleFullscreenMode(browser());
21672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsFullscreen());
21682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
21692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS)
2171b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // TODO(jamescook): If immersive fullscreen is disabled by default, test
2172b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // for BookmarkBar::HIDDEN.
2173b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
21772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
21782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
21792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisallowFileUrlUniversalAccessTest) {
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
21822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
21832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath().AppendASCII("fileurl_universalaccess.html"));
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 expected_title(ASCIIToUTF16("Disallowed"));
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("Allowed"));
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KioskModeTest : public BrowserTest {
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KioskModeTest() {}
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKioskMode);
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))
2203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Mac: http://crbug.com/103912
2204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Linux: http://crbug.com/163931
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest DISABLED_EnableKioskModeTest
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest EnableKioskModeTest
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(KioskModeTest, MAYBE_EnableKioskModeTest) {
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if browser is in fullscreen mode.
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser()->window()->IsFullscreen());
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(browser()->window()->IsFullscreenBubbleVisible());
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that Chrome can be launched with a user-data-dir path
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which contains non ASCII characters.
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LaunchBrowserWithNonAsciiUserDatadir : public BrowserTest {
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LaunchBrowserWithNonAsciiUserDatadir() {}
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
22242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath tmp_profile = temp_dir_.path().AppendASCII("tmp_profile");
22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_profile = tmp_profile.Append(L"Test Chrome G\u00E9raldine");
22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(tmp_profile));
22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchPath(switches::kUserDataDir, tmp_profile);
22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchBrowserWithNonAsciiUserDatadir,
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestNonAsciiUserDataDir) {
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the window is present.
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser());
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunInBackgroundTest : public BrowserTest {
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunInBackgroundTest() {}
22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RunInBackgroundTest, RunInBackgroundBasicTest) {
22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser window, then open a new one - the browser should keep
22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // running.
22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = browser()->profile();
22562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSER_CLOSED,
22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Browser>(browser()));
22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser());
22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
22622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
2265eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(profile, chrome::GetActiveDesktop());
22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoStartupWindowTest : public BrowserTest {
22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NoStartupWindowTest() {}
22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoStartupWindow);
22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, NoStartupWindowBasicTest) {
2284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
2285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // kNoStartupWindow doesn't make sense in Metro+Ash.
2286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
2287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
2288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
2289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No browser window should be started by default.
22912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting a browser window should work just fine.
22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
22955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CreateBrowser(ProfileManager::GetActiveUserProfile());
22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
22992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
23002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chromeos needs to track app windows because it considers them to be part of
23022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// session state.
23032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
23042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, DontInitSessionServiceForApps) {
2305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
2306558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // kNoStartupWindow doesn't make sense in Metro+Ash.
2307558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
2308558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
2309558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
2310558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
23115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Profile* profile = ProfileManager::GetActiveUserProfile();
23122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionService* session_service =
23142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SessionServiceFactory::GetForProfile(profile);
23152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
23162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
23182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBrowserForApp("blah", profile);
23192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
23202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test needs to be placed outside the anonymous namespace because we
23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to access private type of Browser.
23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModeTest : public BrowserTest {
23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModeTest() {}
23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = ui_test_utils::GetTestUrl(
23332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       base::FilePath(), base::FilePath().AppendASCII("title1.html"));
23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kApp, url.spec());
23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AppModeTest, EnableAppModeTest) {
2339ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
2340ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
2341a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
2342ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
2343ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
2344ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that an application browser window loads correctly.
23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the browser is in application mode.
23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->is_app());
23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Confirm chrome://version contains some expected content.
23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AboutVersion) {
23535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIVersionURL));
23542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("WebKit"), true, true,
23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("OS"), true, true,
23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("JavaScript"), true,
23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      true, NULL, NULL),
23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const base::FilePath::CharType* kTestDir =
23672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("click_modifier");
23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kFirstPageTitle[] = "First window";
23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSecondPageTitle[] = "New window!";
23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClickModifierTest : public InProcessBrowserTest {
23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClickModifierTest() {
23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that opens a new window or tab when clicked, via javascript.
23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetWindowOpenURL() {
23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
23792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
23802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("window_open.html")));
23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that follows a simple link when clicked, unless affected by
23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifiers.
23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetHrefURL() {
23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
23872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
23882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("href.html")));
23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 getFirstPageTitle() {
23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kFirstPageTitle);
23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 getSecondPageTitle() {
23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kSecondPageTitle);
23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads our test page and simulates a single click using the supplied button
24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and modifiers.  The click will cause either a navigation or the creation of
24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new window or foreground or background tab.  We verify that the expected
24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition occurs.
24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(Browser* browser,
24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const GURL& url,
24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int modifiers,
2406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               blink::WebMouseEvent::Button button,
24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WindowOpenDisposition disposition) {
24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser, url);
24092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
24102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
24112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, browser->tab_strip_model()->count());
24122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents =
24132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url, web_contents->GetURL());
24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == CURRENT_TAB) {
24172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* web_contents =
24182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetActiveWebContents();
2419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::TestNavigationObserver same_tab_observer(web_contents);
24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateMouseClick(web_contents, modifiers, button);
24214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      same_tab_observer.Wait();
24222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
24232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
24242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1, browser->tab_strip_model()->count());
24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_TAB_ADDED,
24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SimulateMouseClick(web_contents, modifiers, button);
24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_WINDOW) {
24362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile(),
24372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
24422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
24432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, browser->tab_strip_model()->count());
24442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = browser->tab_strip_model()->GetActiveWebContents();
24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForLoadStop(web_contents);
24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_FOREGROUND_TAB) {
24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(NEW_BACKGROUND_TAB, disposition);
24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getFirstPageTitle(), web_contents->GetTitle());
24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClickModifierTest);
24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on elements with handlers that run window.open.
24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenBasicClickTest) {
24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
2462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on window.open is platform-dependent and not
24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well defined.  Should we add tests so we know if it changes?
24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftClickTest) {
2472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ShiftKey;
2473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlClickTest) {
24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::MetaKey;
24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ControlKey;
24855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlShiftClickTest) {
24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::MetaKey;
24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ControlKey;
24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  modifiers |= blink::WebInputEvent::ShiftKey;
2500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
25065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_LINUX)
25075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396347
25085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest DISABLED_WindowOpenMiddleClickTest
25095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
25105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest WindowOpenMiddleClickTest
25115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
25125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, MAYBE_WindowOpenMiddleClickTest) {
25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
2514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonMiddle;
25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftMiddleClickTest) {
2521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ShiftKey;
2522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonMiddle;
25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on normal links.
25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefBasicClickTest) {
25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
2531f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = CURRENT_TAB;
25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on links is platform-dependent and not well
25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined.  Should we add tests so we know if it changes?
25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftClickTest) {
2541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ShiftKey;
2542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefControlClickTest) {
25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::MetaKey;
25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ControlKey;
25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
25625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396347
25635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, DISABLED_HrefControlShiftClickTest) {
25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
2565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::MetaKey;
25665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ControlKey;
25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  modifiers |= blink::WebInputEvent::ShiftKey;
2570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonLeft;
25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
2576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefMiddleClickTest) {
25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
2578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonMiddle;
25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
25845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// http://crbug.com/396347
25855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, DISABLED_HrefShiftMiddleClickTest) {
2586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int modifiers = blink::WebInputEvent::ShiftKey;
2587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebMouseEvent::Button button = blink::WebMouseEvent::ButtonMiddle;
25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2591424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2592a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, GetSizeForNewRenderView) {
2593a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The instant extended NTP has javascript that does not work with
2594a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // ui_test_utils::NavigateToURL.  The NTP rvh reloads when the browser tries
2595a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // to navigate away from the page, which causes the WebContents to end up in
2596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // an inconsistent state. (is_loaded = true, last_commited_url=ntp,
2597a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // visible_url=title1.html)
2598a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  browser()->profile()->GetPrefs()->SetBoolean(prefs::kWebKitJavascriptEnabled,
2599a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                               false);
2600d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
2601d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Create an HTTPS server for cross-site transition.
2602d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
2603d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
2604d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                           base::FilePath(kDocRoot));
2605d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
2606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
2607424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Start with NTP.
2608424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab"));
2609424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(BookmarkBar::DETACHED, browser()->bookmark_bar_state());
2610424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  WebContents* web_contents =
2611424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
2612424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  content::RenderViewHost* prev_rvh = web_contents->GetRenderViewHost();
2613424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const int height_inset =
2614424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      browser()->window()->GetRenderViewHeightInsetWithDetachedBookmarkBar();
2615424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  const gfx::Size initial_wcv_size =
2616010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      web_contents->GetContainerBounds().size();
2617424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  RenderViewSizeObserver observer(web_contents, browser()->window());
2618424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2619424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Navigate to a non-NTP page, without resizing WebContentsView.
2620d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
2621d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                               test_server()->GetURL("files/title1.html"));
2622424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
2623424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // A new RenderViewHost should be created.
2624424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_NE(prev_rvh, web_contents->GetRenderViewHost());
2625424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  prev_rvh = web_contents->GetRenderViewHost();
2626424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size rwhv_create_size0, rwhv_commit_size0, wcv_commit_size0;
2627424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer.GetSizeForRenderViewHost(web_contents->GetRenderViewHost(),
2628424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_create_size0,
2629424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_commit_size0,
2630424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &wcv_commit_size0);
2631424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The create height of RenderWidgetHostView should include the height inset.
2632424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(gfx::Size(initial_wcv_size.width(),
2633424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      initial_wcv_size.height() + height_inset),
2634424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            rwhv_create_size0);
2635424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // When a navigation entry is committed, the size of RenderWidgetHostView
2636424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // should be the same as when it was first created.
2637424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(rwhv_create_size0, rwhv_commit_size0);
2638424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Sizes of the current RenderWidgetHostView and WebContentsView should not
2639424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // change before and after WebContentsDelegate::DidNavigateMainFramePostCommit
2640424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // (implemented by Browser); we obtain the sizes before PostCommit via
2641424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // WebContentsObserver::NavigationEntryCommitted (implemented by
2642424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // RenderViewSizeObserver).
2643424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(rwhv_commit_size0,
2644424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            web_contents->GetRenderWidgetHostView()->GetViewBounds().size());
2645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// The behavior differs between OSX and views.
2646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// In OSX, the wcv does not change size until after the commit, when the
2647a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// bookmark bar disappears (correct).
2648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// In views, the wcv changes size at commit time.
2649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_MACOSX)
2650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(gfx::Size(wcv_commit_size0.width(),
2651a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                      wcv_commit_size0.height() + height_inset),
2652010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)            web_contents->GetContainerBounds().size());
2653a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
2654010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(wcv_commit_size0, web_contents->GetContainerBounds().size());
2655a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
2656424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2657424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Navigate to another non-NTP page, without resizing WebContentsView.
2658d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
2659d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                               https_test_server.GetURL("files/title2.html"));
2660424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
2661424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // A new RenderVieHost should be created.
2662424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_NE(prev_rvh, web_contents->GetRenderViewHost());
2663424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size rwhv_create_size1, rwhv_commit_size1, wcv_commit_size1;
2664424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer.GetSizeForRenderViewHost(web_contents->GetRenderViewHost(),
2665424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_create_size1,
2666424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_commit_size1,
2667424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &wcv_commit_size1);
2668424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(rwhv_create_size1, rwhv_commit_size1);
2669424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(rwhv_commit_size1,
2670424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            web_contents->GetRenderWidgetHostView()->GetViewBounds().size());
2671010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(wcv_commit_size1, web_contents->GetContainerBounds().size());
2672424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)
2673424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // Navigate from NTP to a non-NTP page, resizing WebContentsView while
2674424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // navigation entry is pending.
2675424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL("chrome://newtab"));
2676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size wcv_resize_insets(1, 1);
2677424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer.set_wcv_resize_insets(wcv_resize_insets);
2678d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(),
2679d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                               test_server()->GetURL("files/title2.html"));
2680424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  ASSERT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
2681424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size rwhv_create_size2, rwhv_commit_size2, wcv_commit_size2;
2682424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  observer.GetSizeForRenderViewHost(web_contents->GetRenderViewHost(),
2683424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_create_size2,
2684424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &rwhv_commit_size2,
2685424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                    &wcv_commit_size2);
2686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2687a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The behavior on OSX and Views is incorrect in this edge case, but they are
2688a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // differently incorrect.
2689a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The behavior should be:
2690a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // initial wcv size: (100,100)  (to choose random numbers)
2691a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // initial rwhv size: (100,140)
2692a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // commit wcv size: (101, 101)
2693a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // commit rwhv size: (101, 141)
2694a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // final wcv size: (101, 141)
2695a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // final rwhv size: (101, 141)
2696a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  //
2697a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // On OSX, the commit rwhv size is (101, 101)
2698a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // On views, the commit wcv size is (101, 141)
2699a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // All other sizes are correct.
2700a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2701424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  // The create height of RenderWidgetHostView should include the height inset.
2702424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(gfx::Size(initial_wcv_size.width(),
2703424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                      initial_wcv_size.height() + height_inset),
2704424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            rwhv_create_size2);
2705424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  gfx::Size exp_commit_size(initial_wcv_size);
2706a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2707a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_MACOSX)
2708a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  exp_commit_size.Enlarge(wcv_resize_insets.width(),
2709a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          wcv_resize_insets.height());
2710a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
2711424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  exp_commit_size.Enlarge(wcv_resize_insets.width(),
2712424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                          wcv_resize_insets.height() + height_inset);
2713a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
2714424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(exp_commit_size, rwhv_commit_size2);
2715424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  EXPECT_EQ(exp_commit_size, wcv_commit_size2);
2716a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Size exp_final_size(initial_wcv_size);
2717a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  exp_final_size.Enlarge(wcv_resize_insets.width(),
2718a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                         wcv_resize_insets.height() + height_inset);
2719a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ(exp_final_size,
2720424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)            web_contents->GetRenderWidgetHostView()->GetViewBounds().size());
2721010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  EXPECT_EQ(exp_final_size, web_contents->GetContainerBounds().size());
2722424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)}
2723