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"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/translate/translate_tab_helper.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_ui_prefs.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_codec.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/translate/language_detection_details.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
55558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "chrome/test/base/test_switches.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/resource_context.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
77b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/run_loop_testing.h"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::HostZoomMap;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsObserver;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kBeforeUnloadHTML =
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<html><head><title>beforeunload</title></head><body>"
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</body></html>";
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kOpenNewBeforeUnloadPage =
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "w=window.open(); w.onbeforeunload=function(e){return 'foo'};";
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kBeforeUnloadFile =
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("beforeunload.html");
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle2File = FILE_PATH_LITERAL("title2.html");
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data");
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a page title, returns the expected window caption string.
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 WindowCaptionFromPageTitle(const string16& page_title) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac or ChromeOS, we don't want to suffix the page title with
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the application name.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED);
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_title;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    page_title);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the number of active RenderProcessHosts.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CountRenderProcessHosts() {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (content::RenderProcessHost::iterator i(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::RenderProcessHost::AllHostsIterator());
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       !i.IsAtEnd(); i.Advance())
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++result;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTabStripModelObserver : public TabStripModelObserver {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver() : closing_count_(0) {}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabClosingAt(TabStripModel* tab_strip_model,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WebContents* contents,
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            int index) OVERRIDE {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++closing_count_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count() const { return closing_count_; }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count_;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTabStripModelObserver);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InterstitialObserver : public content::WebContentsObserver {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialObserver(content::WebContents* web_contents,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& attach_callback,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& detach_callback)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(web_contents),
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        attach_callback_(attach_callback),
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        detach_callback_(detach_callback) {
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidAttachInterstitialPage() OVERRIDE {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    attach_callback_.Run();
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidDetachInterstitialPage() OVERRIDE {
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detach_callback_.Run();
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure attach_callback_;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure detach_callback_;
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Causes the browser to swap processes on a redirect to an HTTPS URL.
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TransferHttpsRedirectsContentBrowserClient
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public chrome::ChromeContentBrowserClient {
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ShouldSwapProcessesForRedirect(
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::ResourceContext* resource_context,
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& current_url,
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& new_url) OVERRIDE {
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return new_url.SchemeIs(chrome::kHttpsScheme);
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Invokes CloseWindow on the supplied browser.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseWindowCallback(Browser* browser) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Posts a CloseWindowCallback and shows the app
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu.
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunCloseWithAppMenuCallback(Browser* browser) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowAppMenu is modal under views. Schedule a task that closes the window.
211b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&CloseWindowCallback, browser));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowAppMenu(browser);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Displays "INTERSTITIAL" while the interstitial is attached.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (InterstitialPage can be used in a test directly, but there would be no way
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to visually tell if it is showing or not.)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterstitialPage : public content::InterstitialPageDelegate {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterstitialPage(WebContents* tab, bool new_navigation, const GURL& url) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab, new_navigation, url , this);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestInterstitialPage() { }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Proceed() {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Proceed();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<h1>INTERSTITIAL</h1>";
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest : public ExtensionBrowserTest {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In RTL locales wrap the page title with RTL embedding characters so that it
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches the value returned by GetWindowTitle().
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 LocaleWindowCaptionFromPageTitle(const string16& expected_title) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 page_title = WindowCaptionFromPageTitle(expected_title);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string locale = g_browser_process->GetApplicationLocale();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::i18n::GetTextDirectionForLocale(locale.c_str()) ==
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::i18n::RIGHT_TO_LEFT) {
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::WrapStringWithLTRFormatting(&page_title);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do we need to use the above code on POSIX as well?
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the app extension aptly named "App Test".
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* GetExtension() {
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ExtensionSet* extensions = extensions::ExtensionSystem::Get(
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->extension_service()->extensions();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ExtensionSet::const_iterator it = extensions->begin();
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != extensions->end(); ++it) {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*it)->name() == "App Test")
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return it->get();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app on a page with no title, check that the app title was set
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoTitle) {
278558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(ASCIIToUTF16("title1.html")),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 tab_title;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("title1.html"), tab_title);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app, navigate to a page with a title, check that the app title
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// was set correctly.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, Title) {
298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
300a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
301558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
302558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle2File)));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 test_title(ASCIIToUTF16("Title Of Awesomeness"));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(test_title),
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 tab_title;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_title, tab_title);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) {
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* second_tab = browser()->tab_strip_model()->GetWebContentsAt(1);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(second_tab);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  second_tab->GetRenderViewHost()->ExecuteJavascriptInWebFrame(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16(),
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("alert('Activate!');"));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114859. Times out frequently on Windows.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs DISABLED_ThirtyFourTabs
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs ThirtyFourTabs
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create 34 tabs and verify that a lot of processes have been created. The
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exact number of processes depends on the amount of memory. Previously we
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// had a hard limit of 31 processes and this test is mainly directed at
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// verifying that we don't crash when we pass this limit.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Warning: this test can take >30 seconds when running on a slow (low
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory?) Mac builder.
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_ThirtyFourTabs) {
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle2File)));
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is one initial tab.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTabCount = 34;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int ix = 0; ix != (kTabCount - 1); ++ix) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), url,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  content::PAGE_TRANSITION_TYPED);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kTabCount, browser()->tab_strip_model()->count());
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See GetMaxRendererProcessCount() in
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content/browser/renderer_host/render_process_host_impl.cc
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the algorithm to decide how many processes to create.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kExpectedProcessCount =
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ARCH_CPU_64_BITS)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      17;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      25;
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::SysInfo::AmountOfPhysicalMemoryMB() >= 2048) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(CountRenderProcessHosts(), kExpectedProcessCount);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(CountRenderProcessHosts(), kExpectedProcessCount);
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/22004.  Reloading a page with a before unload handler and
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then canceling the dialog should not leave the throbber spinning.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page, but click cancel in the dialog.  Make sure that
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the throbber stops spinning.
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("onbeforeunload=null;"));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Ensure that a transferred cross-process navigation does not generate
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// DidStopLoading events until the navigation commits.  If it did, then
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// ui_test_utils::NavigateToURL would proceed before the URL had committed.
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/243957.
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoStopDuringTransferUntilCommit) {
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::FilePath(kDocRoot));
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::ContentBrowserClient* old_client =
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetBrowserClientForTesting(&new_client);
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL init_url(test_server()->GetURL("files/title1.html"));
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), init_url);
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Navigate to a same-site page that redirects, causing a transfer.
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL dest_url(https_test_server.GetURL("files/title2.html"));
419868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL redirect_url(test_server()->GetURL("server-redirect?" +
420868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      dest_url.spec()));
421868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), redirect_url);
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
423868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We should immediately see the new committed entry.
424868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(contents->GetController().GetPendingEntry());
426868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(dest_url,
427868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            contents->GetController().GetLastCommittedEntry()->GetURL());
428868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Restore previous browser client.
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetBrowserClientForTesting(old_client);
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
432868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that a cross-process redirect will only cause the beforeunload
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler to run once.
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, SingleBeforeUnloadAfterRedirect) {
436868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
444868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
445868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::ContentBrowserClient* old_client =
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetBrowserClientForTesting(&new_client);
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a page with a beforeunload handler.
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url(test_server()->GetURL("files/beforeunload.html"));
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a URL that redirects to another process and approve the
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // beforeunload dialog that pops up.
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL("files/title1.html"));
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL redirect_url(test_server()->GetURL("server-redirect?" +
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_url.spec()));
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser()->OpenURL(OpenURLParams(redirect_url, Referrer(), CURRENT_TAB,
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   content::PAGE_TRANSITION_TYPED, false));
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  nav_observer.Wait();
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Restore previous browser client.
470c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBrowserClientForTesting(old_client);
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
472c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/80401.  Canceling a before unload dialog should reset
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the URL to the previous page's URL.
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) {
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kBeforeUnloadFile)));
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page that triggers a cross-site transition.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(test_server()->GetURL("files/title1.html"));
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver host_destroyed_observer(
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the dialog.
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify there are no pending history items after the dialog is cancelled.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (see crbug.com/93858)
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetPendingEntry();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, entry);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the ShouldClose_ACK to arrive.  We can detect it by waiting for
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pending RVH to be destroyed.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_destroyed_observer.Wait();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, browser()->toolbar_model()->GetURL());
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("onbeforeunload=null;"));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Crashy on mac.  http://crbug.com/38522  Crashy on win too (after 3 years).
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SingleBeforeUnloadAfterWindowClose \
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DISABLED_SingleBeforeUnloadAfterWindowClose
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SingleBeforeUnloadAfterWindowClose \
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SingleBeforeUnloadAfterWindowClose
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/11647.  A page closed with window.close() should not have
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// two beforeunload dialogs shown.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_SingleBeforeUnloadAfterWindowClose) {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16(kOpenNewBeforeUnloadPage));
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the new window with JavaScript, which should show a single
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // beforeunload dialog.  Then show another alert, to make it easy to verify
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that a second beforeunload dialog isn't shown.
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetWebContentsAt(0)->GetRenderViewHost()->
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("w.close(); alert('bar');"));
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   is_before_unload_dialog());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserTest.BeforeUnloadVsBeforeReload times out on Windows.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/130411
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload DISABLED_BeforeUnloadVsBeforeReload
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload BeforeUnloadVsBeforeReload
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when a page has an onunload handler, reloading a page shows a
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different dialog than navigating to a different page.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_BeforeUnloadVsBeforeReload) {
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the page, and check that we get a "before reload" dialog.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the reload.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->CancelAppModalDialog();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another url, and check that we get a "before unload" dialog.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(std::string("about:blank"));
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept the navigation so we end up on a page without a beforeunload hook.
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BeforeUnloadAtQuitWithTwoWindows is a regression test for
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/11842. It opens two windows, one of which has a
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// beforeunload handler and attempts to exit cleanly.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BeforeUnloadAtQuitWithTwoWindows : public InProcessBrowserTest {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is for testing a specific shutdown behavior. This mimics what
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens in InProcessBrowserTest::RunTestOnMainThread and QuitBrowsers, but
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensures that it happens through the single IDC_EXIT of the test.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cycle both the MessageLoop and the Cocoa runloop twice to flush out any
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Chrome work that generates Cocoa work. Do this twice since there are two
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browsers that must be closed.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the application event loop to completion, which will cycle the
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // native MessagePump on all platforms.
595b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
596b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
597b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->Run();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Take care of any remaining Cocoa work.
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At this point, quit should be for real now.
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(0u, chrome::GetTotalBrowserCount());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper function that cycles the MessageLoop, and on Mac, the Cocoa run
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop. It also drains the NSAutoreleasePool.
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CycleRunLoops() {
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::testing::NSRunLoopRunAllPending();
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutoreleasePool()->Recycle();
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, http://crbug.com/159214 .
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BeforeUnloadAtQuitWithTwoWindows,
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_IfThisTestTimesOutItIndicatesFAILURE) {
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the first browser, set up a page that has a beforeunload handler.
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a second browser window at about:blank.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(browser()->profile(), chrome::GetActiveDesktop());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* second_window = browser_added_observer.WaitForSingleNewBrowser();
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(second_window, GURL("about:blank"));
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the application to quit. IDC_EXIT calls AttemptUserExit, which on
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // everything but ChromeOS allows unload handlers to block exit. On that
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform, though, it exits unconditionally. See the comment and bug ID
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in AttemptUserExit() in application_lifetime.cc.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AttemptExit();
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ExecuteCommand(second_window, IDC_EXIT);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The beforeunload handler will run at exit, ensure it does, and then accept
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it to allow shutdown to proceed.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(alert);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But wait there's more! If this test times out, it likely means that the
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser has not been able to quit correctly, indicating there's a
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regression of the bug noted above.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that scripts can fork a new renderer process for a cross-site popup,
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The script must open a new tab, set its window.opener to null, and navigate
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it to a cross-site URL.  It should also work for meta-refreshes.
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/93517.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NullOpenerRedirectForksProcess) {
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
664c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
665c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_popup = "w=window.open();";
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.opener=null;";
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.document.location=\"";
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += https_url.spec();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "\";";
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(redirect_popup));
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should not be in the opener's process.
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process);
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and use a
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // meta-refresh to navigate it instead.
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string refresh_popup = "w=window.open();";
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.opener=null;";
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.document.write(";
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "'<META HTTP-EQUIV=\"refresh\" content=\"0; url=";
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += https_url.spec();
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "\">');w.document.close();";
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer2(
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(refresh_popup));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer2.Wait();
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, browser()->tab_strip_model()->count());
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab2 = browser()->tab_strip_model()->GetActiveWebContents();
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab2);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab2);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab2->GetController().GetLastCommittedEntry());
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab2->GetController().GetLastCommittedEntry()->GetURL().spec());
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This popup window should also not be in the opener's process.
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process2 =
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab2->GetRenderProcessHost();
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process2);
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that other popup navigations that do not follow the steps at
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab will not
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fork a new renderer process.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OtherRedirectsDontForkProcess) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string dont_fork_popup = "w=window.open();";
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "w.document.location=\"";
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += https_url.spec();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "\";";
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(dont_fork_popup));
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should still be in the opener's process.
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, popup_process);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same thing if the current tab tries to navigate itself.
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string navigate_str = "document.location=\"";
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += https_url.spec();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += "\";";
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_COMMITTED,
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(navigate_str));
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(oldtab->GetController().GetLastCommittedEntry());
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            oldtab->GetController().GetLastCommittedEntry()->GetURL().spec());
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Original window should still be in the original process.
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* new_process = newtab->GetRenderProcessHost();
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, new_process);
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that get_process_idle_time() returns reasonable values when compared
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with time deltas measured locally.
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks start = base::TimeTicks::Now();
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost::iterator it(
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderProcessHost::AllHostsIterator());
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; !it.IsAtEnd(); it.Advance()) {
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta renderer_td =
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it.GetCurrentValue()->GetChildProcessIdleTime();
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta browser_td = base::TimeTicks::Now() - start;
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(browser_td >= renderer_td);
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test IDC_CREATE_SHORTCUTS command is enabled for url scheme file, ftp, http
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and https and disabled for chrome://, about:// etc.
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(pinkerton): Disable app-mode in the model until we implement it
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the Mac. http://crbug.com/13148
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kEmptyFile =
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FILE_PATH_LITERAL("empty.html");
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kEmptyFile)));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
858c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
868c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url(test_server.GetURL("/"));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_url.SchemeIs(chrome::kHttpsScheme));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_url);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFtp) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_FTP,
883c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
884c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
886c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL ftp_url(test_server.GetURL(std::string()));
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ftp_url.SchemeIs(chrome::kFtpScheme));
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), ftp_url);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutInvalid) {
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Urls that should not have shortcuts.
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_tab_url(chrome::kChromeUINewTabURL);
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), new_tab_url);
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL history_url(chrome::kChromeUIHistoryURL);
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), history_url);
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL downloads_url(chrome::kChromeUIDownloadsURL);
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), downloads_url);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
90990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL blank_url(content::kAboutBlankURL);
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change a tab into an application window.
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/72310
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_ConvertTabToAppShortcut) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* initial_tab = browser()->tab_strip_model()->GetWebContentsAt(0);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* app_tab = chrome::AddSelectedTabWithURL(
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), http_url, content::PAGE_TRANSITION_TYPED);
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn |app_tab| into a tab in an app panel.
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ConvertTabToAppWindow(browser(), app_tab);
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = NULL;
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !app_browser; it.Next()) {
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      app_browser = *it;
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser);
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the tab contents is in the new browser, and not in the old.
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(initial_tab, browser()->tab_strip_model()->GetWebContentsAt(0));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the appliaction browser has a single tab, and that tab contains
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the content that we app-ified.
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, app_browser->tab_strip_model()->count());
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(app_tab, app_browser->tab_strip_model()->GetWebContentsAt(0));
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab in an app window should not.
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test RenderView correctly send back favicon url for web page that redirects
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an anchor in javascript body.onload handler.
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_FaviconOfOnloadRedirectToAnchorPage) {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("files/onload_redirect_to_anchor.html"));
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_favicon_url(test_server()->GetURL("files/test.png"));
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetActiveEntry();
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_LINUX) || defined (OS_WIN)
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/83828. On Mac 10.6, the failure rate is 14%
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange DISABLED_FaviconChange
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange FaviconChange
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an icon can be changed from JS.
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_FaviconChange) {
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kFile =
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("onload_change_favicon.html");
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kFile)));
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetActiveEntry();
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kIcon =
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("test1.png");
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL expected_favicon_url(ui_test_utils::GetTestUrl(base::FilePath(
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kIcon)));
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/172336
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension \
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_TabClosingWhenRemovingExtension
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension TabClosingWhenRemovingExtension
10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure TabClosing is sent when uninstalling an extension that is an app
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab.
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_TabClosingWhenRemovingExtension) {
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model->AddWebContents(app_contents, 0, content::PageTransitionFromInt(0),
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver observer;
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->AddObserver(&observer);
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the extension and make sure TabClosing is sent.
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->UninstallExtension(GetExtension()->id(), false, NULL);
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.closing_count());
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->RemoveObserver(&observer);
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should only be one tab now.
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open with --app-id=<id>, and see that an app window opens.
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) {
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app.
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.OpenApplicationWindow(browser()->profile(), NULL));
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the new browser has an app name.
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should include the app's ID.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the CLD (Compact Language Detection) works properly.
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, PageLanguageDetection) {
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  //std::string lang;
109790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LanguageDetectionDetails details;
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab with a page in English.
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, GURL(test_server()->GetURL("files/english_page.html")),
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                content::PAGE_TRANSITION_TYPED);
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_web_contents =
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TranslateTabHelper* translate_tab_helper =
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TranslateTabHelper::FromWebContents(current_web_contents);
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::Source<WebContents> source(current_web_contents);
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
111090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LanguageDetectionDetails>
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      en_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", translate_tab_helper->language_state().original_language());
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  en_language_detected_signal.Wait();
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("en", details.adopted_language);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("en", translate_tab_helper->language_state().original_language());
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a page in French.
112190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
112290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LanguageDetectionDetails>
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), GURL(test_server()->GetURL("files/french_page.html")));
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fr_language_detected_signal.Wait();
112890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details.adopted_language.clear();
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
113090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
113190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("fr", details.adopted_language);
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("fr", translate_tab_helper->language_state().original_language());
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromeos defaults to restoring the last session, so this test isn't
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// applicable.
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy, http://crbug.com/38522
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RestorePinnedTabs DISABLED_RestorePinnedTabs
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure pinned tabs are restored correctly on start.
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an pinned app tab.
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model->AddWebContents(app_contents, 0, content::PageTransitionFromInt(0),
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a non pinned tab.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a pinned non-app tab.
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
116990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(2, true);
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write out the pinned tabs.
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PinnedTabCodec::WritePinnedTabs(browser()->profile());
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate launching again.
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch.profile_ = browser()->profile();
118190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  launch.ProcessStartupURLs(std::vector<GURL>(),
118290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            browser()->host_desktop_type());
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should get back an additional tab for the app, and another for the
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default home page.
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, new_browser->tab_strip_model()->count());
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the state matches.
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* new_model = new_browser->tab_strip_model();
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsAppTab(0));
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(1));
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(2));
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(0));
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(1));
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsTabPinned(2));
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new_model->GetWebContentsAt(2)->GetURL());
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new_model->GetWebContentsAt(0))->extension_app() == extension_app);
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies we don't crash when closing the last window and the app
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu is showing.
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CloseWithAppMenuOpen DISABLED_CloseWithAppMenuOpen
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CloseWithAppMenuOpen CloseWithAppMenuOpen
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_CloseWithAppMenuOpen) {
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_defaults::kBrowserAliveWithNoWindows)
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need a message loop running for menus on windows.
1233b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&RunCloseWithAppMenuCallback, browser()));
12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_window = chrome::OpenApplication(
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::AppLaunchParams(browser()->profile(), extension_app,
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              extension_misc::LAUNCH_WINDOW, NEW_WINDOW));
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_window);
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Apps launched in a window from the NTP have an extensions tab helper but
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do not have extension_app set in it.
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extensions::TabHelper::FromWebContents(app_window));
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(app_window)->extension_app());
1257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(extensions::AppLaunchInfo::GetFullLaunchURL(extension_app),
1258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            app_window->GetURL());
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_app());
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app name should include the extension's id.
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_name = new_browser->app_name_;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(app_name.find(extension_app->id()), std::string::npos)
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Name " << app_name << " should contain id "<< extension_app->id();
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MAXIMIZED) has been invoked.
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, StartMaximized) {
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MAXIMIZED;
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura doesn't support minimized window. crbug.com/104571.
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized DISABLED_StartMinimized
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized StartMinimized
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MINIMIZED) has been invoked.
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_StartMinimized) {
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MINIMIZED;
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the forward button is disabled immediately when navigating
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forward to a slow-to-commit page.
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ForwardDisabledOnForward) {
131590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL blank_url(content::kAboutBlankURL);
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver back_nav_load_observer(
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_nav_load_observer.Wait();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_FORWARD));
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver forward_nav_load_observer(
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoForward(browser(), CURRENT_TAB);
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This check will happen before the navigation completes, since the browser
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // won't process the renderer's response until the Wait() call below.
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_FORWARD));
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_nav_load_observer.Wait();
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure certain commands are disabled when Incognito mode is forced.
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At the beginning, all commands are enabled.
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmarks & Settings commands should get disabled.
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New Incognito Window command, however, should be enabled.
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
1372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new Browser(Browser::CreateParams(
1373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->profile()->GetOffTheRecordProfile(),
1374868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->host_desktop_type()));
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should have Bookmarks & Settings commands disabled by default.
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure New Incognito Window command is disabled when Incognito mode is
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not available.
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NoNewIncognitoWindowWhenIncognitoIsDisabled) {
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure New Incognito Window command is disabled. All remaining commands
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be enabled.
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Browser(Browser::CreateParams(browser()->profile(),
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableExtensionsAndSettingsWhenIncognitoIsDisabled) {
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable extensions. This should disable Extensions menu.
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionSystem::Get(browser()->profile())->extension_service()->
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_extensions_enabled(false);
14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure Manage Extensions command is disabled.
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup (non-main-UI-type) browser. Settings command as well
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as Extensions should be disabled.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* popup_command_updater =
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_OPTIONS));
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(popup_command_updater->IsCommandEnabled(
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableOptionsAndImportMenuItemsConsistently) {
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup browser.
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled for a non-normal UI.
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled when Incognito is forced.
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to AVAILABLE.
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::ENABLED);
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are still disabled since it is a non-normal UI.
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
14812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnZoomLevelChanged(const base::Closure& callback,
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const HostZoomMap::ZoomLevelChange& host) {
14842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run();
14852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flakes regularly on Windows XP
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/146040
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom DISABLED_PageZoom
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom PageZoom
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_PageZoom) {
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_plus, enable_minus;
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_IN);
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 110);
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 100);
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
15392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_OUT);
15402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
15432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 90);
15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCommandDisable) {
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestInterstitialPage* interstitial = NULL;
15672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial = new TestInterstitialPage(contents, false, GURL());
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_PRINT));
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure(),
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial->Proceed();
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCloseTab) {
16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
16112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Interstitial will delete itself when we close the tab.
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new TestInterstitialPage(contents, false, GURL());
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
16212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
16222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
16232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
16242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
16252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure(),
16262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
16272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseTab(browser());
16282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
16292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
16302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebContentsObserver : public WebContentsObserver {
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockWebContentsObserver(WebContents* web_contents)
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WebContentsObserver(web_contents),
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        got_user_gesture_(false) {
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidGetUserGesture() OVERRIDE {
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = true;
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture() const {
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return got_user_gesture_;
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_got_user_gesture(bool got_it) {
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = got_it;
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture_;
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockWebContentsObserver);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, UserGesturesReported) {
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Regression test for http://crbug.com/110707.  Also tests that a user
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gesture is sent when a normal navigation (via e.g. the omnibox) is
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // performed.
16622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
16632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWebContentsObserver mock_observer(web_contents);
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_observer.set_got_user_gesture(false);
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ben): this test was never enabled. It has bit-rotted since being added.
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It originally lived in browser_unittest.cc, but has been moved here to make
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// room for real browser unit tests.
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest2 : public InProcessBrowserTest {
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserTest2() {
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid making external DNS lookups. In this test we don't need this
16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to succeed.
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_->AddSimulatedFailure("*.google.com");
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_;
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ScopedDefaultHostResolverProc scoped_host_resolver_proc_;
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest2, NoTabsInPopups) {
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::RegisterAppPrefs(L"Test");
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We start with a normal browser with one tab.
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a popup browser with a single blank foreground tab.
17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(popup_browser, -1, true);
17062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the popup browser.
17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabWithURLParams params1(url, content::PAGE_TRANSITION_TYPED);
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_browser->AddTabWithURL(&params1);
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(popup_browser, params1.target);
17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have two.
17172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame browser with a single blank foreground tab.
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = new Browser(Browser::CreateParams::CreateForApp(
17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(app_browser, -1, true);
17232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app browser.
172690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTabWithURLParams params2(GURL(content::kAboutBlankURL),
17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              content::PAGE_TRANSITION_TYPED);
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_browser->AddTabWithURL(&params2);
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_browser, params2.target);
17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have three.
17352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame popup browser with a single blank foreground tab.
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_popup_browser = new Browser(Browser::CreateParams::CreateForApp(
17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(app_popup_browser, -1, true);
17412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app popup browser.
174490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTabWithURLParams params3(GURL(content::kAboutBlankURL),
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              content::PAGE_TRANSITION_TYPED);
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_popup_browser->AddTabWithURL(&params3);
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_popup_browser, params3.target);
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have four.
17532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, browser()->tab_strip_model()->count());
17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the additional browsers.
17562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_browser->tab_strip_model()->CloseAllTabs();
17572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_browser->tab_strip_model()->CloseAllTabs();
17582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_popup_browser->tab_strip_model()->CloseAllTabs();
17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1762a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, WindowOpenClose) {
1763a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
1764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      switches::kDisablePopupBlocking);
17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), base::FilePath().AppendASCII("window.close.html"));
17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title = ASCIIToUTF16("Title Of Awesomeness");
17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), title);
17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2);
17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GTK doesn't use the Browser's fullscreen state.
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Mac disabled: http://crbug.com/169820
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(TOOLKIT_GTK) && !defined(OS_MACOSX) && \
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, FullscreenBookmarkBar) {
1781558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1782558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
1783a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1784558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
1785558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
1786558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
17872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleBookmarkBar(browser());
17882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleFullscreenMode(browser());
17902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsFullscreen());
17912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
17922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS)
1794b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // TODO(jamescook): If immersive fullscreen is disabled by default, test
1795b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // for BookmarkBar::HIDDEN.
1796b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
17992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
18002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
18012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShowModalDialogTest : public BrowserTest {
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowModalDialogTest() {}
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisablePopupBlocking);
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ShowModalDialogTest, BasicTest) {
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This navigation should show a modal dialog that will be immediately
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closed, but the fact that it was shown should be recorded.
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
18162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), base::FilePath().AppendASCII("showmodaldialog.html"));
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 expected_title(ASCIIToUTF16("SUCCESS"));
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that we set a mark on successful dialog show.
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisallowFileUrlUniversalAccessTest) {
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
18302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath().AppendASCII("fileurl_universalaccess.html"));
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 expected_title(ASCIIToUTF16("Disallowed"));
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
18342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("Allowed"));
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KioskModeTest : public BrowserTest {
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KioskModeTest() {}
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKioskMode);
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103912
18512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest DISABLED_EnableKioskModeTest
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest EnableKioskModeTest
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(KioskModeTest, MAYBE_EnableKioskModeTest) {
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if browser is in fullscreen mode.
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser()->window()->IsFullscreen());
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(browser()->window()->IsFullscreenBubbleVisible());
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that Chrome can be launched with a user-data-dir path
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which contains non ASCII characters.
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LaunchBrowserWithNonAsciiUserDatadir : public BrowserTest {
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LaunchBrowserWithNonAsciiUserDatadir() {}
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
18712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath tmp_profile = temp_dir_.path().AppendASCII("tmp_profile");
18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_profile = tmp_profile.Append(L"Test Chrome G\u00E9raldine");
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(tmp_profile));
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchPath(switches::kUserDataDir, tmp_profile);
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchBrowserWithNonAsciiUserDatadir,
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestNonAsciiUserDataDir) {
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the window is present.
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser());
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunInBackgroundTest : public BrowserTest {
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunInBackgroundTest() {}
18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RunInBackgroundTest, RunInBackgroundBasicTest) {
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser window, then open a new one - the browser should keep
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // running.
19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = browser()->profile();
19032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSER_CLOSED,
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Browser>(browser()));
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser());
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
19092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
1912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(profile, chrome::GetActiveDesktop());
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
19205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoStartupWindowTest : public BrowserTest {
19215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NoStartupWindowTest() {}
19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoStartupWindow);
19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, NoStartupWindowBasicTest) {
1931558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1932558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // kNoStartupWindow doesn't make sense in Metro+Ash.
1933558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1934558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
1935558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
1936558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No browser window should be started by default.
19382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting a browser window should work just fine.
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateBrowser(ProfileManager::GetDefaultProfile());
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
19445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chromeos needs to track app windows because it considers them to be part of
19492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// session state.
19502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, DontInitSessionServiceForApps) {
1952558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1953558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // kNoStartupWindow doesn't make sense in Metro+Ash.
1954558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1955558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    return;
1956558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#endif
1957558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
19582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile = ProfileManager::GetDefaultProfile();
19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionService* session_service =
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SessionServiceFactory::GetForProfile(profile);
19622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
19632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBrowserForApp("blah", profile);
19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
19672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test needs to be placed outside the anonymous namespace because we
19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to access private type of Browser.
19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModeTest : public BrowserTest {
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModeTest() {}
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = ui_test_utils::GetTestUrl(
19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       base::FilePath(), base::FilePath().AppendASCII("title1.html"));
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kApp, url.spec());
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AppModeTest, EnableAppModeTest) {
1986ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#if defined(OS_WIN) && defined(USE_ASH)
1987ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disable this test in Metro+Ash for now (http://crbug.com/262796).
1988a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kAshBrowserTests))
1989ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    return;
1990ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#endif
1991ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that an application browser window loads correctly.
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the browser is in application mode.
19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->is_app());
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm about:version contains some expected content.
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AboutVersion) {
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutVersionURL));
20012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("WebKit"), true, true,
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("OS"), true, true,
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("JavaScript"), true,
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      true, NULL, NULL),
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const base::FilePath::CharType* kTestDir =
20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("click_modifier");
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kFirstPageTitle[] = "First window";
20165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSecondPageTitle[] = "New window!";
20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClickModifierTest : public InProcessBrowserTest {
20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClickModifierTest() {
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that opens a new window or tab when clicked, via javascript.
20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetWindowOpenURL() {
20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
20262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
20272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("window_open.html")));
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that follows a simple link when clicked, unless affected by
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifiers.
20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetHrefURL() {
20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
20352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("href.html")));
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 getFirstPageTitle() {
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kFirstPageTitle);
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 getSecondPageTitle() {
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kSecondPageTitle);
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads our test page and simulates a single click using the supplied button
20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and modifiers.  The click will cause either a navigation or the creation of
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new window or foreground or background tab.  We verify that the expected
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition occurs.
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(Browser* browser,
20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const GURL& url,
20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int modifiers,
20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WebKit::WebMouseEvent::Button button,
20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WindowOpenDisposition disposition) {
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser, url);
20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
20582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, browser->tab_strip_model()->count());
20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents =
20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url, web_contents->GetURL());
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == CURRENT_TAB) {
20642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* web_contents =
20652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetActiveWebContents();
2066868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::TestNavigationObserver same_tab_observer(web_contents);
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateMouseClick(web_contents, modifiers, button);
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::RunLoop run_loop;
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      same_tab_observer.WaitForObservation(
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&content::RunThisRunLoop, base::Unretained(&run_loop)),
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::GetQuitTaskForRunLoop(&run_loop));
20722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
20742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1, browser->tab_strip_model()->count());
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_TAB_ADDED,
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SimulateMouseClick(web_contents, modifiers, button);
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_WINDOW) {
20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile(),
20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
20932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, browser->tab_strip_model()->count());
20942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = browser->tab_strip_model()->GetActiveWebContents();
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForLoadStop(web_contents);
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_FOREGROUND_TAB) {
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(NEW_BACKGROUND_TAB, disposition);
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getFirstPageTitle(), web_contents->GetTitle());
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClickModifierTest);
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on elements with handlers that run window.open.
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenBasicClickTest) {
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on window.open is platform-dependent and not
21185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well defined.  Should we add tests so we know if it changes?
21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftClickTest) {
21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlClickTest) {
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlShiftClickTest) {
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modifiers |= WebKit::WebInputEvent::ShiftKey;
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
21562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
21572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
21582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest DISABLED_WindowOpenMiddleClickTest
21592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
21602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest WindowOpenMiddleClickTest
21612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
21622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, MAYBE_WindowOpenMiddleClickTest) {
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftMiddleClickTest) {
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on normal links.
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefBasicClickTest) {
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = CURRENT_TAB;
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on links is platform-dependent and not well
21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined.  Should we add tests so we know if it changes?
21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftClickTest) {
21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefControlClickTest) {
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefControlShiftClickTest) {
22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modifiers |= WebKit::WebInputEvent::ShiftKey;
22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
22252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
22262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
22272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_HrefMiddleClickTest DISABLED_HrefMiddleClickTest
22282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
22292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_HrefMiddleClickTest HrefMiddleClickTest
22302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
22312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, MAYBE_HrefMiddleClickTest) {
22325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftMiddleClickTest) {
22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245