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