diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 18:19:00 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-11 18:19:00 +0000 |
commit | 5bc8fe91607f20f2d43dc461ca188dd07b55d435 (patch) | |
tree | ca6551f9d816757942485ee7d3542c5aeb4d2fed /chrome/browser/find_bar_host_browsertest.cc | |
parent | 3148c0ae4462e01f4b830b8d2150dcd7fee2cb3b (diff) | |
download | chromium_src-5bc8fe91607f20f2d43dc461ca188dd07b55d435.zip chromium_src-5bc8fe91607f20f2d43dc461ca188dd07b55d435.tar.gz chromium_src-5bc8fe91607f20f2d43dc461ca188dd07b55d435.tar.bz2 |
Allow users to close the find session and activate the current link via ctrl-enter.
this only hooks up ctrl-enter on gtk for now, but adding it on windows/mac should be trivial
webkit side, which needs to land first, is here:
https://bugs.webkit.org/show_bug.cgi?id=35407
This also enables the FindInPageControllerTest tests on linux/gtk.
BUG=29500
TEST=FindInPageControllerTest.ActivateLinkNavigatesPage
Review URL: http://codereview.chromium.org/660137
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@41291 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/find_bar_host_browsertest.cc')
-rw-r--r-- | chrome/browser/find_bar_host_browsertest.cc | 845 |
1 files changed, 845 insertions, 0 deletions
diff --git a/chrome/browser/find_bar_host_browsertest.cc b/chrome/browser/find_bar_host_browsertest.cc new file mode 100644 index 0000000..81f322c --- /dev/null +++ b/chrome/browser/find_bar_host_browsertest.cc @@ -0,0 +1,845 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/keyboard_codes.h" +#include "base/message_loop.h" +#include "chrome/browser/browser.h" +#include "chrome/browser/browser_window.h" +#include "chrome/browser/find_bar_controller.h" +#include "chrome/browser/find_notification_details.h" +#include "chrome/browser/renderer_host/render_view_host.h" +#include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/tab_contents/tab_contents_view.h" +#include "chrome/browser/views/find_bar_host.h" +#include "chrome/common/notification_service.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" + +#if defined(TOOLKIT_VIEWS) +#include "views/focus/focus_manager.h" +#endif + +// http://crbug.com/37809 +#if defined(OS_LINUX) && defined(TOOLKIT_GTK) +#define FindDisappearOnNavigate DISABLED_FindDisappearOnNavigate +#define FindDisappearOnNewTabAndHistory \ + DISABLED_FindDisappearOnNewTabAndHistory +#define FindMovesWhenObscuring DISABLED_FindMovesWhenObscuring +#endif + +const std::wstring kSimplePage = L"404_is_enough_for_us.html"; +const std::wstring kFramePage = L"files/find_in_page/frames.html"; +const std::wstring kFrameData = L"files/find_in_page/framedata_general.html"; +const std::wstring kUserSelectPage = L"files/find_in_page/user-select.html"; +const std::wstring kCrashPage = L"files/find_in_page/crash_1341577.html"; +const std::wstring kTooFewMatchesPage = L"files/find_in_page/bug_1155639.html"; +const std::wstring kEndState = L"files/find_in_page/end_state.html"; +const std::wstring kPrematureEnd = L"files/find_in_page/premature_end.html"; +const std::wstring kMoveIfOver = L"files/find_in_page/move_if_obscuring.html"; +const std::wstring kBitstackCrash = L"files/find_in_page/crash_14491.html"; +const std::wstring kSelectChangesOrdinal = + L"files/find_in_page/select_changes_ordinal.html"; +const std::wstring kSimple = L"files/find_in_page/simple.html"; +const std::wstring kLinkPage = L"files/find_in_page/link.html"; + +const bool kBack = false; +const bool kFwd = true; + +const bool kIgnoreCase = false; +const bool kCaseSensitive = true; + +const int kMoveIterations = 30; + +class FindInPageControllerTest : public InProcessBrowserTest { + public: + FindInPageControllerTest() { + EnableDOMAutomation(); + } + + protected: + bool GetFindBarWindowInfo(gfx::Point* position, bool* fully_visible) { + FindBarTesting* find_bar = + browser()->GetFindBarController()->find_bar()->GetFindBarTesting(); + return find_bar->GetFindBarWindowInfo(position, fully_visible); + } +}; + +// Platform independent FindInPage that takes |const wchar_t*| +// as an input. +int FindInPageWchar(TabContents* tab, + const wchar_t* search_str, + bool forward, + bool case_sensitive, + int* ordinal) { + return ui_test_utils::FindInPage( + tab, WideToUTF16(std::wstring(search_str)), + forward, case_sensitive, ordinal); +} + +// This test loads a page with frames and starts FindInPage requests. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageFrames) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our frames page. + GURL url = server->TestServerPageW(kFramePage); + ui_test_utils::NavigateToURL(browser(), url); + + // Try incremental search (mimicking user typing in). + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + EXPECT_EQ(18, FindInPageWchar(tab, L"g", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(11, FindInPageWchar(tab, L"go", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(04, FindInPageWchar(tab, L"goo", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(03, FindInPageWchar(tab, L"goog", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(02, FindInPageWchar(tab, L"googl", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(01, FindInPageWchar(tab, L"google", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(00, FindInPageWchar(tab, L"google!", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); + + // Negative test (no matches should be found). + EXPECT_EQ(0, FindInPageWchar(tab, L"Non-existing string", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); + + // 'horse' only exists in the three right frames. + EXPECT_EQ(3, FindInPageWchar(tab, L"horse", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // 'cat' only exists in the first frame. + EXPECT_EQ(1, FindInPageWchar(tab, L"cat", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Try searching again, should still come up with 1 match. + EXPECT_EQ(1, FindInPageWchar(tab, L"cat", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Try searching backwards, ignoring case, should still come up with 1 match. + EXPECT_EQ(1, FindInPageWchar(tab, L"CAT", + kBack, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Try case sensitive, should NOT find it. + EXPECT_EQ(0, FindInPageWchar(tab, L"CAT", + kFwd, kCaseSensitive, &ordinal)); + EXPECT_EQ(0, ordinal); + + // Try again case sensitive, but this time with right case. + EXPECT_EQ(1, FindInPageWchar(tab, L"dog", + kFwd, kCaseSensitive, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Try non-Latin characters ('Hreggvidur' with 'eth' for 'd' in left frame). + EXPECT_EQ(1, FindInPageWchar(tab, L"Hreggvi\u00F0ur", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(1, FindInPageWchar(tab, L"Hreggvi\u00F0ur", + kFwd, kCaseSensitive, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(0, FindInPageWchar(tab, L"hreggvi\u00F0ur", + kFwd, kCaseSensitive, &ordinal)); + EXPECT_EQ(0, ordinal); +} + +std::string FocusedOnPage(TabContents* tab_contents) { + std::string result; + ui_test_utils::ExecuteJavaScriptAndExtractString( + tab_contents->render_view_host(), + L"", + L"window.domAutomationController.send(getFocusedElement());", + &result); + return result; +} + +// This tests the FindInPage end-state, in other words: what is focused when you +// close the Find box (ie. if you find within a link the link should be +// focused). +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageEndState) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our special focus tracking page. + GURL url = server->TestServerPageW(kEndState); + ui_test_utils::NavigateToURL(browser(), url); + + TabContents* tab_contents = browser()->GetSelectedTabContents(); + ASSERT_TRUE(NULL != tab_contents); + + // Verify that nothing has focus. + ASSERT_STREQ("{nothing focused}", FocusedOnPage(tab_contents).c_str()); + + // Search for a text that exists within a link on the page. + int ordinal = 0; + EXPECT_EQ(1, FindInPageWchar(tab_contents, L"nk", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // End the find session, which should set focus to the link. + tab_contents->StopFinding(FindBarController::kKeepSelection); + + // Verify that the link is focused. + EXPECT_STREQ("link1", FocusedOnPage(tab_contents).c_str()); + + // Search for a text that exists within a link on the page. + EXPECT_EQ(1, FindInPageWchar(tab_contents, L"Google", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Move the selection to link 1, after searching. + std::string result; + ui_test_utils::ExecuteJavaScriptAndExtractString( + tab_contents->render_view_host(), + L"", + L"window.domAutomationController.send(selectLink1());", + &result); + + // End the find session. + tab_contents->StopFinding(FindBarController::kKeepSelection); + + // Verify that link2 is not focused. + EXPECT_STREQ("", FocusedOnPage(tab_contents).c_str()); +} + +// This test loads a single-frame page and makes sure the ordinal returned makes +// sense as we FindNext over all the items. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageOrdinal) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kFrameData); + ui_test_utils::NavigateToURL(browser(), url); + + // Search for 'o', which should make the first item active and return + // '1 in 3' (1st ordinal of a total of 3 matches). + TabContents* tab = browser()->GetSelectedTabContents(); + int ordinal = 0; + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(2, ordinal); + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + // Go back one match. + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kBack, kIgnoreCase, &ordinal)); + EXPECT_EQ(2, ordinal); + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + // This should wrap to the top. + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + // This should go back to the end. + EXPECT_EQ(3, FindInPageWchar(tab, L"o", + kBack, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); +} + +// This tests that the ordinal is correctly adjusted after a selection +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, + SelectChangesOrdinal_Issue20883) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our test content. + GURL url = server->TestServerPageW(kSelectChangesOrdinal); + ui_test_utils::NavigateToURL(browser(), url); + + TabContents* tab_contents = browser()->GetSelectedTabContents(); + ASSERT_TRUE(NULL != tab_contents); + + // Search for a text that exists within a link on the page. + TabContents* tab = browser()->GetSelectedTabContents(); + int ordinal = 0; + EXPECT_EQ(4, FindInPageWchar(tab_contents, + L"google", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Move the selection to link 1, after searching. + std::string result; + ui_test_utils::ExecuteJavaScriptAndExtractString( + tab_contents->render_view_host(), + L"", + L"window.domAutomationController.send(selectLink1());", + &result); + + // Do a find-next after the selection. This should move forward + // from there to the 3rd instance of 'google'. + EXPECT_EQ(4, FindInPageWchar(tab, + L"google", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + + // End the find session. + tab_contents->StopFinding(FindBarController::kKeepSelection); +} + +// This test loads a page with frames and makes sure the ordinal returned makes +// sense. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPageMultiFramesOrdinal) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kFramePage); + ui_test_utils::NavigateToURL(browser(), url); + + // Search for 'a', which should make the first item active and return + // '1 in 7' (1st ordinal of a total of 7 matches). + TabContents* tab = browser()->GetSelectedTabContents(); + int ordinal = 0; + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(2, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(4, ordinal); + // Go back one, which should go back one frame. + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kBack, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(4, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(5, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(6, ordinal); + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(7, ordinal); + // Now we should wrap back to frame 1. + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + // Now we should wrap back to frame last frame. + EXPECT_EQ(7, + FindInPageWchar(tab, L"a", kBack, kIgnoreCase, &ordinal)); + EXPECT_EQ(7, ordinal); +} + +// We could get ordinals out of whack when restarting search in subframes. +// See http://crbug.com/5132. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindInPage_Issue5132) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kFramePage); + ui_test_utils::NavigateToURL(browser(), url); + + // Search for 'goa' three times (6 matches on page). + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + EXPECT_EQ(6, FindInPageWchar(tab, L"goa", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(6, FindInPageWchar(tab, L"goa", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(2, ordinal); + EXPECT_EQ(6, FindInPageWchar(tab, L"goa", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); + // Add space to search (should result in no matches). + EXPECT_EQ(0, FindInPageWchar(tab, L"goa ", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); + // Remove the space, should be back to '3 out of 6') + EXPECT_EQ(6, FindInPageWchar(tab, L"goa", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(3, ordinal); +} + +// Load a page with no selectable text and make sure we don't crash. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindUnSelectableText) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kUserSelectPage); + ui_test_utils::NavigateToURL(browser(), url); + + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + EXPECT_EQ(0, FindInPageWchar(tab, L"text", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(-1, ordinal); // Nothing is selected. + EXPECT_EQ(0, FindInPageWchar(tab, L"Non-existing string", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); +} + +// Try to reproduce the crash seen in issue 1341577. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindCrash_Issue1341577) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kCrashPage); + ui_test_utils::NavigateToURL(browser(), url); + + // This would crash the tab. These must be the first two find requests issued + // against the frame, otherwise an active frame pointer is set and it wont + // produce the crash. + // We used to check the return value and |ordinal|. With ICU 4.2, FiP does + // not find a stand-alone dependent vowel sign of Indic scripts. So, the + // exptected values are all 0. To make this test pass regardless of + // ICU version, we just call FiP and see if there's any crash. + // TODO(jungshik): According to a native Malayalam speaker, it's ok not + // to find U+0D4C. Still need to investigate further this issue. + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + FindInPageWchar(tab, L"\u0D4C", kFwd, kIgnoreCase, &ordinal); + FindInPageWchar(tab, L"\u0D4C", kFwd, kIgnoreCase, &ordinal); + + // This should work fine. + EXPECT_EQ(1, FindInPageWchar(tab, L"\u0D24\u0D46", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + EXPECT_EQ(0, FindInPageWchar(tab, L"nostring", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); +} + +// Try to reproduce the crash seen in http://crbug.com/14491, where an assert +// hits in the BitStack size comparison in WebKit. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindCrash_Issue14491) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kBitstackCrash); + ui_test_utils::NavigateToURL(browser(), url); + + // This used to crash the tab. + int ordinal = 0; + EXPECT_EQ(0, FindInPageWchar(browser()->GetSelectedTabContents(), + L"s", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); +} + +// Test to make sure Find does the right thing when restarting from a timeout. +// We used to have a problem where we'd stop finding matches when all of the +// following conditions were true: +// 1) The page has a lot of text to search. +// 2) The page contains more than one match. +// 3) It takes longer than the time-slice given to each Find operation (100 +// ms) to find one or more of those matches (so Find times out and has to try +// again from where it left off). +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindRestarts_Issue1155639) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our page. + GURL url = server->TestServerPageW(kTooFewMatchesPage); + ui_test_utils::NavigateToURL(browser(), url); + + // This string appears 5 times at the bottom of a long page. If Find restarts + // properly after a timeout, it will find 5 matches, not just 1. + int ordinal = 0; + EXPECT_EQ(5, FindInPageWchar(browser()->GetSelectedTabContents(), + L"008.xml", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); +} + +// This tests bug 11761: FindInPage terminates search prematurely. +// This test will be enabled once the bug is fixed. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, + DISABLED_FindInPagePrematureEnd) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our special focus tracking page. + GURL url = server->TestServerPageW(kPrematureEnd); + ui_test_utils::NavigateToURL(browser(), url); + + TabContents* tab_contents = browser()->GetSelectedTabContents(); + ASSERT_TRUE(NULL != tab_contents); + + // Search for a text that exists within a link on the page. + int ordinal = 0; + EXPECT_EQ(2, FindInPageWchar(tab_contents, L"html ", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); +} + +// Make sure Find box disappears on Navigate but not on Refresh. +#if defined(OS_LINUX) && defined(TOOLKIT_VIEWS) +// The last EXPECT_FALSE(fully_visible) is failing all the time on +// the linux_views bot. See bug: http://crbug.com/28629. +#define FindDisappearOnNavigate DISABLED_FindDisappearOnNavigate +#endif +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindDisappearOnNavigate) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our special focus tracking page. + GURL url = server->TestServerPageW(kSimplePage); + GURL url2 = server->TestServerPageW(kFramePage); + ui_test_utils::NavigateToURL(browser(), url); + +#if defined(TOOLKIT_VIEWS) + // Open the Find window with animations disabled. + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + browser()->ShowFindBar(); + + gfx::Point position; + bool fully_visible = false; + + // Make sure it is open. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // Reload the tab and make sure Find window doesn't go away. + browser()->Reload(); + + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // Navigate and make sure the Find window goes away. + ui_test_utils::NavigateToURL(browser(), url2); + + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_FALSE(fully_visible); +} + +// Make sure Find box disappears when History/Downloads page is opened, and +// when a New Tab is opened. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, + FindDisappearOnNewTabAndHistory) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to our special focus tracking page. + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); + +#if defined(TOOLKIT_VIEWS) + // Open the Find window with animations disabled. + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + browser()->ShowFindBar(); + + gfx::Point position; + bool fully_visible = false; + + // Make sure it is open. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // Open another tab (tab B). + browser()->NewTab(); + ui_test_utils::NavigateToURL(browser(), url); + + // Make sure Find box is closed. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_FALSE(fully_visible); + + // Close tab B. + browser()->CloseTab(); + + // Make sure Find window appears again. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + browser()->ShowHistoryTab(); + + // Make sure Find box is closed. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_FALSE(fully_visible); +} + +// Make sure Find box moves out of the way if it is obscuring the active match. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, FindMovesWhenObscuring) { + HTTPTestServer* server = StartHTTPServer(); + + GURL url = server->TestServerPageW(kMoveIfOver); + ui_test_utils::NavigateToURL(browser(), url); + +#if defined(TOOLKIT_VIEWS) + // Open the Find window with animations disabled. + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + browser()->ShowFindBar(); + + gfx::Point start_position; + gfx::Point position; + bool fully_visible = false; + + // Make sure it is open. + EXPECT_TRUE(GetFindBarWindowInfo(&start_position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // Search for 'Chromium' which the Find box is obscuring. + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + int index = 0; + for (; index < kMoveIterations; ++index) { + EXPECT_EQ(kMoveIterations, FindInPageWchar(tab, L"Chromium", + kFwd, kIgnoreCase, &ordinal)); + + // Check the position. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // If the Find box has moved then we are done. + if (position.x() != start_position.x()) + break; + } + + // We should not have reached the end. + ASSERT_GT(kMoveIterations, index); + + // Search for something guaranteed not to be obscured by the Find box. + EXPECT_EQ(1, FindInPageWchar(tab, L"Done", + kFwd, kIgnoreCase, &ordinal)); + // Check the position. + EXPECT_TRUE(GetFindBarWindowInfo(&position, &fully_visible)); + EXPECT_TRUE(fully_visible); + + // Make sure Find box has moved back to its original location. + EXPECT_EQ(position.x(), start_position.x()); +} + +// Make sure F3 in a new tab works if Find has previous string to search for. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, + FindNextInNewTabUsesPrepopulate) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to any page. + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); + + // Search for 'no_match'. No matches should be found. + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + EXPECT_EQ(0, FindInPageWchar(tab, L"no_match", + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); + + // Open another tab (tab B). + browser()->NewTab(); + ui_test_utils::NavigateToURL(browser(), url); + + // Simulate what happens when you press F3 for FindNext. We should get a + // response here (a hang means search was aborted). + EXPECT_EQ(0, ui_test_utils::FindInPage(tab, string16(), + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); + + // Open another tab (tab C). + browser()->NewTab(); + ui_test_utils::NavigateToURL(browser(), url); + + // Simulate what happens when you press F3 for FindNext. We should get a + // response here (a hang means search was aborted). + EXPECT_EQ(0, ui_test_utils::FindInPage(tab, string16(), + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(0, ordinal); +} + +#if defined(TOOLKIT_VIEWS) +// Make sure Find box grabs the Esc accelerator and restores it again. +#if defined(OS_LINUX) +// TODO(oshima): On Gtk/Linux, a focus out event is asynchronous and +// hiding a find bar does not immediately update the target +// accelerator. The last condition fails in most cases due to this +// behavior. See http://crbug.com/26870. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, + DISABLED_AcceleratorRestoring) { +#else + IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, AcceleratorRestoring) { +#endif + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to any page. + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); + +#if defined(OS_WIN) + // TODO(oshima): Windows code assumes that NativeView is + // assignable from NativeWindow, which is not true on other platforms. + // This has to be fixed, probably by having explicit + // GetNativeView / GetNativewWindow methods on BrowserWindow. + // See http://crbug.com/26873. + gfx::NativeView browser_view = browser()->window()->GetNativeHandle(); +#elif defined(OS_LINUX) + gfx::NativeView browser_view = + GTK_WIDGET(browser()->window()->GetNativeHandle()); +#else + // Mac does not use views. + NOTREACHED(); +#endif + + views::FocusManager* focus_manager = + views::FocusManager::GetFocusManagerForNativeView(browser_view); + + // See where Escape is registered. + views::Accelerator escape(base::VKEY_ESCAPE, false, false, false); + views::AcceleratorTarget* old_target = + focus_manager->GetCurrentTargetForAccelerator(escape); + EXPECT_TRUE(old_target != NULL); + +#if defined(TOOLKIT_VIEWS) + // Open the Find window with animations disabled. + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + browser()->ShowFindBar(); + + // Our Find bar should be the new target. + views::AcceleratorTarget* new_target = + focus_manager->GetCurrentTargetForAccelerator(escape); + + EXPECT_TRUE(new_target != NULL); + EXPECT_NE(new_target, old_target); + + // Close the Find box. + browser()->GetFindBarController()->EndFindSession( + FindBarController::kKeepSelection); + + // The accelerator for Escape should be back to what it was before. + EXPECT_EQ(old_target, + focus_manager->GetCurrentTargetForAccelerator(escape)); +} +#endif // TOOLKIT_VIEWS + +// Make sure Find box does not become UI-inactive when no text is in the box as +// we switch to a tab contents with an empty find string. See issue 13570. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, StayActive) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to any page. + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); + +#if defined(TOOLKIT_VIEWS) + // Open the Find window with animations disabled. + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + browser()->ShowFindBar(); + + // Simulate a user clearing the search string. Ideally, we should be + // simulating keypresses here for searching for something and pressing + // backspace, but that's been proven flaky in the past, so we go straight to + // tab_contents. + TabContents* tab_contents = browser()->GetSelectedTabContents(); + // Stop the (non-existing) find operation, and clear the selection (which + // signals the UI is still active). + tab_contents->StopFinding(FindBarController::kClearSelection); + // Make sure the Find UI flag hasn't been cleared, it must be so that the UI + // still responds to browser window resizing. + ASSERT_TRUE(tab_contents->find_ui_active()); +} + +// Make sure F3 works after you FindNext a couple of times and end the Find +// session. See issue http://crbug.com/28306. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, RestartSearchFromF3) { + HTTPTestServer* server = StartHTTPServer(); + + // First we navigate to a simple page. + GURL url = server->TestServerPageW(kSimple); + ui_test_utils::NavigateToURL(browser(), url); + + // Search for 'page'. Should have 1 match. + int ordinal = 0; + TabContents* tab = browser()->GetSelectedTabContents(); + EXPECT_EQ(1, FindInPageWchar(tab, L"page", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // Simulate what happens when you press F3 for FindNext. Still should show + // one match. This cleared the pre-populate string at one point (see bug). + EXPECT_EQ(1, ui_test_utils::FindInPage(tab, string16(), + kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); + + // End the Find session, thereby making the next F3 start afresh. + browser()->GetFindBarController()->EndFindSession( + FindBarController::kKeepSelection); + + // Simulate F3 while Find box is closed. Should have 1 match. + EXPECT_EQ(1, FindInPageWchar(tab, L"", kFwd, kIgnoreCase, &ordinal)); + EXPECT_EQ(1, ordinal); +} + +// When re-opening the find bar with F3, the find bar should be re-populated +// with the last search from the same tab rather than the last overall search. +// http://crbug.com/30006 +#if defined(OS_CHROMEOS) +#define PreferPreviousSearch FLAKY_PreferPreviousSearch +#endif +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, PreferPreviousSearch) { + HTTPTestServer* server = StartHTTPServer(); + +#if defined(TOOLKIT_VIEWS) + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + + // First we navigate to any page. + GURL url = server->TestServerPageW(kSimplePage); + ui_test_utils::NavigateToURL(browser(), url); + + // Find "Default". + int ordinal = 0; + TabContents* tab1 = browser()->GetSelectedTabContents(); + EXPECT_EQ(1, FindInPageWchar(tab1, L"Default", kFwd, kIgnoreCase, &ordinal)); + + // Create a second tab. + browser()->AddTabWithURL(url, GURL(), PageTransition::TYPED, true, -1, + false, NULL); + browser()->SelectTabContentsAt(1, false); + TabContents* tab2 = browser()->GetSelectedTabContents(); + EXPECT_NE(tab1, tab2); + + // Find "given". + FindInPageWchar(tab2, L"given", kFwd, kIgnoreCase, &ordinal); + + // Switch back to first tab. + browser()->SelectTabContentsAt(0, false); + browser()->GetFindBarController()->EndFindSession( + FindBarController::kKeepSelection); + // Simulate F3. + ui_test_utils::FindInPage(tab1, string16(), kFwd, kIgnoreCase, &ordinal); + EXPECT_EQ(tab1->find_text(), WideToUTF16(L"Default")); +} + +// This makes sure that dismissing the find bar with kActivateSelection works. +IN_PROC_BROWSER_TEST_F(FindInPageControllerTest, ActivateLinkNavigatesPage) { + HTTPTestServer* server = StartHTTPServer(); + +#if defined(TOOLKIT_VIEWS) + DropdownBarHost::disable_animations_during_testing_ = true; +#endif + + // First we navigate to our test content. + GURL url = server->TestServerPageW(kLinkPage); + ui_test_utils::NavigateToURL(browser(), url); + + TabContents* tab = browser()->GetSelectedTabContents(); + int ordinal = 0; + FindInPageWchar(tab, L"link", kFwd, kIgnoreCase, &ordinal); + EXPECT_EQ(ordinal, 1); + + // End the find session, click on the link. + tab->StopFinding(FindBarController::kActivateSelection); + EXPECT_TRUE(ui_test_utils::WaitForNavigationInCurrentTab(browser())); +} |