summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorilevy@chromium.org <ilevy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-26 18:32:15 +0000
committerilevy@chromium.org <ilevy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-26 18:32:15 +0000
commit6a17121ff86c9561766b1622e42a613a4768dc1d (patch)
tree8d1b4fd24ccc50d66d458134c0f49a8d76442359 /chrome/renderer
parentccef5edd857c23650107922aedb39681ebff7c38 (diff)
downloadchromium_src-6a17121ff86c9561766b1622e42a613a4768dc1d.zip
chromium_src-6a17121ff86c9561766b1622e42a613a4768dc1d.tar.gz
chromium_src-6a17121ff86c9561766b1622e42a613a4768dc1d.tar.bz2
Revert 158830 - Revert 156678 - Native messaging now uses the MessageService back-end.
Reason: Regression in a ChromeOS extension causing it to continue running after unloading. BUG=142915 Review URL: https://codereview.chromium.org/10818013 TBR=eaugusti@chromium.org TBR=mpcomplete@chromium.org TBR=mmoss, rouslan Review URL: https://codereview.chromium.org/10991044 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@158833 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/extension_custom_bindings.cc34
-rw-r--r--chrome/renderer/extensions/extension_custom_bindings.h3
-rw-r--r--chrome/renderer/resources/extensions/extension_custom_bindings.js44
-rw-r--r--chrome/renderer/resources/extensions/miscellaneous_bindings.js6
4 files changed, 84 insertions, 3 deletions
diff --git a/chrome/renderer/extensions/extension_custom_bindings.cc b/chrome/renderer/extensions/extension_custom_bindings.cc
index 685c180..e3c5afc 100644
--- a/chrome/renderer/extensions/extension_custom_bindings.cc
+++ b/chrome/renderer/extensions/extension_custom_bindings.cc
@@ -15,6 +15,7 @@
#include "chrome/renderer/extensions/dispatcher.h"
#include "chrome/renderer/extensions/extension_helper.h"
#include "content/public/renderer/render_view.h"
+#include "content/public/renderer/v8_value_converter.h"
#include "grit/renderer_resources.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
@@ -31,6 +32,7 @@ ExtensionCustomBindings::ExtensionCustomBindings(Dispatcher* dispatcher)
: ChromeV8Extension(dispatcher) {
RouteStaticFunction("GetExtensionViews", &GetExtensionViews);
RouteStaticFunction("OpenChannelToExtension", &OpenChannelToExtension);
+ RouteStaticFunction("OpenChannelToNativeApp", &OpenChannelToNativeApp);
}
// static
@@ -123,4 +125,36 @@ v8::Handle<v8::Value> ExtensionCustomBindings::OpenChannelToExtension(
return v8::Integer::New(port_id);
}
+// static
+v8::Handle<v8::Value> ExtensionCustomBindings::OpenChannelToNativeApp(
+ const v8::Arguments& args) {
+ // Get the current RenderView so that we can send a routed IPC message from
+ // the correct source.
+ content::RenderView* renderview = GetCurrentRenderView();
+ if (!renderview)
+ return v8::Undefined();
+
+ // The Javascript code should validate/fill the arguments.
+ CHECK(args.Length() >= 3 &&
+ args[0]->IsString() &&
+ args[1]->IsString() &&
+ args[2]->IsString() &&
+ args[3]->IsString());
+
+ std::string extension_id = *v8::String::Utf8Value(args[0]->ToString());
+ std::string native_app_name = *v8::String::Utf8Value(args[1]->ToString());
+ std::string channel_name = *v8::String::Utf8Value(args[2]->ToString());
+ std::string connect_message = *v8::String::Utf8Value(args[3]->ToString());
+
+ int port_id = -1;
+ renderview->Send(new ExtensionHostMsg_OpenChannelToNativeApp(
+ renderview->GetRoutingID(),
+ extension_id,
+ native_app_name,
+ channel_name,
+ connect_message,
+ &port_id));
+ return v8::Integer::New(port_id);
+}
+
} // namespace extensions
diff --git a/chrome/renderer/extensions/extension_custom_bindings.h b/chrome/renderer/extensions/extension_custom_bindings.h
index 682b001..3bc29ee 100644
--- a/chrome/renderer/extensions/extension_custom_bindings.h
+++ b/chrome/renderer/extensions/extension_custom_bindings.h
@@ -21,6 +21,9 @@ class ExtensionCustomBindings : public ChromeV8Extension {
// Creates a new messaging channel to the given extension.
static v8::Handle<v8::Value> OpenChannelToExtension(
const v8::Arguments& args);
+
+ static v8::Handle<v8::Value> OpenChannelToNativeApp(
+ const v8::Arguments& args);
};
} // namespace extensions
diff --git a/chrome/renderer/resources/extensions/extension_custom_bindings.js b/chrome/renderer/resources/extensions/extension_custom_bindings.js
index be19e9c..551e103 100644
--- a/chrome/renderer/resources/extensions/extension_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/extension_custom_bindings.js
@@ -7,6 +7,7 @@
var extensionNatives = requireNative('extension');
var GetExtensionViews = extensionNatives.GetExtensionViews;
var OpenChannelToExtension = extensionNatives.OpenChannelToExtension;
+var OpenChannelToNativeApp = extensionNatives.OpenChannelToNativeApp;
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
@@ -93,6 +94,8 @@ chromeHidden.registerCustomHook('extension',
sendMessageUpdateArguments.bind(null, 'sendRequest'));
apiFunctions.setUpdateArgumentsPreValidate('sendMessage',
sendMessageUpdateArguments.bind(null, 'sendMessage'));
+ apiFunctions.setUpdateArgumentsPreValidate('sendNativeMessage',
+ sendMessageUpdateArguments.bind(null, 'sendNativeMessage'));
apiFunctions.setHandleRequest('sendRequest',
function(targetId, request, responseCallback) {
@@ -108,6 +111,13 @@ chromeHidden.registerCustomHook('extension',
chromeHidden.Port.sendMessageImpl(port, message, responseCallback);
});
+ apiFunctions.setHandleRequest('sendNativeMessage',
+ function(targetId, message, responseCallback) {
+ var port = chrome.extension.connectNative(
+ targetId, message, chromeHidden.kNativeMessageChannel);
+ chromeHidden.Port.sendMessageImpl(port, '', responseCallback);
+ });
+
apiFunctions.setUpdateArgumentsPreValidate('connect', function() {
// Align missing (optional) function arguments with the arguments that
// schema validation is expecting, e.g.
@@ -126,10 +136,29 @@ chromeHidden.registerCustomHook('extension',
connectInfo = arguments[nextArg++];
if (nextArg != arguments.length)
- throw new Error('Invalid arguments to connect');
+ throw new Error('Invalid arguments to connect.');
return [targetId, connectInfo];
});
+ apiFunctions.setUpdateArgumentsPreValidate('connectNative', function() {
+ var nextArg = 0;
+
+ // appName is required.
+ var appName = arguments[nextArg++];
+
+ // connectionMessage is required.
+ var connectMessage = arguments[nextArg++];
+
+ // channelName is only passed by sendMessage
+ var channelName = 'connectNative';
+ if (typeof(arguments[nextArg]) == 'string')
+ channelName = arguments[nextArg++];
+
+ if (nextArg != arguments.length)
+ throw new Error('Invalid arguments to connectNative.');
+ return [appName, {name: channelName, message: connectMessage}];
+ });
+
apiFunctions.setHandleRequest('connect', function(targetId, connectInfo) {
if (!targetId)
targetId = extensionId;
@@ -142,4 +171,17 @@ chromeHidden.registerCustomHook('extension',
return chromeHidden.Port.createPort(portId, name);
throw new Error('Error connecting to extension ' + targetId);
});
+
+ apiFunctions.setHandleRequest('connectNative',
+ function(nativeAppName, connectInfo) {
+ // Turn the object into a string here, because it eventually will be.
+ var portId = OpenChannelToNativeApp(extensionId,
+ nativeAppName,
+ connectInfo.name,
+ JSON.stringify(connectInfo.message));
+ if (portId >= 0) {
+ return chromeHidden.Port.createPort(portId, connectInfo.name);
+ }
+ throw new Error('Error connecting to native app: ' + nativeAppName);
+ });
});
diff --git a/chrome/renderer/resources/extensions/miscellaneous_bindings.js b/chrome/renderer/resources/extensions/miscellaneous_bindings.js
index d860bab..e9d972d 100644
--- a/chrome/renderer/resources/extensions/miscellaneous_bindings.js
+++ b/chrome/renderer/resources/extensions/miscellaneous_bindings.js
@@ -27,6 +27,7 @@
// Note: sendRequest is deprecated.
chromeHidden.kRequestChannel = "chrome.extension.sendRequest";
chromeHidden.kMessageChannel = "chrome.extension.sendMessage";
+ chromeHidden.kNativeMessageChannel = "chrome.extension.sendNativeMessage";
// Map of port IDs to port object.
var ports = {};
@@ -257,9 +258,10 @@
// Shared implementation used by tabs.sendMessage and extension.sendMessage.
chromeHidden.Port.sendMessageImpl = function(port, request,
responseCallback) {
- port.postMessage(request);
+ if (port.name != chromeHidden.kNativeMessageChannel)
+ port.postMessage(request);
- if (port.name == chromeHidden.kMessageChannel && !responseCallback) {
+ if (port.name != chromeHidden.kRequestChannel && !responseCallback) {
// TODO(mpcomplete): Do this for the old sendRequest API too, after
// verifying it doesn't break anything.
// Go ahead and disconnect immediately if the sender is not expecting