172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "build/build_config.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/file_util.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/format_macros.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/path_service.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/string_number_conversions.h" 123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h" 133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h" 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/view_ids.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 19731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/common/url_constants.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_widget_host_view.h" 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/interstitial_page.h" 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h" 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h" 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(TOOLKIT_VIEWS) || defined(OS_WIN) 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/focus_manager.h" 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/view.h" 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h" 333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS) 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/frame/browser_view.h" 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/location_bar/location_bar_view.h" 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/tab_contents/tab_contents_container.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_USES_GTK) 4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/view_id_util.h" 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_WIN) 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <Psapi.h> 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <windows.h> 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX) 513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_FocusTraversal FocusTraversal 523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_FocusTraversalOnInterstitial FocusTraversalOnInterstitial 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(jcampan): http://crbug.com/23683 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_TabsRememberFocusFindInPage FAILS_TabsRememberFocusFindInPage 553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_MACOSX) 56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// TODO(suzhe): http://crbug.com/60973 (following two tests) 57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define MAYBE_FocusTraversal DISABLED_FocusTraversal 58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define MAYBE_FocusTraversalOnInterstitial DISABLED_FocusTraversalOnInterstitial 593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// TODO(suzhe): http://crbug.com/49737 603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_TabsRememberFocusFindInPage FAILS_TabsRememberFocusFindInPage 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_WIN) 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Disabled, http://crbug.com/62543. 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define MAYBE_FocusTraversal DISABLED_FocusTraversal 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Disabled, http://crbug.com/62544. 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define MAYBE_FocusTraversalOnInterstitial DISABLED_FocusTraversalOnInterstitial 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Flaky, http://crbug.com/62537. 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define MAYBE_TabsRememberFocusFindInPage FLAKY_TabsRememberFocusFindInPage 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The delay waited in some cases where we don't have a notifications for an 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// action we take. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kActionDelayMs = 500; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kSimplePage[] = "files/focus/page_with_focus.html"; 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kStealFocusPage[] = "files/focus/page_steals_focus.html"; 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kTypicalPage[] = "files/focus/typical_page.html"; 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kTypicalPageName[] = "typical_page.html"; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 8121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Test to make sure Chrome is in the foreground as we start testing. This is 8221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// required for tests that synthesize input to the Chrome window. 8321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool ChromeInForeground() { 8421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_WIN) 8521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen HWND window = ::GetForegroundWindow(); 8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::wstring caption; 8721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen std::wstring filename; 8821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int len = ::GetWindowTextLength(window) + 1; 8921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ::GetWindowText(window, WriteInto(&caption, len), len); 9021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool chrome_window_in_foreground = 9121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EndsWith(caption, L" - Google Chrome", true) || 9221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EndsWith(caption, L" - Chromium", true); 9321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!chrome_window_in_foreground) { 9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DWORD process_id; 9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int thread_id = ::GetWindowThreadProcessId(window, &process_id); 9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::ProcessHandle process; 9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (base::OpenProcessHandleWithAccess(process_id, 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen PROCESS_QUERY_LIMITED_INFORMATION, 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &process)) { 10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen len = MAX_PATH; 10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!GetProcessImageFileName(process, WriteInto(&filename, len), len)) { 10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen int error = GetLastError(); 10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen filename = std::wstring(L"Unable to read filename for process id '" + 10521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::IntToString16(process_id) + 10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen L"' (error ") + 10721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::IntToString16(error) + L")"; 10821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 10921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::CloseProcessHandle(process); 11021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 11121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 11221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(chrome_window_in_foreground) 11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Chrome must be in the foreground when running interactive tests\n" 11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Process in foreground: " << filename.c_str() << "\n" 11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Window: " << window << "\n" 11621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << "Caption: " << caption.c_str(); 11721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return chrome_window_in_foreground; 11821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#else 11921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Windows only at the moment. 12021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 12121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif 12221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 12321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass BrowserFocusTest : public InProcessBrowserTest { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserFocusTest() { 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch set_show_window(true); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EnableDOMAutomation(); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool IsViewFocused(ViewID vid) { 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return ui_test_utils::IsViewFocused(browser(), vid); 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void ClickOnView(ViewID vid) { 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::ClickOnView(browser(), vid); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TestInterstitialPage : public InterstitialPage { 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestInterstitialPage(TabContents* tab, bool new_navigation, const GURL& url) 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : InterstitialPage(tab, new_navigation, url) { 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath file_path; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool r = PathService::Get(chrome::DIR_TEST_DATA, &file_path); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(r); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path = file_path.AppendASCII("focus"); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_path = file_path.AppendASCII(kTypicalPageName); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch r = file_util::ReadFileToString(file_path, &html_contents_); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(r); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual std::string GetHTMLContents() { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return html_contents_; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Exposing render_view_host() and tab() to be public; they are declared as 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // protected in the superclass. 1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual RenderViewHost* render_view_host() { 1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return InterstitialPage::render_view_host(); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen virtual TabContents* tab() { 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return InterstitialPage::tab(); 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool HasFocus() { 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return render_view_host()->view()->HasFocus(); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected: 17221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual void FocusedNodeChanged(bool is_editable_node) { 1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationService::current()->Notify( 1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationType::FOCUS_CHANGED_IN_PAGE, 17572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<TabContents>(tab()), 17621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Details<const bool>(&is_editable_node)); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string html_contents_; 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, ClickingMovesFocus) { 1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 18521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#if defined(OS_POSIX) 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // It seems we have to wait a little bit for the widgets to spin up before 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we can start clicking on them. 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new MessageLoop::QuitTask(), 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kActionDelayMs); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 19221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#endif // defined(OS_POSIX) 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClickOnView(VIEW_ID_TAB_CONTAINER); 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClickOnView(VIEW_ID_LOCATION_BAR); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Flaky, http://crbug.com/69034. 2043f50c38dc070f4bb515c1b64450dae14f316474eKristian MonsenIN_PROC_BROWSER_TEST_F(BrowserFocusTest, FLAKY_BrowsersRememberFocus) { 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kSimplePage); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow window = browser()->window()->GetNativeHandle(); 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The focus should be on the Tab contents. 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now hide the window, show it again, the focus should not have changed. 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::HideNativeWindow(window); 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::ShowAndFocusNativeWindow(window); 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Hide the window, show it again, the focus should not have changed. 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::HideNativeWindow(window); 2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::ShowAndFocusNativeWindow(window); 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The rest of this test does not make sense on Linux because the behavior 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // of Activate() is not well defined and can vary by window manager. 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_WIN) 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open a new browser window. 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* browser2 = Browser::Create(browser()->profile()); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(browser2); 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser2->tabstrip_model()->delegate()->AddBlankTab(true); 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser2->window()->Show(); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser2, url); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HWND hwnd2 = reinterpret_cast<HWND>(browser2->window()->GetNativeHandle()); 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserView* browser_view2 = 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserView::GetBrowserViewForNativeWindow(hwnd2); 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(browser_view2); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::FocusManager* focus_manager2 = 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::FocusManager::GetFocusManagerForNativeView(hwnd2); 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(focus_manager2); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(browser_view2->GetTabContentsContainerView(), 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager2->GetFocusedView()); 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Switch to the 1st browser window, focus should still be on the location 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // bar and the second browser should have nothing focused. 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->window()->Activate(); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, focus_manager2->GetFocusedView()); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Switch back to the second browser, focus should still be on the page. 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser2->window()->Activate(); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(NULL, 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch views::FocusManager::GetFocusManagerForNativeView( 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->window()->GetNativeHandle())->GetFocusedView()); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(browser_view2->GetTabContentsContainerView(), 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_manager2->GetFocusedView()); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Close the 2nd browser to avoid a DCHECK(). 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_view2->Close(); 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tabs remember focus. 2684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Disabled, http://crbug.com/62542. 2694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_TabsRememberFocus) { 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 2743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kSimplePage); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create several tabs. 278513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch for (int i = 0; i < 4; ++i) 279513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser()->AddSelectedTabWithURL(url, PageTransition::TYPED); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Alternate focus for the tab. 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const bool kFocusPage[3][5] = { 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { true, true, true, true, false }, 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { false, false, false, false, false }, 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch { false, true, false, true, false } 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 1; i < 3; i++) { 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int j = 0; j < 5; j++) { 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Activate the tab. 291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(j, true); 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Activate the location bar or the page. 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (kFocusPage[i][j]) { 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->GetTabContentsAt(j)->view()->Focus(); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now come back to the tab and check the right view is focused. 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int j = 0; j < 5; j++) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Activate the tab. 304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(j, true); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ViewID vid = kFocusPage[i][j] ? VIEW_ID_TAB_CONTAINER_FOCUS_VIEW : 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VIEW_ID_LOCATION_BAR; 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(vid)); 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(0, true); 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Try the above, but with ctrl+tab. Since tab normally changes focus, 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // this has regressed in the past. Loop through several times to be sure. 314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int j = 0; j < 15; j++) { 315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ViewID vid = kFocusPage[i][j % 5] ? VIEW_ID_TAB_CONTAINER_FOCUS_VIEW : 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VIEW_ID_LOCATION_BAR; 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(vid)); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 32072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, true, false, false, false)); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // As above, but with ctrl+shift+tab. 324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(4, true); 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int j = 14; j >= 0; --j) { 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ViewID vid = kFocusPage[i][j % 5] ? VIEW_ID_TAB_CONTAINER_FOCUS_VIEW : 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch VIEW_ID_LOCATION_BAR; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(vid)); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 33172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, true, true, false, false)); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tabs remember focus with find-in-page box. 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_TabsRememberFocusFindInPage) { 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 3393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 3423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kSimplePage); 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->Find(); 34672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(), 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASCIIToUTF16("a"), true, false, NULL); 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus the location bar. 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create a 2nd tab. 354513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch browser()->AddSelectedTabWithURL(url, PageTransition::TYPED); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should be on the recently opened tab page. 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Select 1st tab, focus should still be on the location-bar. 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (bug http://crbug.com/23296) 361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(0, true); 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now open the find box again, switch to another tab and come back, the focus 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // should return to the find box. 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->Find(); 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(1, true); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->ActivateTabAt(0, true); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Background window does not steal focus. 3754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Flaky, http://crbug.com/62538. 3764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, 3774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch FLAKY_BackgroundBrowserDontStealFocus) { 3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 3793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open a new browser window. 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* browser2 = Browser::Create(browser()->profile()); 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(browser2); 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser2->tabstrip_model()->delegate()->AddBlankTab(true); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser2->window()->Show(); 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* focused_browser = NULL; 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Browser* unfocused_browser = NULL; 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(USE_X11) 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On X11, calling Activate() is not guaranteed to move focus, so we have 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // to figure out which browser does have focus. 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (browser2->window()->IsActive()) { 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focused_browser = browser2; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unfocused_browser = browser(); 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (browser()->window()->IsActive()) { 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focused_browser = browser(); 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unfocused_browser = browser2; 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 399731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick FAIL() << "Could not determine which browser has focus"; 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_WIN) 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focused_browser = browser(); 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch unfocused_browser = browser2; 4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#elif defined(OS_MACOSX) 4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // On Mac, the newly created window always gets the focus. 4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick focused_browser = browser2; 4073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unfocused_browser = browser(); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL steal_focus_url = test_server()->GetURL(kStealFocusPage); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(unfocused_browser, steal_focus_url); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Activate the first browser. 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focused_browser->window()->Activate(); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( 417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick unfocused_browser->GetSelectedTabContents()->render_view_host(), L"", 418731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"stealFocus();")); 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the first browser is still active. 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(focused_browser->window()->IsActive()); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Page cannot steal focus when focus is on location bar. 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, LocationBarLockFocus) { 4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open the page that steals focus. 4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kStealFocusPage); 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_TRUE(ui_test_utils::ExecuteJavaScript( 436731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser()->GetSelectedTabContents()->render_view_host(), L"", 437731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick L"stealFocus();")); 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the location bar is still focused. 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Focus traversal on a regular page. 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Note that this test relies on a notification from the renderer that the 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// focus has changed in the page. The notification in the renderer may change 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// at which point this test would fail (see comment in 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// RenderWidget::didFocus()). 4483345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_FocusTraversal) { 4493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kTypicalPage); 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* kTextElementID = "textEdit"; 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* kExpElementIDs[] = { 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "", // Initially no element in the page should be focused 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (the location bar is focused). 46221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen kTextElementID, "searchButton", "luckyButton", "googleLink", "gmailLink", 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "gmapLink" 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test forward focus traversal. 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 3; ++i) { 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SCOPED_TRACE(StringPrintf("outer loop: %d", i)); 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Location bar should be focused. 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Move the caret to the end, otherwise the next Tab key may not move focus. 47372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 47472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_END, false, false, false, false)); 47572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's press tab to move the focus. 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t j = 0; j < arraysize(kExpElementIDs); ++j) { 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SCOPED_TRACE(StringPrintf("inner loop %" PRIuS, j)); 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's make sure the focus is on the expected element in the page. 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string actual; 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->GetSelectedTabContents()->render_view_host(), 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"", 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"window.domAutomationController.send(getFocusedElement());", 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &actual)); 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ(kExpElementIDs[j], actual.c_str()); 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (j < arraysize(kExpElementIDs) - 1) { 48921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // If the next element is the kTextElementID, we expect to be 49021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // notified we have switched to an editable node. 49121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool is_editable_node = 49221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (strcmp(kTextElementID, kExpElementIDs[j + 1]) == 0); 49321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Details<bool> details(&is_editable_node); 49421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 49521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressAndWaitWithDetails( 49672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, false, false, false, 49721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationType::FOCUS_CHANGED_IN_PAGE, 49872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationSource(Source<TabContents>( 49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser()->GetSelectedTabContents())), 50021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen details)); 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On the last tab key press, the focus returns to the browser. 50321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( 50472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, false, false, false, 50521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationType::FOCUS_RETURNED_TO_BROWSER, 50621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationSource(Source<Browser>(browser())))); 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // At this point the renderer has sent us a message asking to advance the 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // focus (as the end of the focus loop was reached in the renderer). 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to run the message loop to process it. 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunAllPendingInMessageLoop(); 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's try reverse focus traversal. 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 3; ++i) { 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SCOPED_TRACE(StringPrintf("outer loop: %d", i)); 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Location bar should be focused. 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Move the caret to the end, otherwise the next Tab key may not move focus. 52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_END, false, false, false, false)); 52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's press shift-tab to move the focus in reverse. 5273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (size_t j = 0; j < arraysize(kExpElementIDs); ++j) { 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SCOPED_TRACE(StringPrintf("inner loop: %" PRIuS, j)); 52921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* next_element = 53021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen kExpElementIDs[arraysize(kExpElementIDs) - 1 - j]; 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (j < arraysize(kExpElementIDs) - 1) { 53321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // If the next element is the kTextElementID, we expect to be 53421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // notified we have switched to an editable node. 53521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool is_editable_node = (strcmp(kTextElementID, next_element) == 0); 53621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen Details<bool> details(&is_editable_node); 53721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 53821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressAndWaitWithDetails( 53972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, true, false, false, 54021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationType::FOCUS_CHANGED_IN_PAGE, 54172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen NotificationSource(Source<TabContents>( 54272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser()->GetSelectedTabContents())), 54321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen details)); 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On the last tab key press, the focus returns to the browser. 54621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( 54772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, true, false, false, 54821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationType::FOCUS_RETURNED_TO_BROWSER, 54921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NotificationSource(Source<Browser>(browser())))); 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's make sure the focus is on the expected element in the page. 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string actual; 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->GetSelectedTabContents()->render_view_host(), 556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"", 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch L"window.domAutomationController.send(getFocusedElement());", 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &actual)); 55921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen ASSERT_STREQ(next_element, actual.c_str()); 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // At this point the renderer has sent us a message asking to advance the 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // focus (as the end of the focus loop was reached in the renderer). 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to run the message loop to process it. 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunAllPendingInMessageLoop(); 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Focus traversal while an interstitial is showing. 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_FocusTraversalOnInterstitial) { 5713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 5723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 5753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kSimplePage); 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should be on the page. 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's show an interstitial. 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestInterstitialPage* interstitial_page = 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new TestInterstitialPage(browser()->GetSelectedTabContents(), 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch true, GURL("http://interstitial.com")); 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch interstitial_page->Show(); 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Give some time for the interstitial to show. 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new MessageLoop::QuitTask(), 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1000); 590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const char* kExpElementIDs[] = { 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "", // Initially no element in the page should be focused 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // (the location bar is focused). 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "textEdit", "searchButton", "luckyButton", "googleLink", "gmailLink", 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "gmapLink" 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test forward focus traversal. 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 2; ++i) { 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Location bar should be focused. 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 60672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Move the caret to the end, otherwise the next Tab key may not move focus. 60772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 60872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_END, false, false, false, false)); 60972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's press tab to move the focus. 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t j = 0; j < 7; ++j) { 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's make sure the focus is on the expected element in the page. 6133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string actual; 6143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 6153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick interstitial_page->render_view_host(), L"", 6163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick L"window.domAutomationController.send(getFocusedElement());", 6173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &actual)); 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ(kExpElementIDs[j], actual.c_str()); 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationType::Type notification_type; 6213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationSource notification_source = 6223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationService::AllSources(); 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (j < arraysize(kExpElementIDs) - 1) { 6243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type = NotificationType::FOCUS_CHANGED_IN_PAGE; 62572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen notification_source = Source<TabContents>( 62672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen interstitial_page->tab()); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On the last tab key press, the focus returns to the browser. 6293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type = NotificationType::FOCUS_RETURNED_TO_BROWSER; 6303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_source = Source<Browser>(browser()); 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 6323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( 63472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, false, false, false, 6353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type, notification_source)); 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // At this point the renderer has sent us a message asking to advance the 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // focus (as the end of the focus loop was reached in the renderer). 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to run the message loop to process it. 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunAllPendingInMessageLoop(); 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's try reverse focus traversal. 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 2; ++i) { 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Location bar should be focused. 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 64972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Move the caret to the end, otherwise the next Tab key may not move focus. 65072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 65172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_END, false, false, false, false)); 65272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now let's press shift-tab to move the focus in reverse. 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t j = 0; j < 7; ++j) { 6553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationType::Type notification_type; 6563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationSource notification_source = 6573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick NotificationService::AllSources(); 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (j < arraysize(kExpElementIDs) - 1) { 6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type = NotificationType::FOCUS_CHANGED_IN_PAGE; 66072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen notification_source = Source<TabContents>( 66172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen interstitial_page->tab()); 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // On the last tab key press, the focus returns to the browser. 6643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type = NotificationType::FOCUS_RETURNED_TO_BROWSER; 6653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_source = Source<Browser>(browser()); 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 6683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait( 66972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_TAB, false, true, false, false, 6703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick notification_type, notification_source)); 6713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's make sure the focus is on the expected element in the page. 6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string actual; 6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( 6753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick interstitial_page->render_view_host(), L"", 6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick L"window.domAutomationController.send(getFocusedElement());", 6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick &actual)); 678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_STREQ(kExpElementIDs[6 - j], actual.c_str()); 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // At this point the renderer has sent us a message asking to advance the 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // focus (as the end of the focus loop was reached in the renderer). 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // We need to run the message loop to process it. 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunAllPendingInMessageLoop(); 685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Focus stays on page with interstitials. 689c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, InterstitialFocus) { 6903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 6913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // First we navigate to our test page. 6943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kSimplePage); 695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Page should have focus. 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(browser()->GetSelectedTabContents()->render_view_host()->view()-> 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch HasFocus()); 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Let's show an interstitial. 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TestInterstitialPage* interstitial_page = 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new TestInterstitialPage(browser()->GetSelectedTabContents(), 705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch true, GURL("http://interstitial.com")); 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch interstitial_page->Show(); 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Give some time for the interstitial to show. 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostDelayedTask(FROM_HERE, 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new MessageLoop::QuitTask(), 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1000); 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The interstitial should have focus now. 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(interstitial_page->HasFocus()); 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Hide the interstitial. 718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch interstitial_page->DontProceed(); 719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should be back on the original page. 721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure Find box can request focus, even when it is already open. 72521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian MonsenIN_PROC_BROWSER_TEST_F(BrowserFocusTest, FindFocusTest) { 7263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 7273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open some page (any page that doesn't steal focus). 7303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GURL url = test_server()->GetURL(kTypicalPage); 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::NavigateToURL(browser(), url); 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen EXPECT_TRUE(ChromeInForeground()); 73421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX) 7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Press Cmd+F, which will make the Find box open and request focus. 7373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 73872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, false, false, false, true)); 7393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Press Ctrl+F, which will make the Find box open and request focus. 7413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 74272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, true, false, false, false)); 7433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ideally, we wouldn't sleep here and instead would intercept the 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // RenderViewHostDelegate::HandleKeyboardEvent() callback. To do that, we 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // could create a RenderViewHostDelegate wrapper and hook-it up by either: 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // - creating a factory used to create the delegate 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // - making the test a private and overwriting the delegate member directly. 750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostDelayedTask( 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, new MessageLoop::QuitTask(), kActionDelayMs); 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now press Ctrl+F again and focus should move to the Find box. 7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX) 7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 76272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, false, false, false, true)); 7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 76572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, true, false, false, false)); 7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Set focus to the page. 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ClickOnView(VIEW_ID_TAB_CONTAINER); 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now press Ctrl+F again and focus should move to the Find box. 7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_MACOSX) 7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 77672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, false, false, false, true)); 7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else 7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 77972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen browser(), ui::VKEY_F, true, false, false, false)); 7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See remark above on why we wait. 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch MessageLoop::current()->PostDelayedTask( 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FROM_HERE, new MessageLoop::QuitTask(), kActionDelayMs); 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunMessageLoop(); 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Makes sure the focus is in the right location when opening the different 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// types of tabs. 7914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Flaky, http://crbug.com/62539. 7924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, FLAKY_TabInitialFocus) { 7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open the history tab, focus should be on the tab contents. 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->ShowHistoryTab(); 797731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_NO_FATAL_FAILURE(ui_test_utils::WaitForLoadStop( 798ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->GetSelectedTabContents())); 799731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open the new tab, focus should be on the location bar. 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->NewTab(); 803731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_NO_FATAL_FAILURE(ui_test_utils::WaitForLoadStop( 804ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->GetSelectedTabContents())); 805731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open the download tab, focus should be on the tab contents. 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->ShowDownloadsTab(); 809731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_NO_FATAL_FAILURE(ui_test_utils::WaitForLoadStop( 810ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->GetSelectedTabContents())); 811731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open about:blank, focus should be on the location bar. 814731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser()->AddSelectedTabWithURL(GURL(chrome::kAboutBlankURL), 815731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick PageTransition::LINK); 816731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ASSERT_NO_FATAL_FAILURE(ui_test_utils::WaitForLoadStop( 817ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen browser()->GetSelectedTabContents())); 818731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EXPECT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that focus goes where expected when using reload. 822c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, FocusOnReload) { 8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 8243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open the new tab, reload. 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->NewTab(); 828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::RunAllPendingInMessageLoop(); 829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->Reload(CURRENT_TAB); 831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser())); 832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should stay on the location bar. 833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open a regular page, focus the location bar, reload. 8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::NavigateToURL(browser(), test_server()->GetURL(kSimplePage)); 837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->FocusLocationBar(); 838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_LOCATION_BAR)); 839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->Reload(CURRENT_TAB); 840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser())); 8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should now be on the tab contents. 843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->ShowDownloadsTab(); 844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that focus goes where expected when using reload on a crashed tab. 848513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_FocusOnReloadCrashedTab) { 8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ASSERT_TRUE(test_server()->Start()); 851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Open a regular page, crash, reload. 8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ui_test_utils::NavigateToURL(browser(), test_server()->GetURL(kSimplePage)); 854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ui_test_utils::CrashTab(browser()->GetSelectedTabContents()); 855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->Reload(CURRENT_TAB); 856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser())); 8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Focus should now be on the tab contents. 859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser()->ShowDownloadsTab(); 860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} // namespace 864