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