summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/automation/automation_provider.cc4
-rw-r--r--chrome/browser/automation/automation_provider.h3
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc5
-rw-r--r--chrome/browser/renderer_host/render_view_host.h3
-rw-r--r--chrome/common/render_messages_internal.h3
-rw-r--r--chrome/renderer/external_host_bindings.cc18
-rw-r--r--chrome/renderer/external_host_bindings.h7
-rw-r--r--chrome/renderer/render_view.cc21
-rw-r--r--chrome/renderer/render_view.h3
-rw-r--r--chrome/test/automation/automation_messages_internal.h3
-rw-r--r--chrome/test/automation/tab_proxy.cc2
-rw-r--r--chrome/test/automation/tab_proxy.h1
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|.