summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authormpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 19:32:43 +0000
committermpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2009-06-17 19:32:43 +0000
commitdfcb62a173898e182e2f10ca635deb753977b9f8 (patch)
tree39d4ca8b82cfc9f39f1726d4b0ad061cb141c516 /chrome/renderer
parent851c567a756e96913098ac03d84fb9ea5761558d (diff)
downloadchromium_src-dfcb62a173898e182e2f10ca635deb753977b9f8.zip
chromium_src-dfcb62a173898e182e2f10ca635deb753977b9f8.tar.gz
chromium_src-dfcb62a173898e182e2f10ca635deb753977b9f8.tar.bz2
Add a port disconnect event for when one side of an extension message port
goes away. Combine the various ExtensionMessageService IPC message into a single "Invoke" message. BUG=12686 TEST=no Review URL: http://codereview.chromium.org/126234 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18645 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/renderer_extension_bindings.cc78
-rw-r--r--chrome/renderer/extensions/renderer_extension_bindings.h16
-rw-r--r--chrome/renderer/render_thread.cc24
-rw-r--r--chrome/renderer/render_thread.h7
-rw-r--r--chrome/renderer/renderer_resources.grd2
-rw-r--r--chrome/renderer/resources/renderer_extension_bindings.js17
6 files changed, 74 insertions, 70 deletions
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.cc b/chrome/renderer/extensions/renderer_extension_bindings.cc
index 86d3d15..0931c8c 100644
--- a/chrome/renderer/extensions/renderer_extension_bindings.cc
+++ b/chrome/renderer/extensions/renderer_extension_bindings.cc
@@ -6,6 +6,7 @@
#include "app/resource_bundle.h"
#include "base/basictypes.h"
+#include "base/values.h"
#include "chrome/common/render_messages.h"
#include "chrome/renderer/extensions/bindings_utils.h"
#include "chrome/renderer/extensions/event_bindings.h"
@@ -81,6 +82,51 @@ class ExtensionImpl : public v8::Extension {
}
};
+// Convert a ListValue to a vector of V8 values.
+static std::vector< v8::Handle<v8::Value> > ListValueToV8(
+ const ListValue& value) {
+ std::vector< v8::Handle<v8::Value> > v8_values;
+
+ for (size_t i = 0; i < value.GetSize(); ++i) {
+ Value* elem = NULL;
+ value.Get(i, &elem);
+ switch (elem->GetType()) {
+ case Value::TYPE_NULL:
+ v8_values.push_back(v8::Null());
+ break;
+ case Value::TYPE_BOOLEAN: {
+ bool val;
+ elem->GetAsBoolean(&val);
+ v8_values.push_back(v8::Boolean::New(val));
+ break;
+ }
+ case Value::TYPE_INTEGER: {
+ int val;
+ elem->GetAsInteger(&val);
+ v8_values.push_back(v8::Integer::New(val));
+ break;
+ }
+ case Value::TYPE_REAL: {
+ double val;
+ elem->GetAsReal(&val);
+ v8_values.push_back(v8::Number::New(val));
+ break;
+ }
+ case Value::TYPE_STRING: {
+ std::string val;
+ elem->GetAsString(&val);
+ v8_values.push_back(v8::String::New(val.c_str()));
+ break;
+ }
+ default:
+ NOTREACHED() << "Unsupported Value type.";
+ break;
+ }
+ }
+
+ return v8_values;
+}
+
} // namespace
const char* RendererExtensionBindings::kName =
@@ -90,33 +136,9 @@ v8::Extension* RendererExtensionBindings::Get() {
return new ExtensionImpl();
}
-void RendererExtensionBindings::HandleConnect(int port_id,
- const std::string& tab_json) {
- v8::HandleScope handle_scope;
- v8::Handle<v8::Value> argv[2];
- argv[0] = v8::Integer::New(port_id);
- argv[1] = v8::String::New(tab_json.c_str());
- EventBindings::CallFunction("chrome.Port.dispatchOnConnect_",
- arraysize(argv), argv);
-}
-
-void RendererExtensionBindings::HandleMessage(const std::string& message,
- int port_id) {
- v8::HandleScope handle_scope;
- v8::Handle<v8::Value> argv[2];
- argv[0] = v8::String::New(message.c_str());
- argv[1] = v8::Integer::New(port_id);
- EventBindings::CallFunction("chrome.Port.dispatchOnMessage_",
- arraysize(argv), argv);
-}
-
-void RendererExtensionBindings::HandleEvent(const std::string& event_name,
- const std::string& args) {
+void RendererExtensionBindings::Invoke(const std::string& function_name,
+ const ListValue& args) {
v8::HandleScope handle_scope;
- v8::Handle<v8::Value> argv[2];
- argv[0] = v8::String::New(event_name.c_str());
- argv[1] = v8::String::New(args.c_str());
-
- EventBindings::CallFunction("chrome.Event.dispatchJSON_",
- arraysize(argv), argv);
+ std::vector< v8::Handle<v8::Value> > argv = ListValueToV8(args);
+ EventBindings::CallFunction(function_name, argv.size(), &argv[0]);
}
diff --git a/chrome/renderer/extensions/renderer_extension_bindings.h b/chrome/renderer/extensions/renderer_extension_bindings.h
index ad370af..5196807 100644
--- a/chrome/renderer/extensions/renderer_extension_bindings.h
+++ b/chrome/renderer/extensions/renderer_extension_bindings.h
@@ -9,6 +9,7 @@
#include <string>
+class ListValue;
class RenderThreadBase;
// This class adds extension-related javascript bindings to a renderer. It is
@@ -21,19 +22,8 @@ class RendererExtensionBindings {
// Creates an instance of the extension.
static v8::Extension* Get();
- // Notify any listeners that a message channel has been opened to this
- // process. |tab_json| is the info for the tab that initiated this
- // connection, or "null" if the initiator was not a tab.
- static void HandleConnect(int port_id, const std::string& tab_json);
-
- // Dispatch the given message sent on this channel.
- static void HandleMessage(const std::string& message, int port_id);
-
- // Send this event to all extensions in this process. |args| is a JSON-
- // serialized array that will be deserialized and provided to the callback
- // function in event_bindings.js
- static void HandleEvent(const std::string& event_name,
- const std::string& args);
+ // Call the given javascript function with the specified arguments.
+ static void Invoke(const std::string& function_name, const ListValue& args);
};
#endif // CHROME_RENDERER_EXTENSIONS_RENDERER_EXTENSION_BINDINGS_H_
diff --git a/chrome/renderer/render_thread.cc b/chrome/renderer/render_thread.cc
index e615a49..e4905982 100644
--- a/chrome/renderer/render_thread.cc
+++ b/chrome/renderer/render_thread.cc
@@ -226,12 +226,8 @@ void RenderThread::OnControlMessageReceived(const IPC::Message& msg) {
OnUpdateUserScripts)
// TODO(rafaelw): create an ExtensionDispatcher that handles extension
// messages seperates their handling from the RenderThread.
- IPC_MESSAGE_HANDLER(ViewMsg_ExtensionHandleConnect,
- OnExtensionHandleConnect)
- IPC_MESSAGE_HANDLER(ViewMsg_ExtensionHandleMessage,
- OnExtensionHandleMessage)
- IPC_MESSAGE_HANDLER(ViewMsg_ExtensionHandleEvent,
- OnExtensionHandleEvent)
+ IPC_MESSAGE_HANDLER(ViewMsg_ExtensionMessageInvoke,
+ OnExtensionMessageInvoke)
IPC_MESSAGE_HANDLER(ViewMsg_Extension_SetFunctionNames,
OnSetExtensionFunctionNames)
IPC_MESSAGE_HANDLER(ViewMsg_PurgePluginListCache,
@@ -382,19 +378,9 @@ void RenderThread::EnsureWebKitInitialized() {
WebKit::enableMediaPlayer();
}
-void RenderThread::OnExtensionHandleConnect(int port_id,
- const std::string& tab_json) {
- RendererExtensionBindings::HandleConnect(port_id, tab_json);
-}
-
-void RenderThread::OnExtensionHandleMessage(const std::string& message,
- int port_id) {
- RendererExtensionBindings::HandleMessage(message, port_id);
-}
-
-void RenderThread::OnExtensionHandleEvent(const std::string event_name,
- const std::string event_data) {
- RendererExtensionBindings::HandleEvent(event_name, event_data);
+void RenderThread::OnExtensionMessageInvoke(const std::string& function_name,
+ const ListValue& args) {
+ RendererExtensionBindings::Invoke(function_name, args);
}
void RenderThread::OnPurgePluginListCache() {
diff --git a/chrome/renderer/render_thread.h b/chrome/renderer/render_thread.h
index 56be75e..83475d9 100644
--- a/chrome/renderer/render_thread.h
+++ b/chrome/renderer/render_thread.h
@@ -18,6 +18,7 @@
class AppCacheDispatcher;
class DevToolsAgentFilter;
class FilePath;
+class ListValue;
class NotificationService;
class RenderDnsMaster;
class RendererHistogram;
@@ -135,10 +136,8 @@ class RenderThread : public RenderThreadBase,
// Send all histograms to browser.
void OnGetRendererHistograms(int sequence_number);
- void OnExtensionHandleConnect(int channel_id, const std::string& tab_json);
- void OnExtensionHandleMessage(const std::string& message, int channel_id);
- void OnExtensionHandleEvent(const std::string event_name,
- const std::string event_data);
+ void OnExtensionMessageInvoke(const std::string& function_name,
+ const ListValue& args);
void OnPurgePluginListCache();
// Gather usage statistics from the in-memory cache and inform our host.
diff --git a/chrome/renderer/renderer_resources.grd b/chrome/renderer/renderer_resources.grd
index cda253b..c59e98c 100644
--- a/chrome/renderer/renderer_resources.grd
+++ b/chrome/renderer/renderer_resources.grd
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- This comment is only here because changes to resources are not picked up
-without changes to the corresponding grd file. -->
+without changes to the corresponding grd file. -->
<grit latest_public_release="0" current_release="1">
<outputs>
<output filename="grit/renderer_resources.h" type="rc_header">
diff --git a/chrome/renderer/resources/renderer_extension_bindings.js b/chrome/renderer/resources/renderer_extension_bindings.js
index cc232b4..31b97ed 100644
--- a/chrome/renderer/resources/renderer_extension_bindings.js
+++ b/chrome/renderer/resources/renderer_extension_bindings.js
@@ -1,5 +1,5 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
+// 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.
// -----------------------------------------------------------------------------
@@ -19,11 +19,9 @@ var chrome = chrome || {};
throw new Error("Port '" + portId + "' already exists.");
}
this.portId_ = portId; // TODO(mpcomplete): readonly
+ this.onDisconnect = new chrome.Event();
this.onMessage = new chrome.Event();
chrome.Port.ports_[portId] = this;
- // Note: this object will never get GCed. If we ever care, we could
- // add an "ondetach" method to the onMessage Event that gets called
- // when there are no more listeners.
};
// Map of port IDs to port object.
@@ -39,6 +37,15 @@ var chrome = chrome || {};
chrome.Event.dispatch_("channel-connect", [port]);
};
+ // Called by native code when a channel has been closed.
+ chrome.Port.dispatchOnDisconnect_ = function(portId) {
+ var port = chrome.Port.ports_[portId];
+ if (port) {
+ port.onDisconnect.dispatch(port);
+ delete chrome.Port.ports_[portId];
+ }
+ };
+
// Called by native code when a message has been sent to the given port.
chrome.Port.dispatchOnMessage_ = function(msg, portId) {
var port = chrome.Port.ports_[portId];