summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_function_dispatcher.cc
diff options
context:
space:
mode:
authorrafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-28 16:20:47 +0000
committerrafaelw@chromium.org <rafaelw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-08-28 16:20:47 +0000
commitb84ae679f054d846372e8e8ded5c31e8e9dc2ec8 (patch)
tree685b40227a5d08e327d2c558bc1f65ba61f640df /chrome/browser/extensions/extension_function_dispatcher.cc
parent899c3e93acbd41bcd3c5ce5d09eddef8f45ab3ff (diff)
downloadchromium_src-b84ae679f054d846372e8e8ded5c31e8e9dc2ec8.zip
chromium_src-b84ae679f054d846372e8e8ded5c31e8e9dc2ec8.tar.gz
chromium_src-b84ae679f054d846372e8e8ded5c31e8e9dc2ec8.tar.bz2
Expose Extension Bindings to Component Applications
This patch allows component (built-in) extension apps to have extension api bindings. Note that this patch adds browser-side api permission checking for extension requests. This is step two along the path to exposing an extension management api to the gallery (webstore). BUG=27431 Review URL: http://codereview.chromium.org/3163044 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@57788 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/extensions/extension_function_dispatcher.cc')
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc21
1 files changed, 20 insertions, 1 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc
index 51cc8fe..a8253cf 100644
--- a/chrome/browser/extensions/extension_function_dispatcher.cc
+++ b/chrome/browser/extensions/extension_function_dispatcher.cc
@@ -333,7 +333,13 @@ ExtensionFunctionDispatcher* ExtensionFunctionDispatcher::Create(
render_view_host->process()->profile()->GetExtensionsService();
DCHECK(service);
+ if (!service->ExtensionBindingsAllowed(url))
+ return NULL;
+
Extension* extension = service->GetExtensionByURL(url);
+ if (!extension)
+ extension = service->GetExtensionByWebExtent(url);
+
if (extension)
return new ExtensionFunctionDispatcher(render_view_host, delegate,
extension, url);
@@ -350,10 +356,12 @@ ExtensionFunctionDispatcher::ExtensionFunctionDispatcher(
render_view_host_(render_view_host),
delegate_(delegate),
url_(url),
+ extension_id_(extension->id()),
ALLOW_THIS_IN_INITIALIZER_LIST(peer_(new Peer(this))) {
// TODO(erikkay) should we do something for these errors in Release?
- DCHECK(url.SchemeIs(chrome::kExtensionScheme));
DCHECK(extension);
+ DCHECK(url.SchemeIs(chrome::kExtensionScheme) ||
+ extension->location() == Extension::COMPONENT);
// Notify the ExtensionProcessManager that the view was created.
ExtensionProcessManager* epm = profile()->GetExtensionProcessManager();
@@ -448,6 +456,17 @@ void ExtensionFunctionDispatcher::HandleRequest(
DCHECK(extension);
function->set_include_incognito(service->IsIncognitoEnabled(extension));
+ std::string permission_name = function->name();
+ size_t separator = permission_name.find_first_of("./");
+ if (separator != std::string::npos)
+ permission_name = permission_name.substr(0, separator);
+
+ if (!service->ExtensionBindingsAllowed(function->source_url()) ||
+ !extension->HasApiPermission(permission_name)) {
+ render_view_host_->BlockExtensionRequest(function->request_id());
+ return;
+ }
+
ExtensionsQuotaService* quota = service->quota_service();
if (quota->Assess(extension_id(), function, &params.arguments,
base::TimeTicks::Now())) {