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