diff options
author | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-30 00:40:43 +0000 |
---|---|---|
committer | sky@google.com <sky@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-30 00:40:43 +0000 |
commit | d4515eb94ad33ac2ab9bfd1094c8e1edd1eefa1b (patch) | |
tree | add4a98df5bcdbb3ca0e1f4471c77f453d52a1f4 /chrome/browser/views | |
parent | 0815731ac884b41853725e51e26b0697449747b4 (diff) | |
download | chromium_src-d4515eb94ad33ac2ab9bfd1094c8e1edd1eefa1b.zip chromium_src-d4515eb94ad33ac2ab9bfd1094c8e1edd1eefa1b.tar.gz chromium_src-d4515eb94ad33ac2ab9bfd1094c8e1edd1eefa1b.tar.bz2 |
Provides the ability to write a unit test that brings up a browser. As
a proof of concept I converted
FindInPageControllerTest.FindInPageFrames over to this.
See the description in InProcessBrowserTest for how it all works.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/19644
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8934 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views')
-rw-r--r-- | chrome/browser/views/find_bar_win_uitest.cc | 52 | ||||
-rw-r--r-- | chrome/browser/views/find_bar_win_unittest.cc | 143 |
2 files changed, 143 insertions, 52 deletions
diff --git a/chrome/browser/views/find_bar_win_uitest.cc b/chrome/browser/views/find_bar_win_uitest.cc index 108e7ce..607aa14 100644 --- a/chrome/browser/views/find_bar_win_uitest.cc +++ b/chrome/browser/views/find_bar_win_uitest.cc @@ -23,58 +23,6 @@ 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"; -// This test loads a page with frames and starts FindInPage requests -TEST_F(FindInPageControllerTest, FindInPageFrames) { - scoped_refptr<HTTPTestServer> server = - HTTPTestServer::CreateServer(L"chrome/test/data", NULL); - ASSERT_TRUE(NULL != server.get()); - - // First we navigate to our frames page. - GURL url = server->TestServerPageW(kFramePage); - scoped_ptr<TabProxy> tab(GetActiveTab()); - ASSERT_TRUE(tab->NavigateToURL(url)); - WaitUntilTabCount(1); - - // Try incremental search (mimicking user typing in). - EXPECT_EQ(18, tab->FindInPage(L"g", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(11, tab->FindInPage(L"go", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(04, tab->FindInPage(L"goo", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(03, tab->FindInPage(L"goog", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(02, tab->FindInPage(L"googl", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(01, tab->FindInPage(L"google", FWD, IGNORE_CASE, false, NULL)); - EXPECT_EQ(00, tab->FindInPage(L"google!", FWD, IGNORE_CASE, false, NULL)); - - // Negative test (no matches should be found). - EXPECT_EQ(0, tab->FindInPage(L"Non-existing string", FWD, IGNORE_CASE, - false, NULL)); - - // 'horse' only exists in the three right frames. - EXPECT_EQ(3, tab->FindInPage(L"horse", FWD, IGNORE_CASE, false, NULL)); - - // 'cat' only exists in the first frame. - EXPECT_EQ(1, tab->FindInPage(L"cat", FWD, IGNORE_CASE, false, NULL)); - - // Try searching again, should still come up with 1 match. - EXPECT_EQ(1, tab->FindInPage(L"cat", FWD, IGNORE_CASE, false, NULL)); - - // Try searching backwards, ignoring case, should still come up with 1 match. - EXPECT_EQ(1, tab->FindInPage(L"CAT", BACK, IGNORE_CASE, false, NULL)); - - // Try case sensitive, should NOT find it. - EXPECT_EQ(0, tab->FindInPage(L"CAT", FWD, CASE_SENSITIVE, false, NULL)); - - // Try again case sensitive, but this time with right case. - EXPECT_EQ(1, tab->FindInPage(L"dog", FWD, CASE_SENSITIVE, false, NULL)); - - // Try non-Latin characters ('Hreggvidur' with 'eth' for 'd' in left frame). - EXPECT_EQ(1, tab->FindInPage(L"Hreggvi\u00F0ur", FWD, IGNORE_CASE, - false, NULL)); - EXPECT_EQ(1, tab->FindInPage(L"Hreggvi\u00F0ur", FWD, CASE_SENSITIVE, - false, NULL)); - EXPECT_EQ(0, tab->FindInPage(L"hreggvi\u00F0ur", FWD, CASE_SENSITIVE, - false, NULL)); -} - // This test loads a single-frame page and makes sure the ordinal returned makes // sense as we FindNext over all the items. TEST_F(FindInPageControllerTest, FindInPageOrdinal) { diff --git a/chrome/browser/views/find_bar_win_unittest.cc b/chrome/browser/views/find_bar_win_unittest.cc new file mode 100644 index 0000000..0112696 --- /dev/null +++ b/chrome/browser/views/find_bar_win_unittest.cc @@ -0,0 +1,143 @@ +// Copyright (c) 2006-2008 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/message_loop.h" +#include "chrome/browser/browser.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/web_contents.h" +#include "chrome/browser/tab_contents/web_contents_view.h" +#include "chrome/browser/views/find_bar_win.h" +#include "chrome/test/in_process_browser_test.h" +#include "chrome/test/ui_test_utils.h" + +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"; + +class FindInPageNotificationObserver : public NotificationObserver { + public: + FindInPageNotificationObserver(TabContents* parent_tab) + : parent_tab_(parent_tab), + active_match_ordinal_(-1), + number_of_matches_(0) { + registrar_.Add(this, NOTIFY_FIND_RESULT_AVAILABLE, + Source<TabContents>(parent_tab_)); + ui_test_utils::RunMessageLoop(); + } + + int active_match_ordinal() const { return active_match_ordinal_; } + + int number_of_matches() const { return number_of_matches_; } + + virtual void Observe(NotificationType type, const NotificationSource& source, + const NotificationDetails& details) { + if (type == NOTIFY_FIND_RESULT_AVAILABLE) { + Details<FindNotificationDetails> find_details(details); + if (find_details->request_id() == kFindInPageRequestId) { + // We get multiple responses and one of those will contain the ordinal. + // This message comes to us before the final update is sent. + if (find_details->active_match_ordinal() > -1) + active_match_ordinal_ = find_details->active_match_ordinal(); + if (find_details->final_update()) { + number_of_matches_ = find_details->number_of_matches(); + MessageLoopForUI::current()->Quit(); + } else { + DLOG(INFO) << "Ignoring, since we only care about the final message"; + } + } + } else { + NOTREACHED(); + } + } + + // The Find mechanism is over asynchronous IPC, so a search is kicked off and + // we wait for notification to find out what the results are. As the user is + // typing, new search requests can be issued and the Request ID helps us make + // sense of whether this is the current request or an old one. The unit tests, + // however, which uses this constant issues only one search at a time, so we + // don't need a rolling id to identify each search. But, we still need to + // specify one, so we just use a fixed one - its value does not matter. + static const int kFindInPageRequestId; + + private: + NotificationRegistrar registrar_; + TabContents* parent_tab_; + // We will at some point (before final update) be notified of the ordinal and + // we need to preserve it so we can send it later. + int active_match_ordinal_; + int number_of_matches_; +}; + +typedef enum FindInPageDirection { BACK = 0, FWD = 1 }; +typedef enum FindInPageCase { IGNORE_CASE = 0, CASE_SENSITIVE = 1 }; + +class FindInPageControllerTest : public InProcessBrowserTest { + public: + FindInPageControllerTest() {} + + protected: + int FindInPage(const std::wstring& search_string, + FindInPageDirection forward, + FindInPageCase match_case, + bool find_next) { + WebContents* web_contents = + browser()->GetSelectedTabContents()->AsWebContents(); + if (web_contents) { + web_contents->view()->FindInPage(*browser(), true, forward == FWD); + web_contents->render_view_host()->StartFinding( + FindInPageNotificationObserver::kFindInPageRequestId, + search_string, forward == FWD, match_case == CASE_SENSITIVE, find_next); + return FindInPageNotificationObserver(web_contents).number_of_matches(); + } + return 0; + } +}; + +// 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). + EXPECT_EQ(18, FindInPage(L"g", FWD, IGNORE_CASE, false)); + EXPECT_EQ(11, FindInPage(L"go", FWD, IGNORE_CASE, false)); + EXPECT_EQ(04, FindInPage(L"goo", FWD, IGNORE_CASE, false)); + EXPECT_EQ(03, FindInPage(L"goog", FWD, IGNORE_CASE, false)); + EXPECT_EQ(02, FindInPage(L"googl", FWD, IGNORE_CASE, false)); + EXPECT_EQ(01, FindInPage(L"google", FWD, IGNORE_CASE, false)); + EXPECT_EQ(00, FindInPage(L"google!", FWD, IGNORE_CASE, false)); + + // Negative test (no matches should be found). + EXPECT_EQ(0, FindInPage(L"Non-existing string", FWD, IGNORE_CASE, false)); + + // 'horse' only exists in the three right frames. + EXPECT_EQ(3, FindInPage(L"horse", FWD, IGNORE_CASE, false)); + + // 'cat' only exists in the first frame. + EXPECT_EQ(1, FindInPage(L"cat", FWD, IGNORE_CASE, false)); + + // Try searching again, should still come up with 1 match. + EXPECT_EQ(1, FindInPage(L"cat", FWD, IGNORE_CASE, false)); + + // Try searching backwards, ignoring case, should still come up with 1 match. + EXPECT_EQ(1, FindInPage(L"CAT", BACK, IGNORE_CASE, false)); + + // Try case sensitive, should NOT find it. + EXPECT_EQ(0, FindInPage(L"CAT", FWD, CASE_SENSITIVE, false)); + + // Try again case sensitive, but this time with right case. + EXPECT_EQ(1, FindInPage(L"dog", FWD, CASE_SENSITIVE, false)); + + // Try non-Latin characters ('Hreggvidur' with 'eth' for 'd' in left frame). + EXPECT_EQ(1, FindInPage(L"Hreggvi\u00F0ur", FWD, IGNORE_CASE, false)); + EXPECT_EQ(1, FindInPage(L"Hreggvi\u00F0ur", FWD, CASE_SENSITIVE, false)); + EXPECT_EQ(0, FindInPage(L"hreggvi\u00F0ur", FWD, CASE_SENSITIVE, false)); +} |