browser_browsertest.cc revision 7dbb3d5cf0c15f500944d211057644d6a2f37371
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"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_info.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/command_updater.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/defaults.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/first_run/first_run.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/prefs/incognito_mode_prefs.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_backend.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/sessions/session_service_factory.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/translate/translate_tab_helper.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/javascript_app_modal_dialog.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_modal_dialogs/native_app_modal_dialog.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_command_controller.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser_iterator.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_navigator.h"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_ui_prefs.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/extensions/application_launch.h"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/pinned_tab_codec.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/extensions/manifest_handlers/app_launch_info.h"
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/common/translate/language_detection_details.h"
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/favicon_status.h"
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/host_zoom_map.h"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/navigation_entry.h"
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/notification_service.h"
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h"
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/browser/resource_context.h"
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/page_transition_types.h"
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/renderer_preferences.h"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/url_constants.h"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h"
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/dns/mock_host_resolver.h"
75b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/test/spawned_test_server/spawned_test_server.h"
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/mac_util.h"
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_nsautorelease_pool.h"
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/cocoa/run_loop_testing.h"
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::InterstitialPage;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::HostZoomMap;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationController;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::NavigationEntry;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::OpenURLParams;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::Referrer;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContentsObserver;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::Extension;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kBeforeUnloadHTML =
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<html><head><title>beforeunload</title></head><body>"
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<script>window.onbeforeunload=function(e){return 'foo'}</script>"
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</body></html>";
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kOpenNewBeforeUnloadPage =
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "w=window.open(); w.onbeforeunload=function(e){return 'foo'};";
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kBeforeUnloadFile =
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FILE_PATH_LITERAL("beforeunload.html");
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle1File = FILE_PATH_LITERAL("title1.html");
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType* kTitle2File = FILE_PATH_LITERAL("title2.html");
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const base::FilePath::CharType kDocRoot[] =
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("chrome/test/data");
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Given a page title, returns the expected window caption string.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 WindowCaptionFromPageTitle(const string16& page_title) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_CHROMEOS)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac or ChromeOS, we don't want to suffix the page title with
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the application name.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_BROWSER_WINDOW_MAC_TAB_UNTITLED);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return page_title;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_title.empty())
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(IDS_BROWSER_WINDOW_TITLE_FORMAT,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    page_title);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the number of active RenderProcessHosts.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CountRenderProcessHosts() {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result = 0;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (content::RenderProcessHost::iterator i(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::RenderProcessHost::AllHostsIterator());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       !i.IsAtEnd(); i.Advance())
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++result;
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockTabStripModelObserver : public TabStripModelObserver {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver() : closing_count_(0) {}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TabClosingAt(TabStripModel* tab_strip_model,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            WebContents* contents,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            int index) OVERRIDE {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++closing_count_;
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count() const { return closing_count_; }
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int closing_count_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockTabStripModelObserver);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class InterstitialObserver : public content::WebContentsObserver {
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InterstitialObserver(content::WebContents* web_contents,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& attach_callback,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       const base::Closure& detach_callback)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(web_contents),
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        attach_callback_(attach_callback),
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        detach_callback_(detach_callback) {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidAttachInterstitialPage() OVERRIDE {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    attach_callback_.Run();
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidDetachInterstitialPage() OVERRIDE {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    detach_callback_.Run();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure attach_callback_;
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure detach_callback_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InterstitialObserver);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
188868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Causes the browser to swap processes on a redirect to an HTTPS URL.
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class TransferHttpsRedirectsContentBrowserClient
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public chrome::ChromeContentBrowserClient {
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ShouldSwapProcessesForRedirect(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::ResourceContext* resource_context,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& current_url,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const GURL& new_url) OVERRIDE {
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    return new_url.SchemeIs(chrome::kHttpsScheme);
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Invokes CloseWindow on the supplied browser.
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CloseWindowCallback(Browser* browser) {
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Used by CloseWithAppMenuOpen. Posts a CloseWindowCallback and shows the app
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RunCloseWithAppMenuCallback(Browser* browser) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ShowAppMenu is modal under views. Schedule a task that closes the window.
209b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&CloseWindowCallback, browser));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowAppMenu(browser);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Displays "INTERSTITIAL" while the interstitial is attached.
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (InterstitialPage can be used in a test directly, but there would be no way
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to visually tell if it is showing or not.)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterstitialPage : public content::InterstitialPageDelegate {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestInterstitialPage(WebContents* tab, bool new_navigation, const GURL& url) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_ = InterstitialPage::Create(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        tab, new_navigation, url , this);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestInterstitialPage() { }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Proceed() {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Proceed();
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<h1>INTERSTITIAL</h1>";
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPage* interstitial_page_;  // Owns us.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest : public ExtensionBrowserTest {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In RTL locales wrap the page title with RTL embedding characters so that it
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // matches the value returned by GetWindowTitle().
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 LocaleWindowCaptionFromPageTitle(const string16& expected_title) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 page_title = WindowCaptionFromPageTitle(expected_title);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string locale = g_browser_process->GetApplicationLocale();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (base::i18n::GetTextDirectionForLocale(locale.c_str()) ==
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::i18n::RIGHT_TO_LEFT) {
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::i18n::WrapStringWithLTRFormatting(&page_title);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do we need to use the above code on POSIX as well?
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return page_title;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the app extension aptly named "App Test".
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* GetExtension() {
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ExtensionSet* extensions = extensions::ExtensionSystem::Get(
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->extension_service()->extensions();
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ExtensionSet::const_iterator it = extensions->begin();
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != extensions->end(); ++it) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if ((*it)->name() == "App Test")
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        return it->get();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app on a page with no title, check that the app title was set
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// correctly.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoTitle) {
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(ASCIIToUTF16("title1.html")),
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 tab_title;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("title1.html"), tab_title);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Launch the app, navigate to a page with a title, check that the app title
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// was set correctly.
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, Title) {
2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle2File)));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const string16 test_title(ASCIIToUTF16("Title Of Awesomeness"));
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(LocaleWindowCaptionFromPageTitle(test_title),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            browser()->GetWindowTitleForCurrentTab());
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 tab_title;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::GetCurrentTabTitle(browser(), &tab_title));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(test_title, tab_title);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, JavascriptAlertActivatesTab) {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle1File)));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, url, content::PAGE_TRANSITION_TYPED);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* second_tab = browser()->tab_strip_model()->GetWebContentsAt(1);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(second_tab);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  second_tab->GetRenderViewHost()->ExecuteJavascriptInWebFrame(
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16(),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASCIIToUTF16("alert('Activate!');"));
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) && !defined(NDEBUG)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/114859. Times out frequently on Windows.
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs DISABLED_ThirtyFourTabs
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ThirtyFourTabs ThirtyFourTabs
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Create 34 tabs and verify that a lot of processes have been created. The
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// exact number of processes depends on the amount of memory. Previously we
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// had a hard limit of 31 processes and this test is mainly directed at
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// verifying that we don't crash when we pass this limit.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Warning: this test can take >30 seconds when running on a slow (low
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// memory?) Mac builder.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_ThirtyFourTabs) {
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kTitle2File)));
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There is one initial tab.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kTabCount = 34;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int ix = 0; ix != (kTabCount - 1); ++ix) {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), url,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  content::PAGE_TRANSITION_TYPED);
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(kTabCount, browser()->tab_strip_model()->count());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See GetMaxRendererProcessCount() in
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content/browser/renderer_host/render_process_host_impl.cc
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the algorithm to decide how many processes to create.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kExpectedProcessCount =
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ARCH_CPU_64_BITS)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      17;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      25;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::SysInfo::AmountOfPhysicalMemoryMB() >= 2048) {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(CountRenderProcessHosts(), kExpectedProcessCount);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LT(CountRenderProcessHosts(), kExpectedProcessCount);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/22004.  Reloading a page with a before unload handler and
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then canceling the dialog should not leave the throbber spinning.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ReloadThenCancelBeforeUnload) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another page, but click cancel in the dialog.  Make sure that
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the throbber stops spinning.
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("onbeforeunload=null;"));
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Ensure that a transferred cross-process navigation does not generate
383868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// DidStopLoading events until the navigation commits.  If it did, then
384868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// ui_test_utils::NavigateToURL would proceed before the URL had committed.
385868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// http://crbug.com/243957.
386868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NoStopDuringTransferUntilCommit) {
387868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
388868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
389868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
390868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
391868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                           base::FilePath(kDocRoot));
392868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
393868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
394868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
395868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
396868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
397868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::ContentBrowserClient* old_client =
398868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      SetBrowserClientForTesting(&new_client);
399868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
400868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL init_url(test_server()->GetURL("files/title1.html"));
401868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), init_url);
402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Navigate to a same-site page that redirects, causing a transfer.
404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL dest_url(https_test_server.GetURL("files/title2.html"));
405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL redirect_url(test_server()->GetURL("server-redirect?" +
406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      dest_url.spec()));
407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), redirect_url);
408868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
409868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // We should immediately see the new committed entry.
410868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(contents->GetController().GetPendingEntry());
412868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(dest_url,
413868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            contents->GetController().GetLastCommittedEntry()->GetURL());
414868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
415868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Restore previous browser client.
416868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SetBrowserClientForTesting(old_client);
417868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
418868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Tests that a cross-process redirect will only cause the beforeunload
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// handler to run once.
421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, SingleBeforeUnloadAfterRedirect) {
422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Create HTTP and HTTPS servers for a cross-site transition.
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
425c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
427c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
428c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
429c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Temporarily replace ContentBrowserClient with one that will cause a
430868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // process swap on all redirects to HTTPS URLs.
431868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TransferHttpsRedirectsContentBrowserClient new_client;
432c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::ContentBrowserClient* old_client =
433c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      SetBrowserClientForTesting(&new_client);
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a page with a beforeunload handler.
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL url(test_server()->GetURL("files/beforeunload.html"));
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
438c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
439c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to a URL that redirects to another process and approve the
440c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // beforeunload dialog that pops up.
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
442c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::NotificationService::AllSources());
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL("files/title1.html"));
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL redirect_url(test_server()->GetURL("server-redirect?" +
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      https_url.spec()));
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  browser()->OpenURL(OpenURLParams(redirect_url, Referrer(), CURRENT_TAB,
448c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   content::PAGE_TRANSITION_TYPED, false));
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  nav_observer.Wait();
454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Restore previous browser client.
456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SetBrowserClientForTesting(old_client);
457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/80401.  Canceling a before unload dialog should reset
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the URL to the previous page's URL.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CancelBeforeUnloadResetsURL) {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url(ui_test_utils::GetTestUrl(base::FilePath(
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kBeforeUnloadFile)));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to a page that triggers a cross-site transition.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(test_server()->GetURL("files/title1.html"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver host_destroyed_observer(
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the dialog.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->CloseModalDialog();
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()->IsLoading());
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify there are no pending history items after the dialog is cancelled.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (see crbug.com/93858)
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetPendingEntry();
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, entry);
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the ShouldClose_ACK to arrive.  We can detect it by waiting for
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the pending RVH to be destroyed.
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_destroyed_observer.Wait();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(url, browser()->toolbar_model()->GetURL());
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clear the beforeunload handler so the test can easily exit.
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("onbeforeunload=null;"));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Crashy on mac.  http://crbug.com/38522  Crashy on win too (after 3 years).
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_WIN)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SingleBeforeUnloadAfterWindowClose \
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DISABLED_SingleBeforeUnloadAfterWindowClose
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_SingleBeforeUnloadAfterWindowClose \
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SingleBeforeUnloadAfterWindowClose
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test for crbug.com/11647.  A page closed with window.close() should not have
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// two beforeunload dialogs shown.
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_SingleBeforeUnloadAfterWindowClose) {
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetActiveWebContents()->GetRenderViewHost()->
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16(kOpenNewBeforeUnloadPage));
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the new window with JavaScript, which should show a single
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // beforeunload dialog.  Then show another alert, to make it easy to verify
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that a second beforeunload dialog isn't shown.
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->GetWebContentsAt(0)->GetRenderViewHost()->
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ASCIIToUTF16("w.close(); alert('bar');"));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   is_before_unload_dialog());
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserTest.BeforeUnloadVsBeforeReload times out on Windows.
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/130411
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload DISABLED_BeforeUnloadVsBeforeReload
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_BeforeUnloadVsBeforeReload BeforeUnloadVsBeforeReload
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that when a page has an onunload handler, reloading a page shows a
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// different dialog than navigating to a different page.
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_BeforeUnloadVsBeforeReload) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reload the page, and check that we get a "before reload" dialog.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cancel the reload.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->CancelAppModalDialog();
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigate to another url, and check that we get a "before unload" dialog.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url2(std::string("about:blank"));
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser()->OpenURL(OpenURLParams(
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      url2, Referrer(), CURRENT_TAB, content::PAGE_TRANSITION_TYPED, false));
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert = ui_test_utils::WaitForAppModalDialog();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(static_cast<JavaScriptAppModalDialog*>(alert)->is_reload());
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Accept the navigation so we end up on a page without a beforeunload hook.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BeforeUnloadAtQuitWithTwoWindows is a regression test for
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/11842. It opens two windows, one of which has a
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// beforeunload handler and attempts to exit cleanly.
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BeforeUnloadAtQuitWithTwoWindows : public InProcessBrowserTest {
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This test is for testing a specific shutdown behavior. This mimics what
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens in InProcessBrowserTest::RunTestOnMainThread and QuitBrowsers, but
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensures that it happens through the single IDC_EXIT of the test.
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CleanUpOnMainThread() OVERRIDE {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cycle both the MessageLoop and the Cocoa runloop twice to flush out any
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Chrome work that generates Cocoa work. Do this twice since there are two
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Browsers that must be closed.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Run the application event loop to completion, which will cycle the
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // native MessagePump on all platforms.
581b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE,
582b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                           base::MessageLoop::QuitClosure());
583b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    base::MessageLoop::current()->Run();
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Take care of any remaining Cocoa work.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CycleRunLoops();
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // At this point, quit should be for real now.
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(0u, chrome::GetTotalBrowserCount());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A helper function that cycles the MessageLoop, and on Mac, the Cocoa run
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // loop. It also drains the NSAutoreleasePool.
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CycleRunLoops() {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::testing::NSRunLoopRunAllPending();
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AutoreleasePool()->Recycle();
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, http://crbug.com/159214 .
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BeforeUnloadAtQuitWithTwoWindows,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_IfThisTestTimesOutItIndicatesFAILURE) {
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In the first browser, set up a page that has a beforeunload handler.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(std::string("data:text/html,") + kBeforeUnloadHTML);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a second browser window at about:blank.
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(browser()->profile(), chrome::GetActiveDesktop());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* second_window = browser_added_observer.WaitForSingleNewBrowser();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(second_window, GURL("about:blank"));
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the application to quit. IDC_EXIT calls AttemptUserExit, which on
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // everything but ChromeOS allows unload handlers to block exit. On that
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // platform, though, it exits unconditionally. See the comment and bug ID
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in AttemptUserExit() in application_lifetime.cc.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AttemptExit();
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ExecuteCommand(second_window, IDC_EXIT);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The beforeunload handler will run at exit, ensure it does, and then accept
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it to allow shutdown to proceed.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModalDialog* alert = ui_test_utils::WaitForAppModalDialog();
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(alert);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<JavaScriptAppModalDialog*>(alert)->is_before_unload_dialog());
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  alert->native_dialog()->AcceptAppModalDialog();
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // But wait there's more! If this test times out, it likely means that the
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // browser has not been able to quit correctly, indicating there's a
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // regression of the bug noted above.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that scripts can fork a new renderer process for a cross-site popup,
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// based on http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The script must open a new tab, set its window.opener to null, and navigate
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// it to a cross-site URL.  It should also work for meta-refreshes.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// See http://crbug.com/93517.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, NullOpenerRedirectForksProcess) {
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
655c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string redirect_popup = "w=window.open();";
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.opener=null;";
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "w.document.location=\"";
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += https_url.spec();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  redirect_popup += "\";";
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(redirect_popup));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should not be in the opener's process.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process);
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and use a
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // meta-refresh to navigate it instead.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string refresh_popup = "w=window.open();";
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.opener=null;";
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "w.document.write(";
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "'<META HTTP-EQUIV=\"refresh\" content=\"0; url=";
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += https_url.spec();
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  refresh_popup += "\">');w.document.close();";
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer2(
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(refresh_popup));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer2.Wait();
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, browser()->tab_strip_model()->count());
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab2 = browser()->tab_strip_model()->GetActiveWebContents();
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab2);
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab2);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab2->GetController().GetLastCommittedEntry());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab2->GetController().GetLastCommittedEntry()->GetURL().spec());
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This popup window should also not be in the opener's process.
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process2 =
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab2->GetRenderProcessHost();
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(process, popup_process2);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that other popup navigations that do not follow the steps at
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://www.google.com/chrome/intl/en/webmasters-faq.html#newtab will not
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// fork a new renderer process.
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OtherRedirectsDontForkProcess) {
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine::ForCurrentProcess()->AppendSwitch(
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      switches::kDisablePopupBlocking);
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create http and https servers for a cross-site transition.
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer https_test_server(net::SpawnedTestServer::TYPE_HTTPS,
740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           net::SpawnedTestServer::kLocalhost,
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                           base::FilePath(kDocRoot));
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_test_server.Start());
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL http_url(test_server()->GetURL("files/title1.html"));
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL https_url(https_test_server.GetURL(std::string()));
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start with an http URL.
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* oldtab = browser()->tab_strip_model()->GetActiveWebContents();
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* process = oldtab->GetRenderProcessHost();
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open a tab to a blank page, set its opener to null, and redirect it
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cross-site.
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string dont_fork_popup = "w=window.open();";
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "w.document.location=\"";
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += https_url.spec();
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dont_fork_popup += "\";";
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver popup_observer(
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_TAB_ADDED,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer(
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NotificationService::AllSources());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(dont_fork_popup));
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for popup window to appear and finish navigating.
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_observer.Wait();
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* newtab = browser()->tab_strip_model()->GetActiveWebContents();
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(newtab);
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(oldtab, newtab);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer.Wait();
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(newtab->GetController().GetLastCommittedEntry());
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            newtab->GetController().GetLastCommittedEntry()->GetURL().spec());
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Popup window should still be in the opener's process.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* popup_process =
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      newtab->GetRenderProcessHost();
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, popup_process);
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same thing if the current tab tries to navigate itself.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string navigate_str = "document.location=\"";
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += https_url.spec();
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  navigate_str += "\";";
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver nav_observer2(
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_COMMITTED,
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  oldtab->GetRenderViewHost()->
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExecuteJavascriptInWebFrame(string16(), ASCIIToUTF16(navigate_str));
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nav_observer2.Wait();
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(oldtab->GetController().GetLastCommittedEntry());
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(https_url.spec(),
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            oldtab->GetController().GetLastCommittedEntry()->GetURL().spec());
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Original window should still be in the original process.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost* new_process = newtab->GetRenderProcessHost();
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(process, new_process);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that get_process_idle_time() returns reasonable values when compared
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with time deltas measured locally.
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RenderIdleTime) {
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks start = base::TimeTicks::Now();
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderProcessHost::iterator it(
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::RenderProcessHost::AllHostsIterator());
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (; !it.IsAtEnd(); it.Advance()) {
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta renderer_td =
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        it.GetCurrentValue()->GetChildProcessIdleTime();
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta browser_td = base::TimeTicks::Now() - start;
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(browser_td >= renderer_td);
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test IDC_CREATE_SHORTCUTS command is enabled for url scheme file, ftp, http
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// and https and disabled for chrome://, about:// etc.
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(pinkerton): Disable app-mode in the model until we implement it
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on the Mac. http://crbug.com/13148
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutFile) {
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kEmptyFile =
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FILE_PATH_LITERAL("empty.html");
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kEmptyFile)));
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttp) {
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
844c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), http_url);
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, CommandCreateAppShortcutHttps) {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::SpawnedTestServer test_server(net::SpawnedTestServer::TYPE_HTTPS,
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
856c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL https_url(test_server.GetURL("/"));
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(https_url.SchemeIs(chrome::kHttpsScheme));
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), https_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, CommandCreateAppShortcutFtp) {
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_FTP,
869c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     net::SpawnedTestServer::kLocalhost,
870c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     base::FilePath(kDocRoot));
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server.Start());
872c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL ftp_url(test_server.GetURL(std::string()));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ftp_url.SchemeIs(chrome::kFtpScheme));
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), ftp_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, CommandCreateAppShortcutInvalid) {
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Urls that should not have shortcuts.
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL new_tab_url(chrome::kChromeUINewTabURL);
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), new_tab_url);
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL history_url(chrome::kChromeUIHistoryURL);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), history_url);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL downloads_url(chrome::kChromeUIDownloadsURL);
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), downloads_url);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
89590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL blank_url(content::kAboutBlankURL);
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_CREATE_SHORTCUTS));
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Change a tab into an application window.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DISABLED: http://crbug.com/72310
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DISABLED_ConvertTabToAppShortcut) {
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL http_url(test_server()->GetURL(std::string()));
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(http_url.SchemeIs(chrome::kHttpScheme));
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* initial_tab = browser()->tab_strip_model()->GetWebContentsAt(0);
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContents* app_tab = chrome::AddSelectedTabWithURL(
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), http_url, content::PAGE_TRANSITION_TYPED);
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2, browser()->tab_strip_model()->count());
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1u, chrome::GetBrowserCount(browser()->profile(),
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Turn |app_tab| into a tab in an app panel.
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ConvertTabToAppWindow(browser(), app_tab);
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = NULL;
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !app_browser; it.Next()) {
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      app_browser = *it;
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_browser);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the tab contents is in the new browser, and not in the old.
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(initial_tab, browser()->tab_strip_model()->GetWebContentsAt(0));
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the appliaction browser has a single tab, and that tab contains
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the content that we app-ified.
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, app_browser->tab_strip_model()->count());
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(app_tab, app_browser->tab_strip_model()->GetWebContentsAt(0));
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Normal tabs should accept load drops.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(initial_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The tab in an app window should not.
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(app_tab->GetMutableRendererPrefs()->can_accept_load_drops);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test RenderView correctly send back favicon url for web page that redirects
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to an anchor in javascript body.onload handler.
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_FaviconOfOnloadRedirectToAnchorPage) {
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("files/onload_redirect_to_anchor.html"));
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL expected_favicon_url(test_server()->GetURL("files/test.png"));
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetActiveEntry();
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) || defined(OS_LINUX) || defined (OS_WIN)
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/83828. On Mac 10.6, the failure rate is 14%
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange DISABLED_FaviconChange
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_FaviconChange FaviconChange
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that an icon can be changed from JS.
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_FaviconChange) {
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kFile =
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("onload_change_favicon.html");
9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kFile)));
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationEntry* entry = browser()->tab_strip_model()->
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetActiveWebContents()->GetController().GetActiveEntry();
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const base::FilePath::CharType* kIcon =
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FILE_PATH_LITERAL("test1.png");
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL expected_favicon_url(ui_test_utils::GetTestUrl(base::FilePath(
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kIcon)));
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected_favicon_url.spec(), entry->GetFavicon().url.spec());
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// http://crbug.com/172336
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension \
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISABLED_TabClosingWhenRemovingExtension
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_TabClosingWhenRemovingExtension TabClosingWhenRemovingExtension
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure TabClosing is sent when uninstalling an extension that is an app
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// tab.
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_TabClosingWhenRemovingExtension) {
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model->AddWebContents(app_contents, 0, content::PageTransitionFromInt(0),
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockTabStripModelObserver observer;
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->AddObserver(&observer);
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall the extension and make sure TabClosing is sent.
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* service = extensions::ExtensionSystem::Get(
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->profile())->extension_service();
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service->UninstallExtension(GetExtension()->id(), false, NULL);
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.closing_count());
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->RemoveObserver(&observer);
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There should only be one tab now.
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(1, browser()->tab_strip_model()->count());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Open with --app-id=<id>, and see that an app window opens.
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app.
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine command_line(CommandLine::NO_PROGRAM);
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  command_line.AppendSwitchASCII(switches::kAppId, extension_app->id());
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), command_line, first_run);
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(launch.OpenApplicationWindow(browser()->profile(), NULL));
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that the new browser has an app name.
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app_name should include the app's ID.
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NE(
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->app_name_.find(extension_app->id()),
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string::npos) << new_browser->app_name_;
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the CLD (Compact Language Detection) works properly.
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, PageLanguageDetection) {
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
108290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  //std::string lang;
108390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LanguageDetectionDetails details;
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new tab with a page in English.
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabAtIndex(0, GURL(test_server()->GetURL("files/english_page.html")),
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                content::PAGE_TRANSITION_TYPED);
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* current_web_contents =
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TranslateTabHelper* translate_tab_helper =
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      TranslateTabHelper::FromWebContents(current_web_contents);
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::Source<WebContents> source(current_web_contents);
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
109690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LanguageDetectionDetails>
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      en_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", translate_tab_helper->language_state().original_language());
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  en_language_detected_signal.Wait();
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(en_language_detected_signal.GetDetailsFor(
110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
110390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("en", details.adopted_language);
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("en", translate_tab_helper->language_state().original_language());
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now navigate to a page in French.
110790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::WindowedNotificationObserverWithDetails<
110890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    LanguageDetectionDetails>
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fr_language_detected_signal(chrome::NOTIFICATION_TAB_LANGUAGE_DETERMINED,
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  source);
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser(), GURL(test_server()->GetURL("files/french_page.html")));
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fr_language_detected_signal.Wait();
111490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  details.adopted_language.clear();
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(fr_language_detected_signal.GetDetailsFor(
111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        source.map_key(), &details));
111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ("fr", details.adopted_language);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("fr", translate_tab_helper->language_state().original_language());
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chromeos defaults to restoring the last session, so this test isn't
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// applicable.
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_CHROMEOS)
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Crashy, http://crbug.com/38522
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define RestorePinnedTabs DISABLED_RestorePinnedTabs
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure pinned tabs are restored correctly on start.
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, RestorePinnedTabs) {
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an pinned app tab.
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* model = browser()->tab_strip_model();
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_contents = WebContents::Create(
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebContents::CreateParams(browser()->profile()));
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::TabHelper::CreateForWebContents(app_contents);
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::TabHelper* extensions_tab_helper =
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::TabHelper::FromWebContents(app_contents);
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions_tab_helper->SetExtensionApp(extension_app);
11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model->AddWebContents(app_contents, 0, content::PageTransitionFromInt(0),
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        TabStripModel::ADD_NONE);
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(0, true);
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a non pinned tab.
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a pinned non-app tab.
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
115590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(content::kAboutBlankURL));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  model->SetTabPinned(2, true);
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Write out the pinned tabs.
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PinnedTabCodec::WritePinnedTabs(browser()->profile());
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate launching again.
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine dummy(CommandLine::NO_PROGRAM);
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::startup::IsFirstRun first_run = first_run::IsChromeFirstRun() ?
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::startup::IS_FIRST_RUN : chrome::startup::IS_NOT_FIRST_RUN;
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StartupBrowserCreatorImpl launch(base::FilePath(), dummy, first_run);
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  launch.profile_ = browser()->profile();
116790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  launch.ProcessStartupURLs(std::vector<GURL>(),
116890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                            browser()->host_desktop_type());
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We should get back an additional tab for the app, and another for the
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // default home page.
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(3, new_browser->tab_strip_model()->count());
11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the state matches.
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TabStripModel* new_model = new_browser->tab_strip_model();
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsAppTab(0));
11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(1));
11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsAppTab(2));
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(0));
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_model->IsTabPinned(1));
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_model->IsTabPinned(2));
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(GURL(chrome::kChromeUINewTabURL),
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            new_model->GetWebContentsAt(2)->GetURL());
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new_model->GetWebContentsAt(0))->extension_app() == extension_app);
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies we don't crash when closing the last window and the app
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// menu is showing.
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CloseWithAppMenuOpen DISABLED_CloseWithAppMenuOpen
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CloseWithAppMenuOpen CloseWithAppMenuOpen
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_CloseWithAppMenuOpen) {
12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser_defaults::kBrowserAliveWithNoWindows)
12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need a message loop running for menus on windows.
1219b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE, base::Bind(&RunCloseWithAppMenuCallback, browser()));
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX)
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, OpenAppWindowLikeNtp) {
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Load an app
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII("app/")));
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_app = GetExtension();
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Launch it in a window, as AppLauncherHandler::HandleLaunchApp() would.
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* app_window = chrome::OpenApplication(
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      chrome::AppLaunchParams(browser()->profile(), extension_app,
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              extension_misc::LAUNCH_WINDOW, NEW_WINDOW));
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(app_window);
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Apps launched in a window from the NTP have an extensions tab helper but
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do not have extension_app set in it.
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(extensions::TabHelper::FromWebContents(app_window));
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extensions::TabHelper::FromWebContents(app_window)->extension_app());
1243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(extensions::AppLaunchInfo::GetFullLaunchURL(extension_app),
1244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            app_window->GetURL());
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The launch should have created a new browser.
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_EQ(2u, chrome::GetBrowserCount(browser()->profile(),
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the new browser.
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser = NULL;
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (chrome::BrowserIterator it; !it.done() && !new_browser; it.Next()) {
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (*it != browser())
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_browser = *it;
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser);
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(new_browser != browser());
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_browser->is_app());
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser's app name should include the extension's id.
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string app_name = new_browser->app_name_;
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_NE(app_name.find(extension_app->id()), std::string::npos)
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << "Name " << app_name << " should contain id "<< extension_app->id();
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(OS_MACOSX)
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MAXIMIZED) has been invoked.
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, StartMaximized) {
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MAXIMIZED;
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Aura doesn't support minimized window. crbug.com/104571.
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized DISABLED_StartMinimized
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_StartMinimized StartMinimized
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the browser doesn't crash when
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// set_show_state(ui::SHOW_STATE_MINIMIZED) has been invoked.
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_StartMinimized) {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser::Type types[] = { Browser::TYPE_TABBED, Browser::TYPE_POPUP };
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(types); ++i) {
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Browser::CreateParams params(types[i], browser()->profile(),
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 browser()->host_desktop_type());
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    params.initial_show_state = ui::SHOW_STATE_MINIMIZED;
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AddBlankTabAndShow(new Browser(params));
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the forward button is disabled immediately when navigating
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forward to a slow-to-commit page.
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, ForwardDisabledOnForward) {
130190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  GURL blank_url(content::kAboutBlankURL);
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), blank_url);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::NavigateToURL(
13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser(), ui_test_utils::GetTestUrl(
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(base::FilePath::kCurrentDirectory),
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     base::FilePath(kTitle1File)));
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver back_nav_load_observer(
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoBack(browser(), CURRENT_TAB);
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  back_nav_load_observer.Wait();
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_FORWARD));
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver forward_nav_load_observer(
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::NOTIFICATION_LOAD_STOP,
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<NavigationController>(
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &browser()->tab_strip_model()->GetActiveWebContents()->
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              GetController()));
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::GoForward(browser(), CURRENT_TAB);
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This check will happen before the navigation completes, since the browser
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // won't process the renderer's response until the Wait() call below.
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_FORWARD));
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  forward_nav_load_observer.Wait();
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure certain commands are disabled when Incognito mode is forced.
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisableMenuItemsWhenIncognitoIsForced) {
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // At the beginning, all commands are enabled.
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bookmarks & Settings commands should get disabled.
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New Incognito Window command, however, should be enabled.
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
1358868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      new Browser(Browser::CreateParams(
1359868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->profile()->GetOffTheRecordProfile(),
1360868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          browser()->host_desktop_type()));
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It should have Bookmarks & Settings commands disabled by default.
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure New Incognito Window command is disabled when Incognito mode is
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not available.
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       NoNewIncognitoWindowWhenIncognitoIsDisabled) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure New Incognito Window command is disabled. All remaining commands
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be enabled.
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new browser.
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* new_browser =
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Browser(Browser::CreateParams(browser()->profile(),
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* new_command_updater =
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_browser->command_controller()->command_updater();
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(new_command_updater->IsCommandEnabled(IDC_NEW_INCOGNITO_WINDOW));
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(new_command_updater->IsCommandEnabled(IDC_OPTIONS));
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableExtensionsAndSettingsWhenIncognitoIsDisabled) {
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable extensions. This should disable Extensions menu.
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  extensions::ExtensionSystem::Get(browser()->profile())->extension_service()->
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      set_extensions_enabled(false);
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to DISABLED.
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(browser()->profile()->GetPrefs(),
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::DISABLED);
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure Manage Extensions command is disabled.
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_NEW_WINDOW));
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SHOW_BOOKMARK_MANAGER));
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup (non-main-UI-type) browser. Settings command as well
14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // as Extensions should be disabled.
14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* popup_command_updater =
14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_MANAGE_EXTENSIONS));
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_OPTIONS));
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(popup_command_updater->IsCommandEnabled(
14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDC_SHOW_BOOKMARK_MANAGER));
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(popup_command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure Extensions and Settings commands are disabled in certain
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// circumstances even though normally they should stay enabled.
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest,
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DisableOptionsAndImportMenuItemsConsistently) {
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a popup browser.
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile(),
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            browser()->host_desktop_type()));
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      popup_browser->command_controller()->command_updater();
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled for a non-normal UI.
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to FORCED.
14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::FORCED);
14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are disabled when Incognito is forced.
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set Incognito to AVAILABLE.
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IncognitoModePrefs::SetAvailability(popup_browser->profile()->GetPrefs(),
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      IncognitoModePrefs::ENABLED);
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OPTIONS and IMPORT_SETTINGS are still disabled since it is a non-normal UI.
14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_OPTIONS));
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_IMPORT_SETTINGS));
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void OnZoomLevelChanged(const base::Closure& callback,
14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        const HostZoomMap::ZoomLevelChange& host) {
14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  callback.Run();
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flakes regularly on Windows XP
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/146040
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom DISABLED_PageZoom
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_PageZoom PageZoom
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_PageZoom) {
14832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool enable_plus, enable_minus;
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
14872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
14892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
14902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
14912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
14922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
14932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_IN);
14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 110);
14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 100);
15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::ZoomLevelChangedCallback callback(
15222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::Bind(&OnZoomLevelChanged, loop_runner->QuitClosure()));
15232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->AddZoomLevelChangedCallback(callback);
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::Zoom(browser(), content::PAGE_ZOOM_OUT);
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::HostZoomMap::GetForBrowserContext(
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser()->profile())->RemoveZoomLevelChangedCallback(callback);
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(contents->GetZoomPercent(&enable_plus, &enable_minus), 90);
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_plus);
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_TRUE(enable_minus);
15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Zoom(browser(), content::PAGE_ZOOM_RESET);
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCommandDisable) {
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_resolver()->AddRule("www.example.com", "127.0.0.1");
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandUpdater* command_updater =
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser()->command_controller()->command_updater();
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestInterstitialPage* interstitial = NULL;
15532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
15582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
15592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
15602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial = new TestInterstitialPage(contents, false, GURL());
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_PRINT));
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
15762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure(),
15772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
15782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    interstitial->Proceed();
15792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
15802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
15812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_VIEW_SOURCE));
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_PRINT));
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_SAVE_PAGE));
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(command_updater->IsCommandEnabled(IDC_ENCODING_MENU));
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, InterstitialCloseTab) {
15902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents();
15912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_refptr<content::MessageLoopRunner> loop_runner(
15942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new content::MessageLoopRunner);
15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    InterstitialObserver observer(contents,
15972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure(),
15982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  base::Closure());
15992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Interstitial will delete itself when we close the tab.
16002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    new TestInterstitialPage(contents, false, GURL());
16012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
16022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(contents->ShowingInterstitialPage());
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (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)                                  base::Closure(),
16122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  loop_runner->QuitClosure());
16132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chrome::CloseTab(browser());
16142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loop_runner->Run();
16152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // interstitial is deleted now.
16162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebContentsObserver : public WebContentsObserver {
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MockWebContentsObserver(WebContents* web_contents)
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : WebContentsObserver(web_contents),
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        got_user_gesture_(false) {
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidGetUserGesture() OVERRIDE {
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = true;
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture() const {
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return got_user_gesture_;
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_got_user_gesture(bool got_it) {
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    got_user_gesture_ = got_it;
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool got_user_gesture_;
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockWebContentsObserver);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, UserGesturesReported) {
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Regression test for http://crbug.com/110707.  Also tests that a user
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // gesture is sent when a normal navigation (via e.g. the omnibox) is
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // performed.
16482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents =
16492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents();
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockWebContentsObserver mock_observer(web_contents);
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(test_server()->Start());
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(test_server()->GetURL("empty.html"));
16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mock_observer.set_got_user_gesture(false);
16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Reload(browser(), CURRENT_TAB);
16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(mock_observer.got_user_gesture());
16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ben): this test was never enabled. It has bit-rotted since being added.
16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It originally lived in browser_unittest.cc, but has been moved here to make
16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// room for real browser unit tests.
16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if 0
16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserTest2 : public InProcessBrowserTest {
16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserTest2() {
16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_ = new net::RuleBasedHostResolverProc(NULL);
16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Avoid making external DNS lookups. In this test we don't need this
16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to succeed.
16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    host_resolver_proc_->AddSimulatedFailure("*.google.com");
16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_host_resolver_proc_.Init(host_resolver_proc_.get());
16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<net::RuleBasedHostResolverProc> host_resolver_proc_;
16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::ScopedDefaultHostResolverProc scoped_host_resolver_proc_;
16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest2, NoTabsInPopups) {
16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::RegisterAppPrefs(L"Test");
16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We start with a normal browser with one tab.
16862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->count());
16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a popup browser with a single blank foreground tab.
16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* popup_browser = new Browser(
16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser::CreateParams(Browser::TYPE_POPUP, browser()->profile()));
16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(popup_browser, -1, true);
16922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the popup browser.
16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddTabWithURLParams params1(url, content::PAGE_TRANSITION_TYPED);
16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  popup_browser->AddTabWithURL(&params1);
16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(popup_browser, params1.target);
16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, popup_browser->tab_strip_model()->count());
17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have two.
17032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, browser()->tab_strip_model()->count());
17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame browser with a single blank foreground tab.
17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_browser = new Browser(Browser::CreateParams::CreateForApp(
17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(app_browser, -1, true);
17092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app browser.
171290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTabWithURLParams params2(GURL(content::kAboutBlankURL),
17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              content::PAGE_TRANSITION_TYPED);
17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_browser->AddTabWithURL(&params2);
17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_browser, params2.target);
17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_browser->tab_strip_model()->count());
17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have three.
17212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, browser()->tab_strip_model()->count());
17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open an app frame popup browser with a single blank foreground tab.
17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* app_popup_browser = new Browser(Browser::CreateParams::CreateForApp(
17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      L"Test", browser()->profile(), false));
17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::AddBlankTabAt(app_popup_browser, -1, true);
17272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now try opening another tab in the app popup browser.
173090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddTabWithURLParams params3(GURL(content::kAboutBlankURL),
17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              content::PAGE_TRANSITION_TYPED);
17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  app_popup_browser->AddTabWithURL(&params3);
17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(app_popup_browser, params3.target);
17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The popup should still only have one tab.
17362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, app_popup_browser->tab_strip_model()->count());
17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The normal browser should now have four.
17392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(4, browser()->tab_strip_model()->count());
17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the additional browsers.
17422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  popup_browser->tab_strip_model()->CloseAllTabs();
17432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_browser->tab_strip_model()->CloseAllTabs();
17442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  app_popup_browser->tab_strip_model()->CloseAllTabs();
17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, WindowOpenClose) {
17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
17502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), base::FilePath().AppendASCII("window.close.html"));
17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 title = ASCIIToUTF16("Title Of Awesomeness");
17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
17542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), title);
17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURLBlockUntilNavigationsComplete(browser(), url, 2);
17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GTK doesn't use the Browser's fullscreen state.
17602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
17612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Mac disabled: http://crbug.com/169820
17622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(TOOLKIT_GTK) && !defined(OS_MACOSX) && \
17632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    !(defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
17642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, FullscreenBookmarkBar) {
17652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleBookmarkBar(browser());
17662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::ToggleFullscreenMode(browser());
17682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(browser()->window()->IsFullscreen());
17692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX)
17702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_CHROMEOS)
1772b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // TODO(jamescook): If immersive fullscreen is disabled by default, test
1773b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // for BookmarkBar::HIDDEN.
1774b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
17752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
17762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(BookmarkBar::HIDDEN, browser()->bookmark_bar_state());
17772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
17782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
17792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
17802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ShowModalDialogTest : public BrowserTest {
17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowModalDialogTest() {}
17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kDisablePopupBlocking);
17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ShowModalDialogTest, BasicTest) {
17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This navigation should show a modal dialog that will be immediately
17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // closed, but the fact that it was shown should be recorded.
17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
17942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(), base::FilePath().AppendASCII("showmodaldialog.html"));
17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 expected_title(ASCIIToUTF16("SUCCESS"));
17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
17982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that we set a mark on successful dialog show.
18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, DisallowFileUrlUniversalAccessTest) {
18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url = ui_test_utils::GetTestUrl(
18072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(),
18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath().AppendASCII("fileurl_universalaccess.html"));
18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 expected_title(ASCIIToUTF16("Disallowed"));
18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TitleWatcher title_watcher(
18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(), expected_title);
18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  title_watcher.AlsoWaitForTitle(ASCIIToUTF16("Allowed"));
18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(expected_title, title_watcher.WaitAndGetTitle());
18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class KioskModeTest : public BrowserTest {
18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KioskModeTest() {}
18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKioskMode);
18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_MACOSX) || (defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA))
18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://crbug.com/103912
18292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest DISABLED_EnableKioskModeTest
18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_EnableKioskModeTest EnableKioskModeTest
18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(KioskModeTest, MAYBE_EnableKioskModeTest) {
18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if browser is in fullscreen mode.
18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser()->window()->IsFullscreen());
18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(browser()->window()->IsFullscreenBubbleVisible());
18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test verifies that Chrome can be launched with a user-data-dir path
18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// which contains non ASCII characters.
18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LaunchBrowserWithNonAsciiUserDatadir : public BrowserTest {
18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LaunchBrowserWithNonAsciiUserDatadir() {}
18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
18492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath tmp_profile = temp_dir_.path().AppendASCII("tmp_profile");
18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tmp_profile = tmp_profile.Append(L"Test Chrome G\u00E9raldine");
18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(tmp_profile));
18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchPath(switches::kUserDataDir, tmp_profile);
18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(LaunchBrowserWithNonAsciiUserDatadir,
18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       TestNonAsciiUserDataDir) {
18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify that the window is present.
18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser());
18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_WIN)
18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunInBackgroundTest : public BrowserTest {
18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunInBackgroundTest() {}
18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(RunInBackgroundTest, RunInBackgroundBasicTest) {
18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close the browser window, then open a new one - the browser should keep
18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // running.
18805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Profile* profile = browser()->profile();
18812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::WindowedNotificationObserver observer(
18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::NOTIFICATION_BROWSER_CLOSED,
18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content::Source<Browser>(browser()));
18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::CloseWindow(browser());
18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer.Wait();
18872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
1890eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  chrome::NewEmptyWindow(profile, chrome::GetActiveDesktop());
18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests to ensure that the browser continues running in the background after
18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the last window closes.
18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NoStartupWindowTest : public BrowserTest {
18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NoStartupWindowTest() {}
19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kNoStartupWindow);
19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitch(switches::kKeepAliveForTest);
19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, NoStartupWindowBasicTest) {
19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No browser window should be started by default.
19102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0u, chrome::GetTotalBrowserCount());
19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starting a browser window should work just fine.
19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CreateBrowser(ProfileManager::GetDefaultProfile());
19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1u, chrome::GetTotalBrowserCount());
19182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Chromeos needs to track app windows because it considers them to be part of
19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// session state.
19222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS)
19232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(NoStartupWindowTest, DontInitSessionServiceForApps) {
19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile = ProfileManager::GetDefaultProfile();
19252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SessionService* session_service =
19272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SessionServiceFactory::GetForProfile(profile);
19282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
19292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::BrowserAddedObserver browser_added_observer;
19312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CreateBrowserForApp("blah", profile);
19322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser_added_observer.WaitForSingleNewBrowser();
19332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_FALSE(session_service->processed_any_commands());
19355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_CHROMEOS)
19375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This test needs to be placed outside the anonymous namespace because we
19395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// need to access private type of Browser.
19405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppModeTest : public BrowserTest {
19415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AppModeTest() {}
19435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
19455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url = ui_test_utils::GetTestUrl(
19462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       base::FilePath(), base::FilePath().AppendASCII("title1.html"));
19475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    command_line->AppendSwitchASCII(switches::kApp, url.spec());
19485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
19505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(AppModeTest, EnableAppModeTest) {
19525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that an application browser window loads correctly.
19535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Verify the browser is in application mode.
19555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(browser()->is_app());
19565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Confirm about:version contains some expected content.
19595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserTest, AboutVersion) {
19605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kAboutVersionURL));
19612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
19625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("WebKit"), true, true,
19635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
19645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("OS"), true, true,
19665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      NULL, NULL),
19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_GT(ui_test_utils::FindInPage(tab, ASCIIToUTF16("JavaScript"), true,
19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      true, NULL, NULL),
19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            0);
19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static const base::FilePath::CharType* kTestDir =
19742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    FILE_PATH_LITERAL("click_modifier");
19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kFirstPageTitle[] = "First window";
19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kSecondPageTitle[] = "New window!";
19775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ClickModifierTest : public InProcessBrowserTest {
19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
19805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClickModifierTest() {
19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that opens a new window or tab when clicked, via javascript.
19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetWindowOpenURL() {
19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
19872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("window_open.html")));
19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a url that follows a simple link when clicked, unless affected by
19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // modifiers.
19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL GetHrefURL() {
19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::GetTestUrl(
19942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(kTestDir),
19952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::FilePath(FILE_PATH_LITERAL("href.html")));
19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 getFirstPageTitle() {
19995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kFirstPageTitle);
20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 getSecondPageTitle() {
20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ASCIIToUTF16(kSecondPageTitle);
20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads our test page and simulates a single click using the supplied button
20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and modifiers.  The click will cause either a navigation or the creation of
20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a new window or foreground or background tab.  We verify that the expected
20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disposition occurs.
20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest(Browser* browser,
20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const GURL& url,
20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int modifiers,
20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WebKit::WebMouseEvent::Button button,
20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               WindowOpenDisposition disposition) {
20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::NavigateToURL(browser, url);
20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1, browser->tab_strip_model()->count());
20192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::WebContents* web_contents =
20202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        browser->tab_strip_model()->GetActiveWebContents();
20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(url, web_contents->GetURL());
20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == CURRENT_TAB) {
20242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::WebContents* web_contents =
20252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          browser->tab_strip_model()->GetActiveWebContents();
2026868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      content::TestNavigationObserver same_tab_observer(web_contents);
20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateMouseClick(web_contents, modifiers, button);
20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::RunLoop run_loop;
20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      same_tab_observer.WaitForObservation(
20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          base::Bind(&content::RunThisRunLoop, base::Unretained(&run_loop)),
20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          content::GetQuitTaskForRunLoop(&run_loop));
20322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
20342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(1, browser->tab_strip_model()->count());
20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::NOTIFICATION_TAB_ADDED,
20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SimulateMouseClick(web_contents, modifiers, button);
20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_WINDOW) {
20462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      EXPECT_EQ(2u, chrome::GetBrowserCount(browser->profile(),
20472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            browser->host_desktop_type()));
20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(1u, chrome::GetBrowserCount(browser->profile(),
20522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          browser->host_desktop_type()));
20532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(2, browser->tab_strip_model()->count());
20542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents = browser->tab_strip_model()->GetActiveWebContents();
20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WaitForLoadStop(web_contents);
20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (disposition == NEW_FOREGROUND_TAB) {
20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getSecondPageTitle(), web_contents->GetTitle());
20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
20595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(NEW_BACKGROUND_TAB, disposition);
20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(getFirstPageTitle(), web_contents->GetTitle());
20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClickModifierTest);
20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on elements with handlers that run window.open.
20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenBasicClickTest) {
20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on window.open is platform-dependent and not
20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// well defined.  Should we add tests so we know if it changes?
20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftClickTest) {
20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
20895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlClickTest) {
20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenControlShiftClickTest) {
21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modifiers |= WebKit::WebInputEvent::ShiftKey;
21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
21172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest DISABLED_WindowOpenMiddleClickTest
21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
21202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_WindowOpenMiddleClickTest WindowOpenMiddleClickTest
21212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
21222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, MAYBE_WindowOpenMiddleClickTest) {
21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, WindowOpenShiftMiddleClickTest) {
21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetWindowOpenURL(), modifiers, button, disposition);
21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests for clicking on normal links.
21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefBasicClickTest) {
21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = CURRENT_TAB;
21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(ericu): Alt-click behavior on links is platform-dependent and not well
21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// defined.  Should we add tests so we know if it changes?
21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-clicks open in a new window.
21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftClickTest) {
21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_WINDOW;
21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-clicks open in a background tab.
21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefControlClickTest) {
21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Control-shift-clicks open in a foreground tab.
21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On OSX meta [the command key] takes the place of control.
21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefControlShiftClickTest) {
21735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
21745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::MetaKey;
21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ControlKey;
21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  modifiers |= WebKit::WebInputEvent::ShiftKey;
21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonLeft;
21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Middle-clicks open in a background tab.
21852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// TODO(linux_aura) http://crbug.com/163931
21862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
21872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_HrefMiddleClickTest DISABLED_HrefMiddleClickTest
21882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
21892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_HrefMiddleClickTest HrefMiddleClickTest
21902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
21912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, MAYBE_HrefMiddleClickTest) {
21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = 0;
21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_BACKGROUND_TAB;
21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Shift-middle-clicks open in a foreground tab.
21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ClickModifierTest, HrefShiftMiddleClickTest) {
22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int modifiers = WebKit::WebInputEvent::ShiftKey;
22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebMouseEvent::Button button = WebKit::WebMouseEvent::ButtonMiddle;
22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowOpenDisposition disposition = NEW_FOREGROUND_TAB;
22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest(browser(), GetHrefURL(), modifiers, button, disposition);
22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2205