diff options
author | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 03:52:30 +0000 |
---|---|---|
committer | aa@chromium.org <aa@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-11 03:52:30 +0000 |
commit | 6e67b73e35b3cd2946b86bb2e9766cf59026247c (patch) | |
tree | 6fd9864a011f9a6caa897dd68a2604cd4d0c9e1a /chrome/browser/automation | |
parent | 2e49fc3cceaa87f1472fae156271e594cfa140d3 (diff) | |
download | chromium_src-6e67b73e35b3cd2946b86bb2e9766cf59026247c.zip chromium_src-6e67b73e35b3cd2946b86bb2e9766cf59026247c.tar.gz chromium_src-6e67b73e35b3cd2946b86bb2e9766cf59026247c.tar.bz2 |
Add support to the automation provider to test sending browser
events to extensions. Implements an initial test that send all
known window, tab, page action, and bookmark events and makes
sure the extension received them.
Original review: http://codereview.chromium.org/119325
Review URL: http://codereview.chromium.org/123010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18148 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/automation')
4 files changed, 61 insertions, 2 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index dcb6afe..4b2510a 100755 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -6,6 +6,7 @@ #include "app/message_box_flags.h" #include "base/file_version_info.h" +#include "base/json_reader.h" #include "base/message_loop.h" #include "base/path_service.h" #include "base/stl_util-inl.h" @@ -17,6 +18,7 @@ #include "chrome/browser/app_modal_dialog_queue.h" #include "chrome/browser/automation/automation_extension_function.h" #include "chrome/browser/automation/automation_provider_list.h" +#include "chrome/browser/automation/extension_automation_constants.h" #include "chrome/browser/automation/extension_port_container.h" #include "chrome/browser/automation/url_request_failed_dns_job.h" #include "chrome/browser/automation/url_request_mock_http_job.h" @@ -26,6 +28,7 @@ #include "chrome/browser/dom_operation_notification_details.h" #include "chrome/browser/download/download_manager.h" #include "chrome/browser/download/download_shelf.h" +#include "chrome/browser/extensions/extension_message_service.h" #include "chrome/browser/find_bar.h" #include "chrome/browser/find_bar_controller.h" #include "chrome/browser/find_notification_details.h" @@ -2731,13 +2734,18 @@ void AutomationProvider::OnMessageFromExternalHost(int handle, } if (AutomationExtensionFunction::InterceptMessageFromExternalHost( - view_host, message, origin, target)) { + view_host, message, origin, target)) { // Message was diverted. return; } if (ExtensionPortContainer::InterceptMessageFromExternalHost(message, - origin, target, this, view_host, handle)) { + origin, target, this, view_host, handle)) { + // Message was diverted. + return; + } + + if (InterceptBrowserEventMessageFromExternalHost(message, origin, target)) { // Message was diverted. return; } @@ -2745,6 +2753,47 @@ void AutomationProvider::OnMessageFromExternalHost(int handle, view_host->ForwardMessageFromExternalHost(message, origin, target); } } + +bool AutomationProvider::InterceptBrowserEventMessageFromExternalHost( + const std::string& message, const std::string& origin, + const std::string& target) { + if (target != + extension_automation_constants::kAutomationBrowserEventRequestTarget) + return false; + + if (origin != extension_automation_constants::kAutomationOrigin) { + LOG(WARNING) << "Wrong origin on automation browser event " << origin; + return false; + } + + // The message is a JSON-encoded array with two elements, both strings. The + // first is the name of the event to dispatch. The second is a JSON-encoding + // of the arguments specific to that event. + scoped_ptr<Value> message_value(JSONReader::Read(message, false)); + if (!message_value.get() || !message_value->IsType(Value::TYPE_LIST)) { + LOG(WARNING) << "Invalid browser event specified through automation"; + return false; + } + + const ListValue* args = static_cast<const ListValue*>(message_value.get()); + + std::string event_name; + if (!args->GetString(0, &event_name)) { + LOG(WARNING) << "No browser event name specified through automation"; + return false; + } + + std::string json_args; + if (!args->GetString(1, &json_args)) { + LOG(WARNING) << "No browser event args specified through automation"; + return false; + } + + ExtensionMessageService::GetInstance(profile()->GetRequestContext())-> + DispatchEventToRenderers(event_name.c_str(), json_args); + + return true; +} #endif // defined(OS_WIN) || defined(OS_LINUX) TabContents* AutomationProvider::GetTabContentsForHandle( diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 174faff..bfbae83 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -469,6 +469,12 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, bool success, HistoryService::RedirectList* redirects); + // Determine if the message from the external host represents a browser + // event, and if so dispatch it. + bool InterceptBrowserEventMessageFromExternalHost(const std::string& message, + const std::string& origin, + const std::string& target); + typedef ObserverList<NotificationObserver> NotificationObserverList; typedef std::map<NavigationController*, LoginHandler*> LoginHandlerMap; typedef std::map<int, ExtensionPortContainer*> PortContainerMap; diff --git a/chrome/browser/automation/extension_automation_constants.cc b/chrome/browser/automation/extension_automation_constants.cc index 425c634..6b99a41 100644 --- a/chrome/browser/automation/extension_automation_constants.cc +++ b/chrome/browser/automation/extension_automation_constants.cc @@ -24,5 +24,6 @@ const wchar_t kAutomationPortIdKey[] = L"portid"; const char kAutomationPortRequestTarget[] = "__priv_prtreq"; const char kAutomationPortResponseTarget[] = "__priv_prtres"; +const char kAutomationBrowserEventRequestTarget[] = "__priv_evtreq"; } // namespace extension_automation_constants diff --git a/chrome/browser/automation/extension_automation_constants.h b/chrome/browser/automation/extension_automation_constants.h index 4725bf3..06bd97d 100644 --- a/chrome/browser/automation/extension_automation_constants.h +++ b/chrome/browser/automation/extension_automation_constants.h @@ -35,6 +35,9 @@ extern const char kAutomationPortRequestTarget[]; // All external port message responses have this target. extern const char kAutomationPortResponseTarget[]; +// All external browser events have this target. +extern const char kAutomationBrowserEventRequestTarget[]; + // The command codes for our private port protocol. enum PrivatePortCommand { OPEN_CHANNEL = 0, |