diff options
author | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-03 00:39:17 +0000 |
---|---|---|
committer | ananta@chromium.org <ananta@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-03 00:39:17 +0000 |
commit | 1b44bb9683e902b84616e42d00f486dc0ca4ed9a (patch) | |
tree | bc96e2c98aaaddeef9b7366d14d8ba45e71ed61f | |
parent | 2fd6c6d0ffca6993559b5aac0b3dde8a75c3d338 (diff) | |
download | chromium_src-1b44bb9683e902b84616e42d00f486dc0ca4ed9a.zip chromium_src-1b44bb9683e902b84616e42d00f486dc0ca4ed9a.tar.gz chromium_src-1b44bb9683e902b84616e42d00f486dc0ca4ed9a.tar.bz2 |
Register an onmessage handler with the external host binding instead of explicitly passing
in a target Javascript function to execute. The onmessage handler is a one argument Javascript
function for now.
Review URL: http://codereview.chromium.org/28291
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@10760 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/automation/automation_provider.cc | 4 | ||||
-rw-r--r-- | chrome/browser/automation/automation_provider.h | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 5 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 3 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 3 | ||||
-rw-r--r-- | chrome/renderer/external_host_bindings.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/external_host_bindings.h | 7 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 21 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 3 | ||||
-rw-r--r-- | chrome/test/automation/automation_messages_internal.h | 3 | ||||
-rw-r--r-- | chrome/test/automation/tab_proxy.cc | 2 | ||||
-rw-r--r-- | chrome/test/automation/tab_proxy.h | 1 |
12 files changed, 36 insertions, 37 deletions
diff --git a/chrome/browser/automation/automation_provider.cc b/chrome/browser/automation/automation_provider.cc index 38154d6..ce23441 100644 --- a/chrome/browser/automation/automation_provider.cc +++ b/chrome/browser/automation/automation_provider.cc @@ -2435,7 +2435,7 @@ void AutomationProvider::AutocompleteEditIsQueryInProgress( } void AutomationProvider::OnMessageFromExternalHost( - int handle, const std::string& target, const std::string& message) { + int handle, const std::string& message) { if (tab_tracker_->ContainsHandle(handle)) { NavigationController* tab = tab_tracker_->GetResource(handle); if (!tab) { @@ -2459,7 +2459,7 @@ void AutomationProvider::OnMessageFromExternalHost( return; } - view_host->ForwardMessageFromExternalHost(target, message); + view_host->ForwardMessageFromExternalHost(message); } } diff --git a/chrome/browser/automation/automation_provider.h b/chrome/browser/automation/automation_provider.h index 17f4a40..26fd979 100644 --- a/chrome/browser/automation/automation_provider.h +++ b/chrome/browser/automation/automation_provider.h @@ -352,8 +352,7 @@ class AutomationProvider : public base::RefCounted<AutomationProvider>, std::vector<AutocompleteMatchData>* matches); // Handler for a message sent by the automation client. - void OnMessageFromExternalHost(int handle, const std::string& target, - const std::string& message); + void OnMessageFromExternalHost(int handle, const std::string& message); // Retrieves the number of SSL related info-bars currently showing in |count|. void GetSSLInfoBarCount(int handle, int* count); diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 3da3fef..1ea4512 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -1333,7 +1333,6 @@ void RenderViewHost::RaisePersonalizationEvent(std::string event_name, #endif void RenderViewHost::ForwardMessageFromExternalHost( - const std::string& target, const std::string& message) { - Send(new ViewMsg_HandleMessageFromExternalHost(routing_id(), target, - message)); + const std::string& message) { + Send(new ViewMsg_HandleMessageFromExternalHost(routing_id(), message)); } diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index 79c9ca6..7120a22 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -398,8 +398,7 @@ class RenderViewHost : public RenderWidgetHost { #endif // Forward a message from external host to chrome renderer. - void ForwardMessageFromExternalHost(const std::string& target, - const std::string& message); + void ForwardMessageFromExternalHost(const std::string& message); // Message the renderer that we should be counted as a new document and not // as a popup. diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index b81610d..902ac0b 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -457,8 +457,7 @@ IPC_BEGIN_MESSAGES(View) std::string /* event arguments */) #endif // Posts a message to the renderer. - IPC_MESSAGE_ROUTED2(ViewMsg_HandleMessageFromExternalHost, - std::string /* The target for the message */, + IPC_MESSAGE_ROUTED1(ViewMsg_HandleMessageFromExternalHost, std::string /* The message */) // Sent to the renderer when a popup window should no longer count against diff --git a/chrome/renderer/external_host_bindings.cc b/chrome/renderer/external_host_bindings.cc index 4ac3b67..27f4a88 100644 --- a/chrome/renderer/external_host_bindings.cc +++ b/chrome/renderer/external_host_bindings.cc @@ -10,6 +10,7 @@ ExternalHostBindings::ExternalHostBindings() { BindMethod("ForwardMessageToExternalHost", &ExternalHostBindings::ForwardMessageToExternalHost); + BindProperty("onmessage", &on_message_handler_); } void ExternalHostBindings::ForwardMessageToExternalHost( @@ -28,3 +29,20 @@ void ExternalHostBindings::ForwardMessageToExternalHost( routing_id(), message)); } +bool ExternalHostBindings::ForwardMessageFromExternalHost( + const std::string& message) { + if (!on_message_handler_.isObject()) + return false; + + CppVariant result; + + NPVariant arg; + arg.type = NPVariantType_String; + arg.value.stringValue.UTF8Characters = message.c_str(); + arg.value.stringValue.UTF8Length = static_cast<int>(message.length()); + + bool status = NPN_InvokeDefault(NULL, on_message_handler_.value.objectValue, + &arg, 1, &result); + DCHECK(status); + return status; +} diff --git a/chrome/renderer/external_host_bindings.h b/chrome/renderer/external_host_bindings.h index fdec590..b4c46ad 100644 --- a/chrome/renderer/external_host_bindings.h +++ b/chrome/renderer/external_host_bindings.h @@ -21,7 +21,14 @@ class ExternalHostBindings : public DOMBoundBrowserObject { // The ForwardMessageToExternalHost() function provided to Javascript. void ForwardMessageToExternalHost(const CppArgumentList& args, CppVariant* result); + + // Invokes the registered onmessage handler. + // Returns true on successful invocation. + bool ForwardMessageFromExternalHost(const std::string& message); + private: + CppVariant on_message_handler_; + DISALLOW_COPY_AND_ASSIGN(ExternalHostBindings); }; diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 6d41678..9dd7eaf 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -2824,28 +2824,11 @@ void RenderView::DidAddHistoryItem() { history_forward_list_count_ = 0; } -void RenderView::OnMessageFromExternalHost( - const std::string& target, const std::string& message) { +void RenderView::OnMessageFromExternalHost(const std::string& message) { if (message.empty()) return; - WebFrame* main_frame = webview()->GetMainFrame(); - if (!main_frame) - return; - - std::string script = "javascript:"; - script += target; - script += "("; - script += "'"; - script += message; - script += "'"; - script += ");void(0);"; - - GURL script_url(script); - scoped_ptr<WebRequest> request(WebRequest::Create(script_url)); - // TODO(iyengar) - // Need a mechanism to send results back. - main_frame->LoadRequest(request.get()); + external_host_bindings_.ForwardMessageFromExternalHost(message); } void RenderView::OnDisassociateFromPopupCount() { diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 78da819..bbccfec 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -543,8 +543,7 @@ class RenderView : public RenderWidget, #endif // Handles messages posted from automation. - void OnMessageFromExternalHost(const std::string& target, - const std::string& message); + void OnMessageFromExternalHost(const std::string& message); // Message that we should no longer be part of the current popup window // grouping, and should form our own grouping. diff --git a/chrome/test/automation/automation_messages_internal.h b/chrome/test/automation/automation_messages_internal.h index be37ce8..9e724f8 100644 --- a/chrome/test/automation/automation_messages_internal.h +++ b/chrome/test/automation/automation_messages_internal.h @@ -723,9 +723,8 @@ IPC_BEGIN_MESSAGES(Automation) int /* tab_handle */) // Posts a message from external host to chrome renderer. - IPC_MESSAGE_ROUTED3(AutomationMsg_HandleMessageFromExternalHost, + IPC_MESSAGE_ROUTED2(AutomationMsg_HandleMessageFromExternalHost, int /* automation handle */, - std::string /* target */, std::string /* message */ ) // A message for an external host. diff --git a/chrome/test/automation/tab_proxy.cc b/chrome/test/automation/tab_proxy.cc index a70351f..c5f40e1 100644 --- a/chrome/test/automation/tab_proxy.cc +++ b/chrome/test/automation/tab_proxy.cc @@ -531,14 +531,12 @@ bool TabProxy::SavePage(const std::wstring& file_name, } void TabProxy::HandleMessageFromExternalHost(AutomationHandle handle, - const std::string& target, const std::string& message) { if (!is_valid()) return; bool succeeded = sender_->Send(new AutomationMsg_HandleMessageFromExternalHost(0, handle, - target, message)); DCHECK(succeeded); } diff --git a/chrome/test/automation/tab_proxy.h b/chrome/test/automation/tab_proxy.h index 1984224..e5d36a7 100644 --- a/chrome/test/automation/tab_proxy.h +++ b/chrome/test/automation/tab_proxy.h @@ -253,7 +253,6 @@ class TabProxy : public AutomationResourceProxy { // Posts a message to the external tab. void HandleMessageFromExternalHost(AutomationHandle handle, - const std::string& target, const std::string& message); // Retrieves the number of SSL related info-bars currently showing in |count|. |