15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
89ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_tabstrip.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_window.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/chrome_pages.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/find_bar/find_bar_host_unittest_util.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/location_bar/location_bar.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_controller.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_edit_model.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_view.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/view_ids.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page_delegate.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/browser_test_utils.h"
37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "net/test/embedded_test_server/embedded_test_server.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/win/windows_version.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_LINUX) || defined(OS_MACOSX)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(jcampan): http://crbug.com/23683 for linux.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(suzhe): http://crbug.com/49737 for mac.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TabsRememberFocusFindInPage DISABLED_TabsRememberFocusFindInPage
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, http://crbug.com/62537.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_TabsRememberFocusFindInPage DISABLED_TabsRememberFocusFindInPage
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The delay waited in some cases where we don't have a notifications for an
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// action we take.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kActionDelayMs = 500;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kSimplePage[] = "/focus/page_with_focus.html";
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kStealFocusPage[] = "/focus/page_steals_focus.html";
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst char kTypicalPage[] = "/focus/typical_page.html";
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserFocusTest : public InProcessBrowserTest {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   // InProcessBrowserTest overrides:
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   virtual void SetUpOnMainThread() OVERRIDE {
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)     ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   }
71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsViewFocused(ViewID vid) {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui_test_utils::IsViewFocused(browser(), vid);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClickOnView(ViewID vid) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui_test_utils::ClickOnView(browser(), vid);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void TestFocusTraversal(RenderViewHost* render_view_host, bool reverse) {
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const char kGetFocusedElementJS[] =
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        "window.domAutomationController.send(getFocusedElement());";
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const char* kExpectedIDs[] = { "textEdit", "searchButton", "luckyButton",
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                   "googleLink", "gmailLink", "gmapLink" };
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("TestFocusTraversal: reverse=%d", reverse));
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    ui::KeyboardCode key = ui::VKEY_TAB;
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // TODO(msw): Mac requires ui::VKEY_BACKTAB for reverse cycling. Sigh...
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    key = reverse ? ui::VKEY_BACKTAB : ui::VKEY_TAB;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(OS_WIN)
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // This loop times out on Windows XP with no output. http://crbug.com/376635
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (base::win::GetVersion() < base::win::VERSION_VISTA)
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Loop through the focus chain twice for good measure.
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    for (size_t i = 0; i < 2; ++i) {
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SCOPED_TRACE(base::StringPrintf("focus outer loop: %" PRIuS, i));
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // Mac requires an extra Tab key press to traverse the app menu button
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // iff "Full Keyboard Access" is enabled. This test code should probably
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // check the setting via NSApplication's isFullKeyboardAccessEnabled.
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      for (size_t j = 0; j < arraysize(kExpectedIDs); ++j) {
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        SCOPED_TRACE(base::StringPrintf("focus inner loop %" PRIuS, j));
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        const size_t index = reverse ? arraysize(kExpectedIDs) - 1 - j : j;
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // The details are the node's editable state, i.e. true for "textEdit".
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        bool is_editable_node = index == 0;
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // Press Tab (or Shift+Tab) and check the focused element id.
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        ASSERT_TRUE(ui_test_utils::SendKeyPressAndWaitWithDetails(
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            browser(), key, false, reverse, false, false,
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            content::NOTIFICATION_FOCUS_CHANGED_IN_PAGE,
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            content::Source<RenderViewHost>(render_view_host),
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            content::Details<bool>(&is_editable_node)));
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        std::string focused_id;
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        EXPECT_TRUE(content::ExecuteScriptAndExtractString(
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            render_view_host, kGetFocusedElementJS, &focused_id));
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        EXPECT_STREQ(kExpectedIDs[index], focused_id.c_str());
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      }
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX)
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // TODO(msw): Mac doesn't post NOTIFICATION_FOCUS_RETURNED_TO_BROWSER and
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // would also apparently require extra Tab key presses here. Sigh...
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      chrome::FocusLocationBar(browser());
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else
127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      // On the last Tab key press, focus returns to the browser.
128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      ASSERT_TRUE(ui_test_utils::SendKeyPressAndWait(
129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          browser(), key, false, reverse, false, false,
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          chrome::NOTIFICATION_FOCUS_RETURNED_TO_BROWSER,
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          content::Source<Browser>(browser())));
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::RunAllPendingInMessageLoop();
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A helper class that waits for an interstitial page to attach.
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class WaitForInterstitial : public content::WebContentsObserver {
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit WaitForInterstitial(content::WebContents* tab)
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      : WebContentsObserver(tab),
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        runner_(new content::MessageLoopRunner) {
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    runner_->Run();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidAttachInterstitialPage() OVERRIDE { runner_->Quit(); }
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidDetachInterstitialPage() OVERRIDE { NOTREACHED(); }
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<content::MessageLoopRunner> runner_;
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WaitForInterstitial);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A test interstitial page with typical HTML contents.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestInterstitialPage : public content::InterstitialPageDelegate {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  explicit TestInterstitialPage(WebContents* tab) {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::FilePath file_path;
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    bool success = PathService::Get(chrome::DIR_TEST_DATA, &file_path);
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(success);
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    file_path = file_path.AppendASCII("focus/typical_page.html");
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    success = base::ReadFileToString(file_path, &html_contents_);
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(success);
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    interstitial_page_ = content::InterstitialPage::Create(
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        tab, true, GURL("http://interstitial.com"), this);
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Show the interstitial and delay return until it has attached.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    interstitial_page_->Show();
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    WaitForInterstitial wait(tab);
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(tab->ShowingInterstitialPage());
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual std::string GetHTMLContents() OVERRIDE { return html_contents_; }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* render_view_host() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return interstitial_page_->GetRenderViewHostForTesting();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void DontProceed() { interstitial_page_->DontProceed(); }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool HasFocus() { return render_view_host()->GetView()->HasFocus(); }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string html_contents_;
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::InterstitialPage* interstitial_page_;  // Owns this.
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestInterstitialPage);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky on mac. http://crbug.com/67301.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ClickingMovesFocus DISABLED_ClickingMovesFocus
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MAYBE_ClickingMovesFocus ClickingMovesFocus
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_ClickingMovesFocus) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // It seems we have to wait a little bit for the widgets to spin up before
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we can start clicking on them.
202b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
204b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      base::MessageLoop::QuitClosure(),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kActionDelayMs));
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunMessageLoop();
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // defined(OS_POSIX)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClickOnView(VIEW_ID_TAB_CONTAINER);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ClickOnView(VIEW_ID_OMNIBOX);
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, http://crbug.com/69034.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_BrowsersRememberFocus) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kSimplePage);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow window = browser()->window()->GetNativeWindow();
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The focus should be on the Tab contents.
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now hide the window, show it again, the focus should not have changed.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::HideNativeWindow(window);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(window));
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Hide the window, show it again, the focus should not have changed.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::HideNativeWindow(window);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(window));
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tabs remember focus.
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Disabled, http://crbug.com/62542.
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_TabsRememberFocus) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kSimplePage);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create several tabs.
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < 4; ++i) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::AddSelectedTabWithURL(browser(), url,
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  ui::PAGE_TRANSITION_TYPED);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Alternate focus for the tab.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const bool kFocusPage[3][5] = {
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { true, true, true, true, false },
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { false, false, false, false, false },
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { false, true, false, true, false }
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 1; i < 3; i++) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 0; j < 5; j++) {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Activate the tab.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->ActivateTabAt(j, true);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Activate the location bar or the page.
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (kFocusPage[i][j]) {
268010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        browser()->tab_strip_model()->GetWebContentsAt(j)->Focus();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        chrome::FocusLocationBar(browser());
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Now come back to the tab and check the right view is focused.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 0; j < 5; j++) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Activate the tab.
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->ActivateTabAt(j, true);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ViewID vid = kFocusPage[i][j] ? VIEW_ID_TAB_CONTAINER : VIEW_ID_OMNIBOX;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(IsViewFocused(vid));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser()->tab_strip_model()->ActivateTabAt(0, true);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try the above, but with ctrl+tab. Since tab normally changes focus,
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // this has regressed in the past. Loop through several times to be sure.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 0; j < 15; j++) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ViewID vid = kFocusPage[i][j % 5] ? VIEW_ID_TAB_CONTAINER :
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          VIEW_ID_OMNIBOX;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(IsViewFocused(vid));
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser(), ui::VKEY_TAB, true, false, false, false));
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // As above, but with ctrl+shift+tab.
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    browser()->tab_strip_model()->ActivateTabAt(4, true);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int j = 14; j >= 0; --j) {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ViewID vid = kFocusPage[i][j % 5] ? VIEW_ID_TAB_CONTAINER :
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          VIEW_ID_OMNIBOX;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(IsViewFocused(vid));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          browser(), ui::VKEY_TAB, true, true, false, false));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tabs remember focus with find-in-page box.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_TabsRememberFocusFindInPage) {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kSimplePage);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Find(browser());
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui_test_utils::FindInPage(
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16("a"), true, false, NULL, NULL);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus the location bar.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a 2nd tab.
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome::AddSelectedTabWithURL(browser(), url, ui::PAGE_TRANSITION_TYPED);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus should be on the recently opened tab page.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Select 1st tab, focus should still be on the location-bar.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (bug http://crbug.com/23296)
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(0, true);
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now open the find box again, switch to another tab and come back, the focus
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should return to the find box.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::Find(browser());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(1, true);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  browser()->tab_strip_model()->ActivateTabAt(0, true);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Background window does not steal focus.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, http://crbug.com/62538.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       DISABLED_BackgroundBrowserDontStealFocus) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a new browser window.
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Browser* browser2 =
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new Browser(Browser::CreateParams(browser()->profile(),
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        browser()->host_desktop_type()));
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(browser2);
355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  chrome::AddTabAt(browser2, GURL(), -1, true);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  browser2->window()->Show();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* focused_browser = NULL;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* unfocused_browser = NULL;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On X11, calling Activate() is not guaranteed to move focus, so we have
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to figure out which browser does have focus.
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (browser2->window()->IsActive()) {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focused_browser = browser2;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unfocused_browser = browser();
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (browser()->window()->IsActive()) {
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    focused_browser = browser();
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unfocused_browser = browser2;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FAIL() << "Could not determine which browser has focus";
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focused_browser = browser();
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unfocused_browser = browser2;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // On Mac, the newly created window always gets the focus.
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focused_browser = browser2;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unfocused_browser = browser();
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL steal_focus_url = embedded_test_server()->GetURL(kStealFocusPage);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(unfocused_browser, steal_focus_url);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Activate the first browser.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  focused_browser->window()->Activate();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      unfocused_browser->tab_strip_model()->GetActiveWebContents(),
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "stealFocus();"));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the first browser is still active.
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(focused_browser->window()->IsActive());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): http://crbug.com/163931
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_LocationBarLockFocus DISABLED_LocationBarLockFocus
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_LocationBarLockFocus LocationBarLockFocus
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Page cannot steal focus when focus is on location bar.
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_LocationBarLockFocus) {
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the page that steals focus.
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kStealFocusPage);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(content::ExecuteScript(
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents(),
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      "stealFocus();"));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make sure the location bar is still focused.
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test forward and reverse focus traversal on a typical page.
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, FocusTraversal) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kTypicalPage);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(TestFocusTraversal(tab->GetRenderViewHost(), false));
430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(TestFocusTraversal(tab->GetRenderViewHost(), true));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test forward and reverse focus traversal while an interstitial is showing.
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Disabled, see http://crbug.com/60973
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_FocusTraversalOnInterstitial) {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kSimplePage);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Create and show a test interstitial page.
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  TestInterstitialPage* interstitial_page = new TestInterstitialPage(
443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents());
444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::RenderViewHost* host = interstitial_page->render_view_host();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(TestFocusTraversal(host, false));
449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(TestFocusTraversal(host, true));
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test the transfer of focus when an interstitial is shown and hidden.
453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, InterstitialFocus) {
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kSimplePage);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContents* tab = browser()->tab_strip_model()->GetActiveWebContents();
458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tab->GetRenderViewHost()->GetView()->HasFocus());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Create and show a test interstitial page; it should gain focus.
462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestInterstitialPage* interstitial_page = new TestInterstitialPage(tab);
463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(interstitial_page->HasFocus());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Hide the interstitial; the original page should gain focus.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  interstitial_page->DontProceed();
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(tab->GetRenderViewHost()->GetView()->HasFocus());
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Test that find-in-page UI can request focus, even when it is already open.
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_MACOSX)
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_FindFocusTest DISABLED_FindFocusTest
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MAYBE_FindFocusTest FindFocusTest
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciIN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_FindFocusTest) {
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::DisableFindBarAnimationsDuringTesting(true);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const GURL url = embedded_test_server()->GetURL(kTypicalPage);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), url);
484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::ShowFindBar(browser());
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::ShowFindBar(browser());
493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClickOnView(VIEW_ID_TAB_CONTAINER);
496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  chrome::ShowFindBar(browser());
499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_FIND_IN_PAGE_TEXT_FIELD));
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure the focus is in the right location when opening the different
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// types of tabs.
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Flaky, http://crbug.com/62539.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_TabInitialFocus) {
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the history tab, focus should be on the tab contents.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowHistory(browser());
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the new tab, focus should be on the location bar.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::NewTab(browser());
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()));
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the download tab, focus should be on the tab contents.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowDownloads(browser());
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open about:blank, focus should be on the location bar.
527f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  chrome::AddSelectedTabWithURL(
5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      browser(), GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_LINK);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_NO_FATAL_FAILURE(content::WaitForLoadStop(
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      browser()->tab_strip_model()->GetActiveWebContents()));
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
5351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// TODO(erg): http://crbug.com/163931
5361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_FocusOnReload DISABLED_FocusOnReload
5371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#else
5381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define MAYBE_FocusOnReload FocusOnReload
5391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif
5401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that focus goes where expected when using reload.
5421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, MAYBE_FocusOnReload) {
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open the new tab, reload.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NotificationService::AllSources());
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::NewTab(browser());
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::Source<content::NavigationController>(
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &browser()->tab_strip_model()->GetActiveWebContents()->
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetController()));
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Reload(browser(), CURRENT_TAB);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus should stay on the location bar.
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a regular page, focus the location bar, reload.
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui_test_utils::NavigateToURL(browser(),
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               embedded_test_server()->GetURL(kSimplePage));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::FocusLocationBar(browser());
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::Source<content::NavigationController>(
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &browser()->tab_strip_model()->GetActiveWebContents()->
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetController()));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Reload(browser(), CURRENT_TAB);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus should now be on the tab contents.
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowDownloads(browser());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that focus goes where expected when using reload on a crashed tab.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_FocusOnReloadCrashedTab) {
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Open a regular page, crash, reload.
592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ui_test_utils::NavigateToURL(browser(),
593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                               embedded_test_server()->GetURL(kSimplePage));
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::CrashTab(browser()->tab_strip_model()->GetActiveWebContents());
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::WindowedNotificationObserver observer(
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::NOTIFICATION_LOAD_STOP,
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        content::Source<content::NavigationController>(
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            &browser()->tab_strip_model()->GetActiveWebContents()->
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                GetController()));
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    chrome::Reload(browser(), CURRENT_TAB);
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer.Wait();
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Focus should now be on the tab contents.
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  chrome::ShowDownloads(browser());
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Tests that focus goes to frame after crashed tab.
6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// TODO(shrikant): Find out where the focus should be deterministically.
6128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Currently focused_view after crash seem to be non null in debug mode
6138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// (invalidated pointer 0xcccccc).
6148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_FocusAfterCrashedTab) {
6158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
6168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  content::CrashTab(browser()->tab_strip_model()->GetActiveWebContents());
6188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  ASSERT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
6208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Tests that when a new tab is opened from the omnibox, the focus is moved from
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// the omnibox for the current tab.
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, NavigateFromOmniboxIntoNewTab) {
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url("http://www.google.com/");
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GURL url2("http://maps.google.com/");
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Navigate to url.
6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome::NavigateParams p(browser(), url, ui::PAGE_TRANSITION_LINK);
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.window_action = chrome::NavigateParams::SHOW_WINDOW;
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  p.disposition = CURRENT_TAB;
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::Navigate(&p);
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Focus the omnibox.
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::FocusLocationBar(browser());
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  OmniboxEditController* controller = browser()->window()->GetLocationBar()->
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      GetOmniboxView()->model()->controller();
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Simulate an alt-enter.
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  controller->OnAutocompleteAccept(url2, NEW_FOREGROUND_TAB,
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   ui::PAGE_TRANSITION_TYPED);
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the second tab is selected.
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, browser()->tab_strip_model()->active_index());
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The tab contents should have the focus in the second tab.
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_TAB_CONTAINER));
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Go back to the first tab. The focus should not be in the omnibox.
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::SelectPreviousTab(browser());
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, browser()->tab_strip_model()->active_index());
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(IsViewFocused(VIEW_ID_OMNIBOX));
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// This functionality is currently broken. http://crbug.com/304865.
657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//
658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//#if defined(OS_LINUX) && !defined(OS_CHROMEOS) && defined(USE_AURA)
659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//// TODO(erg): http://crbug.com/163931
660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//#define MAYBE_FocusOnNavigate DISABLED_FocusOnNavigate
661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//#else
662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//#define MAYBE_FocusOnNavigate FocusOnNavigate
663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)//#endif
6641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(BrowserFocusTest, DISABLED_FocusOnNavigate) {
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Needed on Mac.
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
668c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Load the NTP.
669c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUINewTabURL));
670c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate to another page.
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::FilePath::CharType* kEmptyFile = FILE_PATH_LITERAL("empty.html");
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GURL file_url(ui_test_utils::GetTestUrl(base::FilePath(
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::FilePath::kCurrentDirectory), base::FilePath(kEmptyFile)));
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ui_test_utils::NavigateToURL(browser(), file_url);
677c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
678c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClickOnView(VIEW_ID_TAB_CONTAINER);
679c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
680c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate back.  Should focus the location bar.
681c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
682c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WindowedNotificationObserver back_nav_observer(
683c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_COMMITTED,
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NotificationService::AllSources());
685c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chrome::GoBack(browser(), CURRENT_TAB);
686c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    back_nav_observer.Wait();
687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
688c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
689c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(IsViewFocused(VIEW_ID_OMNIBOX));
690c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
691c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Navigate forward.  Shouldn't focus the location bar.
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ClickOnView(VIEW_ID_TAB_CONTAINER);
693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::WindowedNotificationObserver forward_nav_observer(
695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NOTIFICATION_NAV_ENTRY_COMMITTED,
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        content::NotificationService::AllSources());
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chrome::GoForward(browser(), CURRENT_TAB);
698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    forward_nav_observer.Wait();
699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(IsViewFocused(VIEW_ID_OMNIBOX));
702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
705