1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/process_util.h" 6 #include "base/string_util.h" 7 #include "base/utf_string_conversions.h" 8 #include "chrome/browser/tabs/tab_strip_model.h" 9 #include "chrome/browser/ui/browser.h" 10 #include "chrome/browser/ui/find_bar/find_bar_controller.h" 11 #include "chrome/browser/ui/view_ids.h" 12 #include "chrome/browser/ui/views/find_bar_host.h" 13 #include "chrome/browser/ui/views/frame/browser_view.h" 14 #include "chrome/test/in_process_browser_test.h" 15 #include "chrome/test/ui_test_utils.h" 16 #include "content/browser/tab_contents/tab_contents.h" 17 #include "net/test/test_server.h" 18 #include "ui/base/keycodes/keyboard_codes.h" 19 #include "views/focus/focus_manager.h" 20 #include "views/view.h" 21 22 namespace { 23 24 // The delay waited after sending an OS simulated event. 25 static const int kActionDelayMs = 500; 26 static const char kSimplePage[] = "files/find_in_page/simple.html"; 27 28 void Checkpoint(const char* message, const base::TimeTicks& start_time) { 29 LOG(INFO) << message << " : " 30 << (base::TimeTicks::Now() - start_time).InMilliseconds() 31 << " ms" << std::flush; 32 } 33 34 class FindInPageTest : public InProcessBrowserTest { 35 public: 36 FindInPageTest() { 37 set_show_window(true); 38 FindBarHost::disable_animations_during_testing_ = true; 39 } 40 41 string16 GetFindBarText() { 42 FindBarTesting* find_bar = 43 browser()->GetFindBarController()->find_bar()->GetFindBarTesting(); 44 return find_bar->GetFindText(); 45 } 46 }; 47 48 } // namespace 49 50 IN_PROC_BROWSER_TEST_F(FindInPageTest, CrashEscHandlers) { 51 ASSERT_TRUE(test_server()->Start()); 52 53 // First we navigate to our test page (tab A). 54 GURL url = test_server()->GetURL(kSimplePage); 55 ui_test_utils::NavigateToURL(browser(), url); 56 57 browser()->Find(); 58 59 // Open another tab (tab B). 60 browser()->AddSelectedTabWithURL(url, PageTransition::TYPED); 61 62 browser()->Find(); 63 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 64 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 65 66 // Select tab A. 67 browser()->ActivateTabAt(0, true); 68 69 // Close tab B. 70 browser()->CloseTabContents(browser()->GetTabContentsAt(1)); 71 72 // Click on the location bar so that Find box loses focus. 73 ASSERT_NO_FATAL_FAILURE(ui_test_utils::ClickOnView(browser(), 74 VIEW_ID_LOCATION_BAR)); 75 #if defined(TOOLKIT_VIEWS) || defined(OS_WIN) 76 // Check the location bar is focused. 77 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 78 #endif 79 80 // This used to crash until bug 1303709 was fixed. 81 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 82 browser(), ui::VKEY_ESCAPE, false, false, false, false)); 83 } 84 85 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestore) { 86 ASSERT_TRUE(test_server()->Start()); 87 88 GURL url = test_server()->GetURL("title1.html"); 89 ui_test_utils::NavigateToURL(browser(), url); 90 91 // Focus the location bar, open and close the find-in-page, focus should 92 // return to the location bar. 93 browser()->FocusLocationBar(); 94 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 95 // Ensure the creation of the find bar controller. 96 browser()->GetFindBarController()->Show(); 97 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 98 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 99 browser()->GetFindBarController()->EndFindSession( 100 FindBarController::kKeepSelection); 101 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 102 103 // Focus the location bar, find something on the page, close the find box, 104 // focus should go to the page. 105 browser()->FocusLocationBar(); 106 browser()->Find(); 107 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 108 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 109 ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(), 110 ASCIIToUTF16("a"), true, false, NULL); 111 browser()->GetFindBarController()->EndFindSession( 112 FindBarController::kKeepSelection); 113 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 114 VIEW_ID_TAB_CONTAINER_FOCUS_VIEW)); 115 116 // Focus the location bar, open and close the find box, focus should return to 117 // the location bar (same as before, just checking that http://crbug.com/23599 118 // is fixed). 119 browser()->FocusLocationBar(); 120 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 121 browser()->GetFindBarController()->Show(); 122 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 123 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 124 browser()->GetFindBarController()->EndFindSession( 125 FindBarController::kKeepSelection); 126 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 127 } 128 129 IN_PROC_BROWSER_TEST_F(FindInPageTest, FocusRestoreOnTabSwitch) { 130 ASSERT_TRUE(test_server()->Start()); 131 132 // First we navigate to our test page (tab A). 133 GURL url = test_server()->GetURL(kSimplePage); 134 ui_test_utils::NavigateToURL(browser(), url); 135 136 browser()->Find(); 137 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 138 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 139 140 FindBarTesting* find_bar = 141 browser()->GetFindBarController()->find_bar()->GetFindBarTesting(); 142 143 // Search for 'a'. 144 ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(), 145 ASCIIToUTF16("a"), true, false, NULL); 146 EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText()); 147 148 // Open another tab (tab B). 149 browser()->AddSelectedTabWithURL(url, PageTransition::TYPED); 150 ASSERT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser())); 151 152 // Make sure Find box is open. 153 browser()->Find(); 154 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 155 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 156 157 // Search for 'b'. 158 ui_test_utils::FindInPage(browser()->GetSelectedTabContentsWrapper(), 159 ASCIIToUTF16("b"), true, false, NULL); 160 EXPECT_TRUE(ASCIIToUTF16("b") == find_bar->GetFindSelectedText()); 161 162 // Set focus away from the Find bar (to the Location bar). 163 browser()->FocusLocationBar(); 164 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 165 166 // Select tab A. Find bar should get focus. 167 browser()->ActivateTabAt(0, true); 168 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), 169 VIEW_ID_FIND_IN_PAGE_TEXT_FIELD)); 170 EXPECT_TRUE(ASCIIToUTF16("a") == find_bar->GetFindSelectedText()); 171 172 // Select tab B. Location bar should get focus. 173 browser()->ActivateTabAt(1, true); 174 EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_LOCATION_BAR)); 175 } 176 177 // This tests that whenever you clear values from the Find box and close it that 178 // it respects that and doesn't show you the last search, as reported in bug: 179 // http://crbug.com/40121. 180 IN_PROC_BROWSER_TEST_F(FindInPageTest, PrepopulateRespectBlank) { 181 #if defined(OS_MACOSX) 182 // FindInPage on Mac doesn't use prepopulated values. Search there is global. 183 return; 184 #endif 185 base::TimeTicks start_time = base::TimeTicks::Now(); 186 Checkpoint("Test starting", start_time); 187 188 ASSERT_TRUE(test_server()->Start()); 189 190 // Make sure Chrome is in the foreground, otherwise sending input 191 // won't do anything and the test will hang. 192 ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 193 194 Checkpoint("Navigate", start_time); 195 196 // First we navigate to any page. 197 GURL url = test_server()->GetURL(kSimplePage); 198 ui_test_utils::NavigateToURL(browser(), url); 199 200 Checkpoint("Show Find bar", start_time); 201 202 // Show the Find bar. 203 browser()->GetFindBarController()->Show(); 204 205 Checkpoint("Search for 'a'", start_time); 206 207 // Search for "a". 208 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 209 browser(), ui::VKEY_A, false, false, false, false)); 210 211 // We should find "a" here. 212 EXPECT_EQ(ASCIIToUTF16("a"), GetFindBarText()); 213 214 Checkpoint("Delete 'a'", start_time); 215 216 // Delete "a". 217 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 218 browser(), ui::VKEY_BACK, false, false, false, false)); 219 220 // Validate we have cleared the text. 221 EXPECT_EQ(string16(), GetFindBarText()); 222 223 Checkpoint("Close find bar", start_time); 224 225 // Close the Find box. 226 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 227 browser(), ui::VKEY_ESCAPE, false, false, false, false)); 228 229 Checkpoint("Show Find bar", start_time); 230 231 // Show the Find bar. 232 browser()->GetFindBarController()->Show(); 233 234 Checkpoint("Validate text", start_time); 235 236 // After the Find box has been reopened, it should not have been prepopulated 237 // with "a" again. 238 EXPECT_EQ(string16(), GetFindBarText()); 239 240 Checkpoint("Close Find bar", start_time); 241 242 // Close the Find box. 243 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 244 browser(), ui::VKEY_ESCAPE, false, false, false, false)); 245 246 Checkpoint("FindNext", start_time); 247 248 // Press F3 to trigger FindNext. 249 ASSERT_TRUE(ui_test_utils::SendKeyPressSync( 250 browser(), ui::VKEY_F3, false, false, false, false)); 251 252 Checkpoint("Validate", start_time); 253 254 // After the Find box has been reopened, it should still have no prepopulate 255 // value. 256 EXPECT_EQ(string16(), GetFindBarText()); 257 258 Checkpoint("Test done", start_time); 259 } 260