diff options
author | ilevy@chromium.org <ilevy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-26 18:32:15 +0000 |
---|---|---|
committer | ilevy@chromium.org <ilevy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-26 18:32:15 +0000 |
commit | 6a17121ff86c9561766b1622e42a613a4768dc1d (patch) | |
tree | 8d1b4fd24ccc50d66d458134c0f49a8d76442359 /chrome/renderer | |
parent | ccef5edd857c23650107922aedb39681ebff7c38 (diff) | |
download | chromium_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')
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 |