From 5cb5ff33998335f9f3be415bfe211c16e76c49a9 Mon Sep 17 00:00:00 2001 From: "craigdh@chromium.org" Date: Tue, 6 Mar 2012 01:42:39 +0000 Subject: Implementation of AutomationEventQueue and associated framework to support generic non-blocking automation events. Change-Id: I39f50d1d5b321a863572eec6c61e11923092ed47 BUG=98289 TEST=functional/apptest.py Review URL: http://codereview.chromium.org/9372120 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@125069 0039d316-1c4b-4281-b951-d872f2087c98 --- .../automation/testing_automation_provider.cc | 80 ++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'chrome/browser/automation/testing_automation_provider.cc') diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index 11f239a..ba0df97 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -2316,6 +2316,14 @@ void TestingAutomationProvider::SendJSONRequest(int handle, handler_map["SetPrefs"] = &TestingAutomationProvider::SetPrefs; handler_map["ExecuteJavascript"] = &TestingAutomationProvider::ExecuteJavascriptJSON; + handler_map["AddDomRaisedEventObserver"] = + &TestingAutomationProvider::AddDomRaisedEventObserver; + handler_map["RemoveEventObserver"] = + &TestingAutomationProvider::RemoveEventObserver; + handler_map["GetNextEvent"] = + &TestingAutomationProvider::GetNextEvent; + handler_map["ClearEventQueue"] = + &TestingAutomationProvider::ClearEventQueue; handler_map["ExecuteJavascriptInRenderView"] = &TestingAutomationProvider::ExecuteJavascriptInRenderView; handler_map["GoForward"] = @@ -6445,6 +6453,78 @@ void TestingAutomationProvider::ExecuteJavascriptInRenderView( rvh); } +void TestingAutomationProvider::AddDomRaisedEventObserver( + DictionaryValue* args, + IPC::Message* reply_message) { + if (SendErrorIfModalDialogActive(this, reply_message)) + return; + + AutomationJSONReply reply(this, reply_message); + std::string event_name; + if (!args->GetString("event_name", &event_name)) { + reply.SendError("'event_name' missing or invalid"); + return; + } + + if (!automation_event_queue_.get()) + automation_event_queue_.reset(new AutomationEventQueue); + + int observer_id = automation_event_queue_->AddObserver( + new DomRaisedEventObserver(automation_event_queue_.get(), event_name)); + scoped_ptr return_value(new DictionaryValue); + return_value->SetInteger("observer_id", observer_id); + reply.SendSuccess(return_value.get()); +} + +void TestingAutomationProvider::RemoveEventObserver( + DictionaryValue* args, + IPC::Message* reply_message) { + AutomationJSONReply reply(this, reply_message); + int observer_id; + if (!args->GetInteger("observer_id", &observer_id) || + !automation_event_queue_.get()) { + reply.SendError("'observer_id' missing or invalid"); + return; + } + if (automation_event_queue_->RemoveObserver(observer_id)) { + reply.SendSuccess(NULL); + return; + } + reply.SendError("Invalid observer id."); +} + +void TestingAutomationProvider::ClearEventQueue( + DictionaryValue* args, + IPC::Message* reply_message) { + automation_event_queue_.reset(); + AutomationJSONReply(this, reply_message).SendSuccess(NULL); +} + +void TestingAutomationProvider::GetNextEvent( + DictionaryValue* args, + IPC::Message* reply_message) { + scoped_ptr reply( + new AutomationJSONReply(this, reply_message)); + int observer_id; + bool blocking; + if (!args->GetInteger("observer_id", &observer_id)) { + reply->SendError("'observer_id' missing or invalid"); + return; + } + if (!args->GetBoolean("blocking", &blocking)) { + reply->SendError("'blocking' missing or invalid"); + return; + } + if (!automation_event_queue_.get()) { + reply->SendError( + "No observers are attached to the queue. Did you forget to add one?"); + return; + } + + // The reply will be freed once a matching event is added to the queue. + automation_event_queue_->GetNextEvent(reply.release(), observer_id, blocking); +} + void TestingAutomationProvider::GoForward( DictionaryValue* args, IPC::Message* reply_message) { -- cgit v1.1