diff options
author | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-09 12:58:03 +0000 |
---|---|---|
committer | kalman@chromium.org <kalman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-09 12:58:03 +0000 |
commit | bcdd992ff0e84a9cdeff1ac0f7982cd6f2898782 (patch) | |
tree | 93396c2b940df3d955222b86ab85b2f3a915f310 /chrome/renderer | |
parent | c098b098c9eed54f8518a19eac865e9f0585a427 (diff) | |
download | chromium_src-bcdd992ff0e84a9cdeff1ac0f7982cd6f2898782.zip chromium_src-bcdd992ff0e84a9cdeff1ac0f7982cd6f2898782.tar.gz chromium_src-bcdd992ff0e84a9cdeff1ac0f7982cd6f2898782.tar.bz2 |
Implement externally_connectable! Web pages can now communicate directly with
extensions via chrome.runtime.connect() and chrome.runtime.sendMessage() without
needing to proxy via a content script.
BUG=55316
Review URL: https://chromiumcodereview.appspot.com/16174005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205116 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
4 files changed, 21 insertions, 22 deletions
diff --git a/chrome/renderer/extensions/dispatcher.cc b/chrome/renderer/extensions/dispatcher.cc index a55632f..39a7c26 100644 --- a/chrome/renderer/extensions/dispatcher.cc +++ b/chrome/renderer/extensions/dispatcher.cc @@ -995,9 +995,9 @@ void Dispatcher::DidCreateScriptContext( switch (context_type) { case Feature::UNSPECIFIED_CONTEXT: case Feature::WEB_PAGE_CONTEXT: - // TODO(kalman): see comment below about ExtensionAPI. - InstallBindings(module_system, v8_context, "app"); - InstallBindings(module_system, v8_context, "webstore"); + RegisterBinding("app", context); + RegisterBinding("runtime", context); // for connect() and sendMessage() + RegisterBinding("webstore", context); break; case Feature::BLESSED_EXTENSION_CONTEXT: case Feature::UNBLESSED_EXTENSION_CONTEXT: diff --git a/chrome/renderer/extensions/runtime_custom_bindings.cc b/chrome/renderer/extensions/runtime_custom_bindings.cc index 0f4801f..587fcb7 100644 --- a/chrome/renderer/extensions/runtime_custom_bindings.cc +++ b/chrome/renderer/extensions/runtime_custom_bindings.cc @@ -47,16 +47,14 @@ v8::Handle<v8::Value> RuntimeCustomBindings::OpenChannelToExtension( return v8::Undefined(); // The Javascript code should validate/fill the arguments. - CHECK(args.Length() >= 3 && - args[0]->IsString() && - args[1]->IsString() && - args[2]->IsString()); + CHECK_EQ(2, args.Length()); + CHECK(args[0]->IsString() && args[1]->IsString()); ExtensionMsg_ExternalConnectionInfo info; - info.source_id = *v8::String::Utf8Value(args[0]->ToString()); - info.target_id = *v8::String::Utf8Value(args[1]->ToString()); + info.source_id = context()->extension() ? context()->extension()->id() : ""; + info.target_id = *v8::String::Utf8Value(args[0]->ToString()); info.source_url = renderview->GetWebView()->mainFrame()->document().url(); - std::string channel_name = *v8::String::Utf8Value(args[2]->ToString()); + std::string channel_name = *v8::String::Utf8Value(args[1]->ToString()); int port_id = -1; renderview->Send(new ExtensionHostMsg_OpenChannelToExtension( renderview->GetRoutingID(), info, channel_name, &port_id)); @@ -103,4 +101,4 @@ v8::Handle<v8::Value> RuntimeCustomBindings::GetManifest( context()->v8_context()); } -} // extensions +} // namespace extensions diff --git a/chrome/renderer/resources/extensions/miscellaneous_bindings.js b/chrome/renderer/resources/extensions/miscellaneous_bindings.js index 108835c..3fc7010 100644 --- a/chrome/renderer/resources/extensions/miscellaneous_bindings.js +++ b/chrome/renderer/resources/extensions/miscellaneous_bindings.js @@ -205,7 +205,9 @@ // the right event. var isExternal = sourceExtensionId != extensionId; - var sender = {id: sourceExtensionId}; + var sender = {}; + if (sourceExtensionId != '') + sender.id = sourceExtensionId; if (sourceUrl) sender.url = sourceUrl; if (sourceTab) diff --git a/chrome/renderer/resources/extensions/runtime_custom_bindings.js b/chrome/renderer/resources/extensions/runtime_custom_bindings.js index 85f0476..66245c9 100644 --- a/chrome/renderer/resources/extensions/runtime_custom_bindings.js +++ b/chrome/renderer/resources/extensions/runtime_custom_bindings.js @@ -82,22 +82,21 @@ binding.registerCustomHook(function(binding, id, contextType) { }); apiFunctions.setHandleRequest('connect', function(targetId, connectInfo) { + // Don't let orphaned content scripts communicate with their extension. + // http://crbug.com/168263 + if (unloadEvent.wasDispatched) + throw new Error('Error connecting to extension ' + targetId); + if (!targetId) targetId = runtime.id; + var name = ''; if (connectInfo && connectInfo.name) name = connectInfo.name; - // Don't let orphaned content scripts communicate with their extension. - // http://crbug.com/168263 - if (!unloadEvent.wasDispatched) { - var portId = runtimeNatives.OpenChannelToExtension(runtime.id, - targetId, - name); - if (portId >= 0) - return miscBindings.createPort(portId, name); - } - throw new Error('Error connecting to extension ' + targetId); + var portId = runtimeNatives.OpenChannelToExtension(targetId, name); + if (portId >= 0) + return miscBindings.createPort(portId, name); }); // |