diff options
author | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 19:32:43 +0000 |
---|---|---|
committer | mpcomplete@google.com <mpcomplete@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-17 19:32:43 +0000 |
commit | dfcb62a173898e182e2f10ca635deb753977b9f8 (patch) | |
tree | 39d4ca8b82cfc9f39f1726d4b0ad061cb141c516 /chrome/renderer | |
parent | 851c567a756e96913098ac03d84fb9ea5761558d (diff) | |
download | chromium_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.cc | 78 | ||||
-rw-r--r-- | chrome/renderer/extensions/renderer_extension_bindings.h | 16 | ||||
-rw-r--r-- | chrome/renderer/render_thread.cc | 24 | ||||
-rw-r--r-- | chrome/renderer/render_thread.h | 7 | ||||
-rw-r--r-- | chrome/renderer/renderer_resources.grd | 2 | ||||
-rw-r--r-- | chrome/renderer/resources/renderer_extension_bindings.js | 17 |
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]; |