diff options
author | nirnimesh@chromium.org <nirnimesh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-08 00:41:26 +0000 |
---|---|---|
committer | nirnimesh@chromium.org <nirnimesh@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-08 00:41:26 +0000 |
commit | f9e3c52fb5feba4c279dbbbec049aff0b45b3955 (patch) | |
tree | 05c3f9b88bc11f4da42280a8375b090b51cc691b /chrome | |
parent | 7ec5b39703cf0c000d3556e5fc2bff4cb7b9fb21 (diff) | |
download | chromium_src-f9e3c52fb5feba4c279dbbbec049aff0b45b3955.zip chromium_src-f9e3c52fb5feba4c279dbbbec049aff0b45b3955.tar.gz chromium_src-f9e3c52fb5feba4c279dbbbec049aff0b45b3955.tar.bz2 |
Automation support for Find on a given page and return the search count
(Committing on behalf of amolk. Originally reviewed and LGTM-ed at
http://codereview.chromium.org/3402021/show)
BUG=36177
TEST=find_in_page.py
Review URL: http://codereview.chromium.org/3590026
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61898 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/automation/automation_provider.cc | 37 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider.h | 12 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider_observers.cc | 57 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider_observers.h | 3 | ||||
-rw-r--r-- | chrome/browser/automation/testing_automation_provider.cc | 60 | ||||
-rw-r--r-- | chrome/browser/automation/testing_automation_provider.h | 14 | ||||
-rw-r--r-- | chrome/test/functional/PYAUTO_TESTS | 1 | ||||
-rw-r--r-- | chrome/test/pyautolib/pyauto.py | 36 |
8 files changed, 170 insertions, 50 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index 87b50f1..501e074 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -455,7 +455,7 @@ void AutomationProvider::HandleFindRequest( const AutomationMsg_Find_Params& params, IPC::Message* reply_message) { if (!tab_tracker_->ContainsHandle(handle)) { - AutomationMsg_FindInPage::WriteReplyParams(reply_message, -1, -1); + AutomationMsg_Find::WriteReplyParams(reply_message, -1, -1); Send(reply_message); return; } @@ -463,15 +463,36 @@ void AutomationProvider::HandleFindRequest( NavigationController* nav = tab_tracker_->GetResource(handle); TabContents* tab_contents = nav->tab_contents(); - find_in_page_observer_.reset(new - FindInPageNotificationObserver(this, tab_contents, reply_message)); - - tab_contents->set_current_find_request_id( - FindInPageNotificationObserver::kFindInPageRequestId); + SendFindRequest(tab_contents, + false, + params.search_string, + params.forward, + params.match_case, + params.find_next, + reply_message); +} + +void AutomationProvider::SendFindRequest( + TabContents* tab_contents, + bool with_json, + const string16& search_string, + bool forward, + bool match_case, + bool find_next, + IPC::Message* reply_message) { + int request_id = FindInPageNotificationObserver::kFindInPageRequestId; + find_in_page_observer_.reset( + new FindInPageNotificationObserver(this, + tab_contents, + with_json, + reply_message)); + tab_contents->set_current_find_request_id(request_id); tab_contents->render_view_host()->StartFinding( FindInPageNotificationObserver::kFindInPageRequestId, - params.search_string, params.forward, params.match_case, - params.find_next); + search_string, + forward, + match_case, + find_next); } class SetProxyConfigTask : public Task { diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 838fcd6..595fad6 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -19,6 +19,7 @@ #include "base/basictypes.h" #include "base/observer_list.h" #include "base/scoped_ptr.h" +#include "base/string16.h" #include "chrome/browser/autofill/field_types.h" #include "chrome/browser/cancelable_request.h" #include "chrome/browser/tab_contents/navigation_entry.h" @@ -34,6 +35,7 @@ struct AutomationMsg_Find_Params; class PopupMenuWaiter; +class TabContents; namespace IPC { struct Reposition_Params; @@ -197,6 +199,16 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, // Consumer for asynchronous history queries. CancelableRequestConsumer consumer_; + // Sends a find request for a given query. + void SendFindRequest( + TabContents* tab_contents, + bool with_json, + const string16& search_string, + bool forward, + bool match_case, + bool find_next, + IPC::Message* reply_message); + private: void OnUnhandledMessage(); diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index c2873f3..af0cac0 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -6,7 +6,9 @@ #include "base/basictypes.h" #include "base/json/json_writer.h" +#include "base/scoped_ptr.h" #include "base/string_util.h" +#include "base/values.h" #include "chrome/app/chrome_dll_resource.h" #include "chrome/browser/automation/automation_provider.h" #include "chrome/browser/automation/automation_provider_json.h" @@ -31,6 +33,7 @@ #include "chrome/common/extensions/extension.h" #include "chrome/common/notification_service.h" #include "chrome/test/automation/automation_constants.h" +#include "gfx/rect.h" #if defined(OS_CHROMEOS) #include "chrome/browser/chromeos/login/authentication_notification_details.h" @@ -834,9 +837,10 @@ bool ExecuteBrowserCommandObserver::GetNotificationType( FindInPageNotificationObserver::FindInPageNotificationObserver( AutomationProvider* automation, TabContents* parent_tab, - IPC::Message* reply_message) + bool reply_with_json, IPC::Message* reply_message) : automation_(automation), active_match_ordinal_(-1), + reply_with_json_(reply_with_json), reply_message_(reply_message) { registrar_.Add(this, NotificationType::FIND_RESULT_AVAILABLE, Source<TabContents>(parent_tab)); @@ -848,28 +852,40 @@ FindInPageNotificationObserver::~FindInPageNotificationObserver() { void FindInPageNotificationObserver::Observe( NotificationType type, const NotificationSource& source, const NotificationDetails& details) { - if (type == NotificationType::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) + Details<FindNotificationDetails> find_details(details); + if (!(find_details->final_update() && reply_message_ != NULL)) { + DLOG(INFO) << "Ignoring, since we only care about the final message"; + return; + } + // 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->request_id() == kFindInPageRequestId) { + if (reply_with_json_) { + scoped_ptr<DictionaryValue> return_value(new DictionaryValue); + return_value->SetInteger("match_count", + find_details->number_of_matches()); + gfx::Rect rect = find_details->selection_rect(); + // If MatchCount is > 0, then rect should not be Empty. + // We dont guard it here because we want to let the test + // code catch this invalid case if needed. + if (!rect.IsEmpty()) { + return_value->SetInteger("match_left", rect.x()); + return_value->SetInteger("match_top", rect.y()); + return_value->SetInteger("match_right", rect.right()); + return_value->SetInteger("match_bottom", rect.bottom()); + } + AutomationJSONReply(automation_, reply_message_) + .SendSuccess(return_value.get()); + delete this; + } else { + if (find_details->active_match_ordinal() > -1) { active_match_ordinal_ = find_details->active_match_ordinal(); - if (find_details->final_update()) { - if (reply_message_ != NULL) { - AutomationMsg_FindInPage::WriteReplyParams(reply_message_, - active_match_ordinal_, find_details->number_of_matches()); - automation_->Send(reply_message_); - reply_message_ = NULL; - } else { - DLOG(WARNING) << "Multiple final Find messages observed."; - } - } else { - DLOG(INFO) << "Ignoring, since we only care about the final message"; + AutomationMsg_Find::WriteReplyParams(reply_message_, + active_match_ordinal_, find_details->number_of_matches()); + automation_->Send(reply_message_); + reply_message_ = NULL; } } - } else { - NOTREACHED(); } } @@ -1330,3 +1346,4 @@ void AutocompleteEditFocusedObserver::Observe( automation_->Send(reply_message_); delete this; } + diff --git a/chrome/browser/automation/automation_provider_observers.h b/chrome/browser/automation/automation_provider_observers.h index 842092a..bc2fdb7 100644 --- a/chrome/browser/automation/automation_provider_observers.h +++ b/chrome/browser/automation/automation_provider_observers.h @@ -441,6 +441,7 @@ class FindInPageNotificationObserver : public NotificationObserver { public: FindInPageNotificationObserver(AutomationProvider* automation, TabContents* parent_tab, + bool reply_with_json, IPC::Message* reply_message); ~FindInPageNotificationObserver(); @@ -463,6 +464,8 @@ class FindInPageNotificationObserver : public NotificationObserver { // 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_; + // Send reply using json automation interface. + bool reply_with_json_; IPC::Message* reply_message_; DISALLOW_COPY_AND_ASSIGN(FindInPageNotificationObserver); diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index e7ea515..14bc906 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -314,7 +314,6 @@ void TestingAutomationProvider::OnMessageReceived( ExecuteJavascript) IPC_MESSAGE_HANDLER(AutomationMsg_ConstrainedWindowCount, GetConstrainedWindowCount) - IPC_MESSAGE_HANDLER(AutomationMsg_FindInPage, HandleFindInPageRequest) #if defined(TOOLKIT_VIEWS) IPC_MESSAGE_HANDLER(AutomationMsg_GetFocusedViewID, GetFocusedViewID) IPC_MESSAGE_HANDLER_DELAY_REPLY(AutomationMsg_WaitForFocusedViewIDToChange, @@ -1217,18 +1216,6 @@ void TestingAutomationProvider::GetConstrainedWindowCount(int handle, } } -void TestingAutomationProvider::HandleFindInPageRequest( - int handle, - const std::wstring& find_request, - int forward, - int match_case, - int* active_ordinal, - int* matches_found) { - LOG(ERROR) << "HandleFindInPageRequest has been deprecated." - << "Please use HandleFindRequest instead."; - *matches_found = -1; -} - void TestingAutomationProvider::HandleInspectElementRequest( int handle, int x, int y, IPC::Message* reply_message) { TabContents* tab_contents = GetTabContentsForHandle(handle, NULL); @@ -2103,6 +2090,8 @@ void TestingAutomationProvider::SendJSONRequest(int handle, handler_map["UninstallExtensionById"] = &TestingAutomationProvider::UninstallExtensionById; + handler_map["FindInPage"] = &TestingAutomationProvider::FindInPage; + handler_map["SelectTranslateOption"] = &TestingAutomationProvider::SelectTranslateOption; handler_map["GetTranslateInfo"] = @@ -3295,9 +3284,52 @@ namespace { // No translate infobar. return NULL; } - } // namespace +void TestingAutomationProvider::FindInPage( + Browser* browser, + DictionaryValue* args, + IPC::Message* reply_message) { + std::string error_message; + TabContents* tab_contents = GetTabContentsFromDict(browser, args, + &error_message); + if (!tab_contents) { + AutomationJSONReply(this, reply_message).SendError(error_message); + return; + } + string16 search_string; + bool forward; + bool match_case; + bool find_next; + if (!args->GetString("search_string", &search_string)) { + AutomationJSONReply(this, reply_message). + SendError("Must include search_string string."); + return; + } + if (!args->GetBoolean("forward", &forward)) { + AutomationJSONReply(this, reply_message). + SendError("Must include forward boolean."); + return; + } + if (!args->GetBoolean("match_case", &match_case)) { + AutomationJSONReply(this, reply_message). + SendError("Must include match_case boolean."); + return; + } + if (!args->GetBoolean("find_next", &find_next)) { + AutomationJSONReply(this, reply_message). + SendError("Must include find_next boolean."); + return; + } + SendFindRequest(tab_contents, + true, + search_string, + forward, + match_case, + find_next, + reply_message); +} + // See GetTranslateInfo() in chrome/test/pyautolib/pyauto.py for sample json // input and output. void TestingAutomationProvider::GetTranslateInfo( diff --git a/chrome/browser/automation/testing_automation_provider.h b/chrome/browser/automation/testing_automation_provider.h index 07418a6..9449558 100644 --- a/chrome/browser/automation/testing_automation_provider.h +++ b/chrome/browser/automation/testing_automation_provider.h @@ -12,6 +12,7 @@ #include "chrome/browser/history/history.h" #include "chrome/common/notification_registrar.h" +class DictionaryValue; class TemplateURLModel; // This is an automation provider containing testing calls. @@ -155,14 +156,6 @@ class TestingAutomationProvider : public AutomationProvider, void GetConstrainedWindowCount(int handle, int* count); - // This function has been deprecated, please use HandleFindRequest. - void HandleFindInPageRequest(int handle, - const std::wstring& find_request, - int forward, - int match_case, - int* active_ordinal, - int* matches_found); - #if defined(TOOLKIT_VIEWS) void GetFocusedViewID(int handle, int* view_id); @@ -564,6 +557,11 @@ class TestingAutomationProvider : public AutomationProvider, DictionaryValue* args, IPC::Message* reply_message); + // Responds to the Find request and returns the match count. + void FindInPage(Browser* browser, + DictionaryValue* args, + IPC::Message* reply_message); + // Returns information about translation for a given tab. Includes // information about the translate bar if it is showing. void GetTranslateInfo(Browser* browser, diff --git a/chrome/test/functional/PYAUTO_TESTS b/chrome/test/functional/PYAUTO_TESTS index dc9f0fb2..b6fe2be 100644 --- a/chrome/test/functional/PYAUTO_TESTS +++ b/chrome/test/functional/PYAUTO_TESTS @@ -31,6 +31,7 @@ 'cookies', 'crash_reporter', 'downloads', + 'find_in_page', 'execute_javascript', 'history', 'imports', diff --git a/chrome/test/pyautolib/pyauto.py b/chrome/test/pyautolib/pyauto.py index 3fed9f71..f51c11d 100644 --- a/chrome/test/pyautolib/pyauto.py +++ b/chrome/test/pyautolib/pyauto.py @@ -1383,6 +1383,42 @@ class PyUITest(pyautolib.PyUITestBase, unittest.TestCase): } return self._GetResultFromJSONRequest(cmd_dict) + def FindInPage(self, search_string, forward=True, + match_case=False, find_next=False, + tab_index=0, windex=0): + """Find the match count for the given search string and search parameters. + This is equivalent to using the find box + + Args: + search_string: The string to find on the page. + forward: Boolean to set if the search direction is forward or backwards + match_case: Boolean to set for case sensitive search. + find_next: Boolean to set to continue the search or start from beginning. + tab_index: The tab index, default is 0. + window_index: The window index, default is 0. + + Returns: + number of matches found for the given search string and parameters + SAMPLE: + { u'match_count': 10, + u'match_left': 100, + u'match_top': 100, + u'match_right': 200, + u'match_bottom': 200} + + Raises: + pyauto_errors.JSONInterfaceError if the automation call returns an error. + """ + cmd_dict = { + 'command': 'FindInPage', + 'tab_index' : tab_index, + 'search_string' : search_string, + 'forward' : forward, + 'match_case' : match_case, + 'find_next' : find_next, + } + return self._GetResultFromJSONRequest(cmd_dict, windex=windex) + class PyUITestSuite(pyautolib.PyUITestSuiteBase, unittest.TestSuite): """Base TestSuite for PyAuto UI tests.""" |