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 "base/message_loop.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h"
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_navigator.h"
124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser_window.h"
1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/find_bar/find_bar.h"
1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/find_bar/find_bar_controller.h"
1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/find_bar/find_notification_details.h"
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/find_bar/find_tab_helper.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h"
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/test/test_server.h"
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/keycodes/keyboard_codes.h"
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/find_bar_host.h"
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/focus/focus_manager.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(TOOLKIT_GTK)
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/slide_animator_gtk.h"
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_MACOSX)
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kSimplePage = "404_is_enough_for_us.html";
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kFramePage = "files/find_in_page/frames.html";
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kFrameData = "files/find_in_page/framedata_general.html";
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kUserSelectPage = "files/find_in_page/user-select.html";
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kCrashPage = "files/find_in_page/crash_1341577.html";
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kTooFewMatchesPage = "files/find_in_page/bug_1155639.html";
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst std::string kLongTextareaPage = "files/find_in_page/large_textarea.html";
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kEndState = "files/find_in_page/end_state.html";
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kPrematureEnd = "files/find_in_page/premature_end.html";
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kMoveIfOver = "files/find_in_page/move_if_obscuring.html";
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kBitstackCrash = "files/find_in_page/crash_14491.html";
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kSelectChangesOrdinal =
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    "files/find_in_page/select_changes_ordinal.html";
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kSimple = "files/find_in_page/simple.html";
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string kLinkPage = "files/find_in_page/link.html";
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst bool kBack = false;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst bool kFwd = true;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst bool kIgnoreCase = false;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst bool kCaseSensitive = true;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMoveIterations = 30;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FindInPageControllerTest : public InProcessBrowserTest {
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageControllerTest() {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EnableDOMAutomation();
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    DropdownBarHost::disable_animations_during_testing_ = true;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(TOOLKIT_GTK)
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SlideAnimatorGtk::SetAnimationsForTesting(false);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#elif defined(OS_MACOSX)
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FindBarBridge::disable_animations_during_testing_ = true;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetFindBarWindowInfoForBrowser(
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      Browser* browser, gfx::Point* position, bool* fully_visible) {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FindBarTesting* find_bar =
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser->GetFindBarController()->find_bar()->GetFindBarTesting();
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return find_bar->GetFindBarWindowInfo(position, fully_visible);
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetFindBarWindowInfo(gfx::Point* position, bool* fully_visible) {
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GetFindBarWindowInfoForBrowser(browser(), position, fully_visible);
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 GetFindBarTextForBrowser(Browser* browser) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FindBarTesting* find_bar =
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        browser->GetFindBarController()->find_bar()->GetFindBarTesting();
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return find_bar->GetFindText();
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string16 GetFindBarText() {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GetFindBarTextForBrowser(browser());
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  string16 GetFindBarMatchCountTextForBrowser(Browser* browser) {
9621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    FindBarTesting* find_bar =
9721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen      browser->GetFindBarController()->find_bar()->GetFindBarTesting();
9821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return find_bar->GetMatchCountText();
9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
10121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  string16 GetMatchCountText() {
10221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    return GetFindBarMatchCountTextForBrowser(browser());
10321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  }
10421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EnsureFindBoxOpenForBrowser(Browser* browser) {
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    browser->ShowFindBar();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    gfx::Point position;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool fully_visible = false;
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(GetFindBarWindowInfoForBrowser(
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    browser, &position, &fully_visible));
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(fully_visible);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EnsureFindBoxOpen() {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EnsureFindBoxOpenForBrowser(browser());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Platform independent FindInPage that takes |const wchar_t*|
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as an input.
12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint FindInPageWchar(TabContentsWrapper* tab,
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    const wchar_t* search_str,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool forward,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool case_sensitive,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    int* ordinal) {
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return ui_test_utils::FindInPage(
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab, WideToUTF16(std::wstring(search_str)),
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      forward, case_sensitive, ordinal);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test loads a page with frames and starts FindInPage requests.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageFrames) {
1333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our frames page.
1363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kFramePage);
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try incremental search (mimicking user typing in).
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(18, FindInPageWchar(tab, L"g",
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(11, FindInPageWchar(tab, L"go",
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(04, FindInPageWchar(tab, L"goo",
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(03, FindInPageWchar(tab, L"goog",
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(02, FindInPageWchar(tab, L"googl",
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(01, FindInPageWchar(tab, L"google",
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(00, FindInPageWchar(tab, L"google!",
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                kFwd, kIgnoreCase, &ordinal));
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Negative test (no matches should be found).
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"Non-existing string",
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'horse' only exists in the three right frames.
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"horse",
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'cat' only exists in the first frame.
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"cat",
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try searching again, should still come up with 1 match.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"cat",
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try searching backwards, ignoring case, should still come up with 1 match.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"CAT",
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kBack, kIgnoreCase, &ordinal));
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try case sensitive, should NOT find it.
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"CAT",
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kCaseSensitive, &ordinal));
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try again case sensitive, but this time with right case.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"dog",
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kCaseSensitive, &ordinal));
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Try non-Latin characters ('Hreggvidur' with 'eth' for 'd' in left frame).
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"Hreggvi\u00F0ur",
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"Hreggvi\u00F0ur",
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kCaseSensitive, &ordinal));
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"hreggvi\u00F0ur",
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kCaseSensitive, &ordinal));
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Specifying a prototype so that we can add the WARN_UNUSED_RESULT attribute.
212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool FocusedOnPage(TabContents* tab_contents, std::string* result)
213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    WARN_UNUSED_RESULT;
214731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickbool FocusedOnPage(TabContents* tab_contents, std::string* result) {
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  return ui_test_utils::ExecuteJavaScriptAndExtractString(
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_contents->render_view_host(),
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"",
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"window.domAutomationController.send(getFocusedElement());",
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      result);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests the FindInPage end-state, in other words: what is focused when you
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// close the Find box (ie. if you find within a link the link should be
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// focused).
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageEndState) {
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our special focus tracking page.
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kEndState);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab_contents = browser()->GetSelectedTabContentsWrapper();
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(NULL != tab_contents);
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that nothing has focus.
237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  std::string result;
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(FocusedOnPage(tab_contents->tab_contents(), &result));
239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_STREQ("{nothing focused}", result.c_str());
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for a text that exists within a link on the page.
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab_contents, L"nk",
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End the find session, which should set focus to the link.
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_contents->
249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      find_tab_helper()->StopFinding(FindBarController::kKeepSelection);
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that the link is focused.
25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(FocusedOnPage(tab_contents->tab_contents(), &result));
253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_STREQ("link1", result.c_str());
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for a text that exists within a link on the page.
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab_contents, L"Google",
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move the selection to link 1, after searching.
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      tab_contents->render_view_host(),
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"",
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"window.domAutomationController.send(selectLink1());",
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &result));
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End the find session.
26872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  tab_contents->
269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      find_tab_helper()->StopFinding(FindBarController::kKeepSelection);
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify that link2 is not focused.
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(FocusedOnPage(tab_contents->tab_contents(), &result));
273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  EXPECT_STREQ("", result.c_str());
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test loads a single-frame page and makes sure the ordinal returned makes
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// sense as we FindNext over all the items.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageOrdinal) {
2793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kFrameData);
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'o', which should make the first item active and return
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // '1 in 3' (1st ordinal of a total of 3 matches).
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, ordinal);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Go back one match.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kBack, kIgnoreCase, &ordinal));
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, ordinal);
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should wrap to the top.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should go back to the end.
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, FindInPageWchar(tab, L"o",
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kBack, kIgnoreCase, &ordinal));
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests that the ordinal is correctly adjusted after a selection
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest,
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       SelectChangesOrdinal_Issue20883) {
3183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our test content.
3213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSelectChangesOrdinal);
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for a text that exists within a link on the page.
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(NULL != tab);
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
32872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(4, FindInPageWchar(tab,
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               L"google",
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Move the selection to link 1, after searching.
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string result;
335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString(
33672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      tab->render_view_host(),
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"",
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      L"window.domAutomationController.send(selectLink1());",
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      &result));
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Do a find-next after the selection.  This should move forward
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from there to the 3rd instance of 'google'.
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4, FindInPageWchar(tab,
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               L"google",
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End the find session.
349dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab->find_tab_helper()->StopFinding(FindBarController::kKeepSelection);
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This test loads a page with frames and makes sure the ordinal returned makes
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// sense.
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageMultiFramesOrdinal) {
3553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
3583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kFramePage);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'a', which should make the first item active and return
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // '1 in 7' (1st ordinal of a total of 7 matches).
36372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, ordinal);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4, ordinal);
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Go back one, which should go back one frame.
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kBack, kIgnoreCase, &ordinal));
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(4, ordinal);
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(5, ordinal);
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, ordinal);
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7, ordinal);
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now we should wrap back to frame 1.
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal));
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now we should wrap back to frame last frame.
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7,
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            FindInPageWchar(tab, L"a", kBack, kIgnoreCase, &ordinal));
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(7, ordinal);
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We could get ordinals out of whack when restarting search in subframes.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See http://crbug.com/5132.
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPage_Issue5132) {
4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
4093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kFramePage);
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'goa' three times (6 matches on page).
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
41472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, FindInPageWchar(tab, L"goa",
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, FindInPageWchar(tab, L"goa",
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, ordinal);
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, FindInPageWchar(tab, L"goa",
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Add space to search (should result in no matches).
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"goa ",
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Remove the space, should be back to '3 out of 6')
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(6, FindInPageWchar(tab, L"goa",
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, ordinal);
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Load a page with no selectable text and make sure we don't crash.
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindUnselectableText) {
4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
4393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kUserSelectPage);
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
44372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
44472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1, FindInPageWchar(tab, L"text", kFwd, kIgnoreCase, &ordinal));
44572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1, ordinal);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Try to reproduce the crash seen in issue 1341577.
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindCrash_Issue1341577) {
4503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
4533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kCrashPage);
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This would crash the tab. These must be the first two find requests issued
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // against the frame, otherwise an active frame pointer is set and it wont
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // produce the crash.
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We used to check the return value and |ordinal|. With ICU 4.2, FiP does
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not find a stand-alone dependent vowel sign of Indic scripts. So, the
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exptected values are all 0. To make this test pass regardless of
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ICU version, we just call FiP and see if there's any crash.
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(jungshik): According to a native Malayalam speaker, it's ok not
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to find U+0D4C. Still need to investigate further this issue.
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
46672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageWchar(tab, L"\u0D4C", kFwd, kIgnoreCase, &ordinal);
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageWchar(tab, L"\u0D4C", kFwd, kIgnoreCase, &ordinal);
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should work fine.
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"\u0D24\u0D46",
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"nostring",
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Try to reproduce the crash seen in http://crbug.com/14491, where an assert
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// hits in the BitStack size comparison in WebKit.
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindCrash_Issue14491) {
4823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kBitstackCrash);
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This used to crash the tab.
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
49072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(0, FindInPageWchar(browser()->GetSelectedTabContentsWrapper(),
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               L"s", kFwd, kIgnoreCase, &ordinal));
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test to make sure Find does the right thing when restarting from a timeout.
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We used to have a problem where we'd stop finding matches when all of the
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// following conditions were true:
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1) The page has a lot of text to search.
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 2) The page contains more than one match.
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 3) It takes longer than the time-slice given to each Find operation (100
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    ms) to find one or more of those matches (so Find times out and has to try
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//    again from where it left off).
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindRestarts_Issue1155639) {
5043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our page.
5073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kTooFewMatchesPage);
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This string appears 5 times at the bottom of a long page. If Find restarts
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // properly after a timeout, it will find 5 matches, not just 1.
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
51372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(5, FindInPageWchar(browser()->GetSelectedTabContentsWrapper(),
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               L"008.xml",
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Make sure we don't get into an infinite loop when text box contains very
52072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// large amount of text.
52172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindRestarts_Issue70505) {
52272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ASSERT_TRUE(test_server()->Start());
52372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // First we navigate to our page.
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  GURL url = test_server()->GetURL(kLongTextareaPage);
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui_test_utils::NavigateToURL(browser(), url);
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
52872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // If this test hangs on the FindInPage call, then it might be a regression
52972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // such as the one found in issue http://crbug.com/70505.
53072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int ordinal = 0;
53172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FindInPageWchar(browser()->GetSelectedTabContentsWrapper(),
53272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                  L"a", kFwd, kIgnoreCase, &ordinal);
53372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(1, ordinal);
53472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // TODO(finnur): We cannot reliably get the matchcount for this Find call
53572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // until we fix issue http://crbug.com/71176.
53672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
53772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests bug 11761: FindInPage terminates search prematurely.
5393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// This test is not expected to pass until bug 11761 is fixed.
5403345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(FindInPageControllerTest,
5413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                       DISABLED_FindInPagePrematureEnd) {
5423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our special focus tracking page.
5453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kPrematureEnd);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab_contents = browser()->GetSelectedTabContentsWrapper();
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_TRUE(NULL != tab_contents);
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for a text that exists within a link on the page.
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(2, FindInPageWchar(tab_contents, L"html ",
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindDisappearOnNavigate) {
5593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our special focus tracking page.
5623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
5633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url2 = test_server()->GetURL(kFramePage);
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowFindBar();
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point position;
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool fully_visible = false;
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it is open.
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reload the tab and make sure Find window doesn't go away.
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->Reload(CURRENT_TAB);
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::WaitForNavigationInCurrentTab(browser());
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigate and make sure the Find window goes away.
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url2);
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(fully_visible);
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FindDisappearOnNewTabAndHistory is flaky, at least on Mac.
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See http://crbug.com/43072
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define FindDisappearOnNewTabAndHistory FLAKY_FindDisappearOnNewTabAndHistory
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure Find box disappears when History/Downloads page is opened, and
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// when a New Tab is opened.
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest,
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       FindDisappearOnNewTabAndHistory) {
5993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our special focus tracking page.
6023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowFindBar();
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point position;
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool fully_visible = false;
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it is open.
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open another tab (tab B).
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure Find box is closed.
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(fully_visible);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close tab B.
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseTab();
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure Find window appears again.
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowHistoryTab();
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure Find box is closed.
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(fully_visible);
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure Find box moves out of the way if it is obscuring the active match.
637ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindMovesWhenObscuring) {
6383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kMoveIfOver);
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowFindBar();
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is needed on GTK because the reposition operation is asynchronous.
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MessageLoop::current()->RunAllPending();
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point start_position;
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  gfx::Point position;
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool fully_visible = false;
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure it is open.
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&start_position, &fully_visible));
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'Chromium' which the Find box is obscuring.
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
65872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index = 0;
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (; index < kMoveIterations; ++index) {
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(kMoveIterations, FindInPageWchar(tab, L"Chromium",
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                               kFwd, kIgnoreCase, &ordinal));
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Check the position.
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(fully_visible);
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // If the Find box has moved then we are done.
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (position.x() != start_position.x())
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We should not have reached the end.
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_GT(kMoveIterations, index);
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for something guaranteed not to be obscured by the Find box.
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"Done",
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Check the position.
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible));
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(fully_visible);
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure Find box has moved back to its original location.
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(position.x(), start_position.x());
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FindNextInNewTabUsesPrepopulate times-out, at least on Mac.
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// See http://crbug.com/43070
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define FindNextInNewTabUsesPrepopulate DISABLED_FindNextInNewTabUsesPrepopulate
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure F3 in a new tab works if Find has previous string to search for.
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest,
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       FindNextInNewTabUsesPrepopulate) {
6963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
6993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'no_match'. No matches should be found.
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
70472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, FindInPageWchar(tab, L"no_match",
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open another tab (tab B).
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate what happens when you press F3 for FindNext. We should get a
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // response here (a hang means search was aborted).
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ui_test_utils::FindInPage(tab, string16(),
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         kFwd, kIgnoreCase, &ordinal));
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open another tab (tab C).
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->NewTab();
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate what happens when you press F3 for FindNext. We should get a
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // response here (a hang means search was aborted).
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ui_test_utils::FindInPage(tab, string16(),
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         kFwd, kIgnoreCase, &ordinal));
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, ordinal);
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(TOOLKIT_VIEWS)
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure Find box grabs the Esc accelerator and restores it again.
732ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, AcceleratorRestoring) {
7333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
7363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::FocusManager* focus_manager =
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      views::FocusManager::GetFocusManagerForNativeWindow(
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          browser()->window()->GetNativeHandle());
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See where Escape is registered.
74472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  views::Accelerator escape(ui::VKEY_ESCAPE, false, false, false);
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::AcceleratorTarget* old_target =
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager->GetCurrentTargetForAccelerator(escape);
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(old_target != NULL);
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowFindBar();
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Our Find bar should be the new target.
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  views::AcceleratorTarget* new_target =
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      focus_manager->GetCurrentTargetForAccelerator(escape);
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(new_target != NULL);
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(new_target, old_target);
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The accelerator for Escape should be back to what it was before.
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(old_target,
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            focus_manager->GetCurrentTargetForAccelerator(escape));
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // TOOLKIT_VIEWS
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure Find box does not become UI-inactive when no text is in the box as
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// we switch to a tab contents with an empty find string. See issue 13570.
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, StayActive) {
7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->ShowFindBar();
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate a user clearing the search string. Ideally, we should be
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // simulating keypresses here for searching for something and pressing
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // backspace, but that's been proven flaky in the past, so we go straight to
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tab_contents.
783dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  FindTabHelper* find_tab_helper =
784dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      browser()->GetSelectedTabContentsWrapper()->find_tab_helper();
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stop the (non-existing) find operation, and clear the selection (which
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // signals the UI is still active).
787dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  find_tab_helper->StopFinding(FindBarController::kClearSelection);
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure the Find UI flag hasn't been cleared, it must be so that the UI
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // still responds to browser window resizing.
790dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  ASSERT_TRUE(find_tab_helper->find_ui_active());
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Make sure F3 works after you FindNext a couple of times and end the Find
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// session. See issue http://crbug.com/28306.
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, RestartSearchFromF3) {
7963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to a simple page.
7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimple);
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for 'page'. Should have 1 match.
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
80472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"page", kFwd, kIgnoreCase, &ordinal));
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate what happens when you press F3 for FindNext. Still should show
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one match. This cleared the pre-populate string at one point (see bug).
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ui_test_utils::FindInPage(tab, string16(),
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                         kFwd, kIgnoreCase, &ordinal));
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End the Find session, thereby making the next F3 start afresh.
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate F3 while Find box is closed. Should have 1 match.
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab, L"", kFwd, kIgnoreCase, &ordinal));
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, ordinal);
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// When re-opening the find bar with F3, the find bar should be re-populated
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with the last search from the same tab rather than the last overall search.
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// http://crbug.com/30006
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, PreferPreviousSearch) {
8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimplePage);
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find "Default".
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab1 = browser()->GetSelectedTabContentsWrapper();
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab1, L"Default", kFwd, kIgnoreCase, &ordinal));
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Create a second tab.
839513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // For some reason we can't use AddSelectedTabWithURL here on ChromeOS. It
840513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // could be some delicate assumption about the tab starting off unselected or
841513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // something relating to user gesture.
842513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser::NavigateParams params(browser(), url, PageTransition::TYPED);
843513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  params.disposition = NEW_BACKGROUND_TAB;
844513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  params.tabstrip_add_types = TabStripModel::ADD_NONE;
845513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser::Navigate(&params);
846ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(1, false);
84772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab2 = browser()->GetSelectedTabContentsWrapper();
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1, tab2);
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Find "given".
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageWchar(tab2, L"given", kFwd, kIgnoreCase, &ordinal);
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Switch back to first tab.
854ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(0, false);
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Simulate F3.
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::FindInPage(tab1, string16(), kFwd, kIgnoreCase, &ordinal);
859dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  EXPECT_EQ(tab1->find_tab_helper()->find_text(), WideToUTF16(L"Default"));
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests that whenever you close and reopen the Find bar, it should show
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the last search entered in that tab. http://crbug.com/40121.
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, PrepopulateSameTab) {
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // FindInPage on Mac doesn't use prepopulated values. Search there is global.
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
8733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimple);
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "page".
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
87872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab1 = browser()->GetSelectedTabContentsWrapper();
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab1, L"page", kFwd, kIgnoreCase, &ordinal));
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box.
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
88521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(ASCIIToUTF16("1 of 1"), GetMatchCountText());
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box again.
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // After the Find box has been reopened, it should have been prepopulated with
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the word "page" again.
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
89721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(ASCIIToUTF16("1 of 1"), GetMatchCountText());
898c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
899c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
900c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests that whenever you open Find in a new tab it should prepopulate
901c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with a previous search term (in any tab), if a search has not been issued in
902c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this tab before.
903c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, PrepopulateInNewTab) {
904c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
905c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // FindInPage on Mac doesn't use prepopulated values. Search there is global.
906c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
907c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
908c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
910c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
911c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
9123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimple);
913c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
914c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
915c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "page".
916c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab1 = browser()->GetSelectedTabContentsWrapper();
918c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab1, L"page", kFwd, kIgnoreCase, &ordinal));
91921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(ASCIIToUTF16("1 of 1"), GetMatchCountText());
920c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
921c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now create a second tab and load the same page.
922513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
92372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab2 = browser()->GetSelectedTabContentsWrapper();
924c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1, tab2);
925c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box.
927c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
928c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
929c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The new tab should have "page" prepopulated, since that was the last search
930c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the first tab.
931c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
93221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // But it should not seem like a search has been issued.
93321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_EQ(ASCIIToUTF16(""), GetMatchCountText());
934c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
935c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
936c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This makes sure that we can search for A in tabA, then for B in tabB and
937c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// when we come back to tabA we should still see A (because that was the last
938c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// search in that tab).
939c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, PrepopulatePreserveLast) {
940c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
941c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // FindInPage on Mac doesn't use prepopulated values. Search there is global.
942c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
943c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
944c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
946c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
947c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to any page.
9483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimple);
949c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
950c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
951c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "page".
952c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
95372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab1 = browser()->GetSelectedTabContentsWrapper();
954c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab1, L"page", kFwd, kIgnoreCase, &ordinal));
955c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
956c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box.
957c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
958c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
959c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
960c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
961c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
962c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
963c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
964c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
965c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now create a second tab and load the same page.
966513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser::NavigateParams params(browser(), url, PageTransition::TYPED);
967513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  params.disposition = NEW_BACKGROUND_TAB;
968513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  params.tabstrip_add_types = TabStripModel::ADD_NONE;
969513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser::Navigate(&params);
970ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(1, false);
97172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab2 = browser()->GetSelectedTabContentsWrapper();
972c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1, tab2);
973c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
974c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "text".
975c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageWchar(tab2, L"text", kFwd, kIgnoreCase, &ordinal);
976c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
977c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Go back to the first tab and make sure we have NOT switched the prepopulate
978c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // text to "text".
979ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  browser()->ActivateTabAt(0, false);
980c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
981c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box.
982c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
983c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
984c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // After the Find box has been reopened, it should have been prepopulated with
985c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the word "page" again, since that was the last search in that tab.
986c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
987c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
988c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
989c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
990c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
991c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
992c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Re-open the Find box.
993c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is a special case: previous search in TabContents used to get cleared
994c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if you opened and closed the FindBox, which would cause the global
995c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // prepopulate value to show instead of last search in this tab.
996c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpen();
997c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
998c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // After the Find box has been reopened, it should have been prepopulated with
999c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the word "page" again, since that was the last search in that tab.
1000c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarText());
1001c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1002c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1003c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TODO(rohitrao): Searching in incognito tabs does not work in browser tests in
100421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Linux views.  Investigate and fix.  http://crbug.com/40948
1005c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_LINUX) && defined(TOOLKIT_VIEWS)
1006c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_NoIncognitoPrepopulate DISABLED_NoIncognitoPrepopulate
1007c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else
1008c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define MAYBE_NoIncognitoPrepopulate NoIncognitoPrepopulate
1009c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
1010c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1011c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This tests that search terms entered into an incognito find bar are not used
1012c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// as prepopulate terms for non-incognito windows.
1013c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, MAYBE_NoIncognitoPrepopulate) {
1014c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_MACOSX)
1015c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // FindInPage on Mac doesn't use prepopulated values. Search there is global.
1016c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  return;
1017c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
1018c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
10193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
1020c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1021c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to the "simple" test page.
10223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kSimple);
1023c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1024c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1025c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "page" in the normal browser tab.
1026c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
102772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab1 = browser()->GetSelectedTabContentsWrapper();
1028c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(tab1, L"page", kFwd, kIgnoreCase, &ordinal));
1029c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1030c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box.
1031c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpenForBrowser(browser());
1032c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarTextForBrowser(browser()));
1033c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1034c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
1035c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->GetFindBarController()->EndFindSession(
1036c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
1037c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1038c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open a new incognito window and navigate to the same page.
1039c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* incognito_profile = browser()->profile()->GetOffTheRecordProfile();
1040c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Browser* incognito_browser = Browser::Create(incognito_profile);
1041513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  incognito_browser->AddSelectedTabWithURL(url, PageTransition::START_PAGE);
1042c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::WaitForNavigation(
1043c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &incognito_browser->GetSelectedTabContents()->controller());
1044c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  incognito_browser->window()->Show();
1045c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1046c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the find box and make sure that it is prepopulated with "page".
1047c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpenForBrowser(incognito_browser);
1048c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarTextForBrowser(incognito_browser));
1049c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1050c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Search for the word "text" in the incognito tab.
105172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* incognito_tab =
105272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      incognito_browser->GetSelectedTabContentsWrapper();
1053c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, FindInPageWchar(incognito_tab, L"text",
1054c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               kFwd, kIgnoreCase, &ordinal));
1055c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("text"), GetFindBarTextForBrowser(incognito_browser));
1056c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1057c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Close the Find box.
1058c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  incognito_browser->GetFindBarController()->EndFindSession(
1059c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      FindBarController::kKeepSelection);
1060c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1061c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Now open a new tab in the original (non-incognito) browser.
1062513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->AddSelectedTabWithURL(url, PageTransition::TYPED);
106372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab2 = browser()->GetSelectedTabContentsWrapper();
1064c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NE(tab1, tab2);
1065c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1066c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Open the Find box and make sure it is prepopulated with the search term
1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from the original browser, not the search term from the incognito window.
1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EnsureFindBoxOpenForBrowser(browser());
1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ASCIIToUTF16("page"), GetFindBarTextForBrowser(browser()));
1070c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This makes sure that dismissing the find bar with kActivateSelection works.
10733345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(FindInPageControllerTest, ActivateLinkNavigatesPage) {
10743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ASSERT_TRUE(test_server()->Start());
1075c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1076c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // First we navigate to our test content.
10773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GURL url = test_server()->GetURL(kLinkPage);
1078c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::NavigateToURL(browser(), url);
1079c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TabContentsWrapper* tab = browser()->GetSelectedTabContentsWrapper();
1081c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int ordinal = 0;
1082c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FindInPageWchar(tab, L"link", kFwd, kIgnoreCase, &ordinal);
1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(ordinal, 1);
1084c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // End the find session, click on the link.
1086dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  tab->find_tab_helper()->StopFinding(FindBarController::kActivateSelection);
1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser()));
1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1089