diff options
author | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-23 22:21:43 +0000 |
---|---|---|
committer | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-23 22:21:43 +0000 |
commit | 0aa477bd3cd906e880891fd2e9f4739a53270a7f (patch) | |
tree | f78ab46e2bd5aca2812755d3240fd8cf4e83c8f5 /chrome/renderer | |
parent | 1d437b64e1aaf11827962de62694bcb806265d00 (diff) | |
download | chromium_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-x | chrome/renderer/extensions/extension_bindings.cc | 19 | ||||
-rwxr-xr-x | chrome/renderer/extensions/extension_bindings.h | 25 | ||||
-rwxr-xr-x | chrome/renderer/extensions/renderer_extension_bindings.cc | 100 | ||||
-rwxr-xr-x | chrome/renderer/extensions/renderer_extension_bindings.h | 26 | ||||
-rw-r--r-- | chrome/renderer/render_thread.cc | 3 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 15 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 6 | ||||
-rw-r--r-- | chrome/renderer/renderer.scons | 4 | ||||
-rw-r--r-- | chrome/renderer/renderer.vcproj | 4 |
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> |