summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authormpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-23 22:21:43 +0000
committermpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-23 22:21:43 +0000
commit0aa477bd3cd906e880891fd2e9f4739a53270a7f (patch)
treef78ab46e2bd5aca2812755d3240fd8cf4e83c8f5 /chrome/renderer
parent1d437b64e1aaf11827962de62694bcb806265d00 (diff)
downloadchromium_src-0aa477bd3cd906e880891fd2e9f4739a53270a7f.zip
chromium_src-0aa477bd3cd906e880891fd2e9f4739a53270a7f.tar.gz
chromium_src-0aa477bd3cd906e880891fd2e9f4739a53270a7f.tar.bz2
Initial rev at a message passing API for extensions. So far, only passing
messages to the extension process is supported. Review URL: http://codereview.chromium.org/48090 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12319 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rwxr-xr-xchrome/renderer/extensions/extension_bindings.cc19
-rwxr-xr-xchrome/renderer/extensions/extension_bindings.h25
-rwxr-xr-xchrome/renderer/extensions/renderer_extension_bindings.cc100
-rwxr-xr-xchrome/renderer/extensions/renderer_extension_bindings.h26
-rw-r--r--chrome/renderer/render_thread.cc3
-rw-r--r--chrome/renderer/render_view.cc15
-rw-r--r--chrome/renderer/render_view.h6
-rw-r--r--chrome/renderer/renderer.scons4
-rw-r--r--chrome/renderer/renderer.vcproj4
9 files changed, 144 insertions, 58 deletions
diff --git a/chrome/renderer/extensions/extension_bindings.cc b/chrome/renderer/extensions/extension_bindings.cc
deleted file mode 100755
index 24c66d3..0000000
--- a/chrome/renderer/extensions/extension_bindings.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/renderer/extensions/extension_bindings.h"
-
-#include "base/values.h"
-#include "chrome/common/render_messages.h"
-
-#define BIND_METHOD(name) BindMethod(#name, &ExtensionBindings::name)
-ExtensionBindings::ExtensionBindings() {
- BIND_METHOD(getTestString);
-}
-#undef BIND_METHOD
-
-void ExtensionBindings::getTestString(
- const CppArgumentList& args, CppVariant* result) {
- result->Set("This is a placeholder string. It's here to hold places.");
-}
diff --git a/chrome/renderer/extensions/extension_bindings.h b/chrome/renderer/extensions/extension_bindings.h
deleted file mode 100755
index a4b86cc..0000000
--- a/chrome/renderer/extensions/extension_bindings.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_RENDERER_EXTENSIONS_EXTENSION_BINDINGS_H__
-#define CHROME_RENDERER_EXTENSIONS_EXTENSION_BINDINGS_H__
-
-#include "chrome/common/ipc_message.h"
-#include "chrome/renderer/dom_ui_bindings.h"
-
-// ExtensionBindings is the class backing the "extension" object
-// accessible from JavaScript.
-class ExtensionBindings : public DOMBoundBrowserObject {
- public:
- ExtensionBindings();
- virtual ~ExtensionBindings() {}
-
- // Methods exposed to JavaScript.
- void getTestString(const CppArgumentList& args, CppVariant* result);
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ExtensionBindings);
-};
-
-#endif // CHROME_RENDERER_EXTENSIONS_EXTENSION_BINDINGS_H__
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc
new file mode 100755
index 0000000..4a095ac
--- /dev/null
+++ b/chrome/renderer/extensions/renderer_extension_bindings.cc
@@ -0,0 +1,100 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/renderer/extensions/renderer_extension_bindings.h"
+
+#include "chrome/common/render_messages.h"
+#include "chrome/renderer/render_thread.h"
+#include "webkit/glue/webframe.h"
+
+namespace {
+
+const char* kExtensionName = "v8/RendererExtensionBindings";
+
+const char* kExtensionScript =
+ "var chromium = chromium || {};"
+ "(function () {"
+ " native function OpenChannelToExtension(id);"
+ " native function PostMessage(channel_id, msg);"
+ " chromium.Extension = function(id) {"
+ " this.channel_id_ = OpenChannelToExtension(id);"
+ " if (this.channel_id_ == -1)"
+ " throw new Error('No such extension \"' + id + '\"');"
+ " chromium.Extension.extensions_[this.channel_id_] = this;"
+ " };"
+ " chromium.Extension.extensions_ = {};"
+ " chromium.Extension.dispatchOnMessage = function(msg, channel_id) {"
+ // TODO(mpcomplete): port param for onMessage
+ " var e = chromium.Extension.extensions_[channel_id];"
+ " if (e && e.onMessage) e.onMessage(msg);"
+ " if (chromium.Extension.onMessage) chromium.Extension.onMessage(msg);"
+ " };"
+ " chromium.Extension.prototype.postMessage = function(msg) {"
+ " return PostMessage(this.channel_id_, msg);"
+ " };"
+ "})();";
+
+// Message passing API example (in a content script):
+// var extension =
+// new chromium.Extension('00123456789abcdef0123456789abcdef0123456');
+// extension.postMessage('Can you hear me now?');
+// extension.onMessage = function(msg) { alert('response=' + msg); }
+
+class ExtensionImpl : public v8::Extension {
+ public:
+ ExtensionImpl() : v8::Extension(kExtensionName, kExtensionScript) {}
+ ~ExtensionImpl() {}
+
+ virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
+ v8::Handle<v8::String> name) {
+ if (name->Equals(v8::String::New("OpenChannelToExtension"))) {
+ return v8::FunctionTemplate::New(OpenChannelToExtension);
+ } else if (name->Equals(v8::String::New("PostMessage"))) {
+ return v8::FunctionTemplate::New(PostMessage);
+ }
+ return v8::Handle<v8::FunctionTemplate>();
+ }
+ static v8::Handle<v8::Value> OpenChannelToExtension(
+ const v8::Arguments& args) {
+ if (args.Length() >= 1 && args[0]->IsString()) {
+ std::string id = *v8::String::Utf8Value(args[0]->ToString());
+ int channel_id;
+ RenderThread::current()->Send(
+ new ViewHostMsg_OpenChannelToExtension(id, &channel_id));
+ return v8::Integer::New(channel_id);
+ // TODO(mpcomplete): should we associate channel_id with the frame it
+ // came from, so we can run the onmessage handler in that context for
+ // responses?
+ }
+ return v8::Undefined();
+ }
+ static v8::Handle<v8::Value> PostMessage(const v8::Arguments& args) {
+ if (args.Length() >= 2 && args[0]->IsInt32() && args[1]->IsString()) {
+ int channel_id = args[1]->Int32Value();
+ std::string message = *v8::String::Utf8Value(args[1]->ToString());
+ RenderThread::current()->Send(
+ new ViewHostMsg_ExtensionPostMessage(channel_id, message));
+ }
+ return v8::Undefined();
+ }
+};
+
+} // namespace
+
+namespace extensions_v8 {
+
+v8::Extension* RendererExtensionBindings::Get() {
+ return new ExtensionImpl();
+}
+
+void RendererExtensionBindings::HandleExtensionMessage(
+ WebFrame* webframe, const std::string& message, int channel_id) {
+ // TODO(mpcomplete): escape message
+ std::string script = StringPrintf(
+ "void(chromium.Extension.dispatchOnMessage(\"%s\", %d))",
+ message.c_str(), channel_id);
+ webframe->ExecuteScript(webkit_glue::WebScriptSource(script));
+}
+
+} // namespace extensions_v8
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.h b/chrome/renderer/extensions/renderer_extension_bindings.h
new file mode 100755
index 0000000..284f9bb
--- /dev/null
+++ b/chrome/renderer/extensions/renderer_extension_bindings.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_RENDERER_EXTENSIONS_RENDERER_EXTENSION_BINDINGS_H_
+#define CHROME_RENDERER_EXTENSIONS_RENDERER_EXTENSION_BINDINGS_H_
+
+#include "v8/include/v8.h"
+
+#include <string>
+
+class WebFrame;
+
+namespace extensions_v8 {
+
+// This class adds extension-related javascript bindings to a renderer.
+class RendererExtensionBindings {
+ public:
+ static v8::Extension* Get();
+ static void HandleExtensionMessage(
+ WebFrame* webframe, const std::string& message, int channel_id);
+};
+
+} // namespace extensions_v8
+
+#endif // CHROME_RENDERER_EXTENSIONS_RENDERER_EXTENSION_BINDINGS_H_
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index fb00145..96e239c 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -23,6 +23,7 @@
#include "chrome/plugin/plugin_channel_base.h"
#include "webkit/glue/weburlrequest.h"
#endif
+#include "chrome/renderer/extensions/renderer_extension_bindings.h"
#include "chrome/renderer/net/render_dns_master.h"
#include "chrome/renderer/render_process.h"
#include "chrome/renderer/render_view.h"
@@ -32,7 +33,6 @@
#include "third_party/WebKit/WebKit/chromium/public/WebCache.h"
#include "third_party/WebKit/WebKit/chromium/public/WebKit.h"
#include "third_party/WebKit/WebKit/chromium/public/WebString.h"
-#include "v8/include/v8.h"
#include "webkit/extensions/v8/gears_extension.h"
#include "webkit/extensions/v8/interval_extension.h"
#include "webkit/extensions/v8/playback_extension.h"
@@ -248,6 +248,7 @@ void RenderThread::EnsureWebKitInitialized() {
WebKit::registerExtension(extensions_v8::GearsExtension::Get());
WebKit::registerExtension(extensions_v8::IntervalExtension::Get());
+ WebKit::registerExtension(extensions_v8::RendererExtensionBindings::Get());
const CommandLine& command_line = *CommandLine::ForCurrentProcess();
if (command_line.HasSwitch(switches::kPlaybackMode) ||
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 4094ce6..dafb0ad 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -29,6 +29,7 @@
#include "chrome/renderer/debug_message_handler.h"
#include "chrome/renderer/devtools_agent.h"
#include "chrome/renderer/devtools_client.h"
+#include "chrome/renderer/extensions/renderer_extension_bindings.h"
#include "chrome/renderer/localized_error.h"
#include "chrome/renderer/media/audio_renderer_impl.h"
#include "chrome/renderer/render_process.h"
@@ -425,6 +426,8 @@ void RenderView::OnMessageReceived(const IPC::Message& message) {
OnAudioStreamStateChanged)
IPC_MESSAGE_HANDLER(ViewMsg_NotifyAudioStreamVolume, OnAudioStreamVolume)
IPC_MESSAGE_HANDLER(ViewMsg_MoveOrResizeStarted, OnMoveOrResizeStarted)
+ IPC_MESSAGE_HANDLER(ViewMsg_HandleExtensionMessage,
+ OnHandleExtensionMessage)
// Have the super handle all other messages.
IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message))
@@ -1482,11 +1485,6 @@ void RenderView::WindowObjectCleared(WebFrame* webframe) {
external_host_bindings_.set_routing_id(routing_id_);
external_host_bindings_.BindToJavascript(webframe, L"externalHost");
}
- if (BindingsPolicy::is_extension_enabled(enabled_bindings_)) {
- extension_bindings_.set_message_sender(this);
- extension_bindings_.set_routing_id(routing_id_);
- extension_bindings_.BindToJavascript(webframe, L"extension");
- }
#ifdef CHROME_PERSONALIZATION
Personalization::ConfigureRendererPersonalization(personalization_, this,
@@ -2939,3 +2937,10 @@ void RenderView::OnResize(const gfx::Size& new_size,
webview()->HideAutofillPopup();
RenderWidget::OnResize(new_size, resizer_rect);
}
+
+void RenderView::OnHandleExtensionMessage(const std::string& message,
+ int channel_id) {
+ if (webview() && webview()->GetMainFrame())
+ extensions_v8::RendererExtensionBindings::HandleExtensionMessage(
+ webview()->GetMainFrame(), message, channel_id);
+}
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index b6d48a0..da75f93 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -22,7 +22,6 @@
#include "chrome/renderer/automation/dom_automation_controller.h"
#include "chrome/renderer/dom_ui_bindings.h"
#include "chrome/renderer/external_host_bindings.h"
-#include "chrome/renderer/extensions/extension_bindings.h"
#include "chrome/renderer/external_js_object.h"
#include "chrome/renderer/render_widget.h"
#include "media/audio/audio_output.h"
@@ -577,6 +576,8 @@ class RenderView : public RenderWidget,
// Notification of volume property of an audio output stream.
void OnAudioStreamVolume(int stream_id, double left, double right);
+ void OnHandleExtensionMessage(const std::string& message, int channel_id);
+
// Prints the page listed in |params|.
void PrintPage(const ViewMsg_PrintPage_Params& params,
const gfx::Size& canvas_size,
@@ -641,9 +642,6 @@ class RenderView : public RenderWidget,
// External host exposed through automation controller.
ExternalHostBindings external_host_bindings_;
- // Extension bindings exposed for script running in the extension process.
- ExtensionBindings extension_bindings_;
-
// The last gotten main frame's encoding.
std::wstring last_encoding_name_;
diff --git a/chrome/renderer/renderer.scons b/chrome/renderer/renderer.scons
index 546db30..9cfa1585 100644
--- a/chrome/renderer/renderer.scons
+++ b/chrome/renderer/renderer.scons
@@ -58,8 +58,8 @@ input_files = ChromeFileList([
'net/render_dns_queue.h',
]),
MSVSFilter('extensions', [
- 'extensions/extension_bindings.cc',
- 'extensions/extension_bindings.h',
+ 'extensions/renderer_extension_bindings.cc',
+ 'extensions/renderer_extension_bindings.h',
]),
'about_handler.cc',
'about_handler.h',
diff --git a/chrome/renderer/renderer.vcproj b/chrome/renderer/renderer.vcproj
index 634c044..db4ec9c 100644
--- a/chrome/renderer/renderer.vcproj
+++ b/chrome/renderer/renderer.vcproj
@@ -185,11 +185,11 @@
Name="extensions"
>
<File
- RelativePath=".\extensions\extension_bindings.cc"
+ RelativePath=".\extensions\renderer_extension_bindings.cc"
>
</File>
<File
- RelativePath=".\extensions\extension_bindings.h"
+ RelativePath=".\extensions\renderer_extension_bindings.h"
>
</File>
</Filter>