Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5178)

Unified Diff: chrome/renderer/resources/extensions/schema_generated_bindings.js

Issue 8540012: Enable extension APIs for content scripts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/renderer/resources/extensions/schema_generated_bindings.js
diff --git a/chrome/renderer/resources/extensions/extension_process_bindings.js b/chrome/renderer/resources/extensions/schema_generated_bindings.js
similarity index 96%
rename from chrome/renderer/resources/extensions/extension_process_bindings.js
rename to chrome/renderer/resources/extensions/schema_generated_bindings.js
index 96db3680440ac2be55915a2ea65468198c0fe7c2..6f085b711f7b7aa8ec7a3055aeec11105e778c62 100644
--- a/chrome/renderer/resources/extensions/extension_process_bindings.js
+++ b/chrome/renderer/resources/extensions/schema_generated_bindings.js
@@ -574,9 +574,6 @@ var chrome = chrome || {};
chromeHidden.onLoad.addListener(function(extensionId, isExtensionProcess,
isIncognitoProcess) {
- if (!isExtensionProcess)
- return;
-
// Setup the ChromeSetting class so we can use it to construct
// ChromeSetting objects from the API definition.
setupChromeSetting();
@@ -596,7 +593,7 @@ var chrome = chrome || {};
// TODO(rafaelw): Handle synchronous functions.
// TOOD(rafaelw): Consider providing some convenient override points
// for api functions that wish to insert themselves into the call.
- var apiDefinitions = chromeHidden.JSON.parse(GetExtensionAPIDefinition());
+ var apiDefinitions = GetExtensionAPIDefinition();
var platform = getPlatform();
apiDefinitions.forEach(function(apiDef) {
@@ -622,13 +619,31 @@ var chrome = chrome || {};
});
}
+ // Adds a getter that throws an access denied error to object |module|
+ // for property |name| described by |schemaNode| if necessary.
+ //
+ // Returns true if the getter was necessary (access is disallowed), or
+ // false otherwise.
+ function addUnprivilegedAccessGetter(module, name, allowUnprivileged) {
+ if (allowUnprivileged || isExtensionProcess)
+ return false;
+
+ module.__defineGetter__(name, function() {
+ throw new Error(
+ '"' + name + '" can only be used in extension processes. See ' +
+ 'the content scripts documentation for more details.');
+ });
+ return true;
+ }
+
// Setup Functions.
if (apiDef.functions) {
apiDef.functions.forEach(function(functionDef) {
- // Module functions may have been defined earlier by hand. Don't
- // clobber them.
- if (module[functionDef.name])
+ if (functionDef.name in module ||
+ addUnprivilegedAccessGetter(module, functionDef.name,
+ functionDef.unprivileged)) {
return;
+ }
var apiFunction = {};
apiFunction.definition = functionDef;
@@ -666,10 +681,11 @@ var chrome = chrome || {};
// Setup Events
if (apiDef.events) {
apiDef.events.forEach(function(eventDef) {
- // Module events may have been defined earlier by hand. Don't clobber
- // them.
- if (module[eventDef.name])
+ if (eventDef.name in module ||
+ addUnprivilegedAccessGetter(module, eventDef.name,
+ eventDef.unprivileged)) {
return;
+ }
var eventName = apiDef.namespace + "." + eventDef.name;
if (apiDef.namespace == "experimental.webRequest") {
@@ -686,6 +702,11 @@ var chrome = chrome || {};
// Parse any values defined for properties.
if (def.properties) {
forEach(def.properties, function(prop, property) {
+ if (prop in m ||
+ addUnprivilegedAccessGetter(m, prop, property.unprivileged)) {
+ return;
+ }
+
var value = property.value;
if (value) {
if (property.type === 'integer') {
@@ -719,6 +740,14 @@ var chrome = chrome || {};
addProperties(module, apiDef);
});
+ // TODO(aa): The rest of the crap below this really needs to be factored out
+ // with a clean API boundary. Right now it is too soupy for me to feel
+ // comfortable running in content scripts. What if people are just
+ // overwriting random APIs? That would bypass our content script access
+ // checks.
+ if (!isExtensionProcess)
+ return;
+
// getTabContentses is retained for backwards compatibility
// See http://crbug.com/21433
chrome.extension.getTabContentses = chrome.extension.getExtensionTabs;
« no previous file with comments | « chrome/renderer/resources/extensions/renderer_process_bindings.js ('k') | chrome/test/base/chrome_render_view_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698