summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorbenwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-07 08:48:58 +0000
committerbenwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-07 08:48:58 +0000
commitd3b010ef8dfca875758b002ef8effa67e5ba8898 (patch)
treefb9a88acea3da789bc2b5d6ea4e4241013543881 /chrome/renderer
parentd1b47acb949d452a3931370a9423d080c099e711 (diff)
downloadchromium_src-d3b010ef8dfca875758b002ef8effa67e5ba8898.zip
chromium_src-d3b010ef8dfca875758b002ef8effa67e5ba8898.tar.gz
chromium_src-d3b010ef8dfca875758b002ef8effa67e5ba8898.tar.bz2
Allow updateArgumentsPostValidate to support callbacks and added / removed arguments.
This also pulls the normalization code out of schema_generated_bindings.js. BUG=None TEST=Existing tests Review URL: https://chromiumcodereview.appspot.com/10535030 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@140980 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/extensions/event_unittest.cc1
-rw-r--r--chrome/renderer/extensions/extension_dispatcher.cc1
-rw-r--r--chrome/renderer/renderer_resources.grd1
-rw-r--r--chrome/renderer/resources/extensions/content_settings_custom_bindings.js18
-rw-r--r--chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js3
-rw-r--r--chrome/renderer/resources/extensions/event.js10
-rw-r--r--chrome/renderer/resources/extensions/schema_generated_bindings.js168
-rw-r--r--chrome/renderer/resources/extensions/schema_utils.js161
-rw-r--r--chrome/renderer/resources/extensions/send_request.js7
-rw-r--r--chrome/renderer/resources/extensions/storage_custom_bindings.js16
-rw-r--r--chrome/renderer/resources/extensions/types_custom_bindings.js13
-rw-r--r--chrome/renderer/resources/extensions/web_request_custom_bindings.js4
12 files changed, 214 insertions, 189 deletions
diff --git a/chrome/renderer/extensions/event_unittest.cc b/chrome/renderer/extensions/event_unittest.cc
index 61fa9ca..947d3e8 100644
--- a/chrome/renderer/extensions/event_unittest.cc
+++ b/chrome/renderer/extensions/event_unittest.cc
@@ -14,6 +14,7 @@ class EventUnittest : public ModuleSystemTest {
module_system_->RunString("chrome = {};", "setup-chrome");
RegisterModule("event", IDR_EVENT_BINDINGS_JS);
+ RegisterModule("schemaUtils", IDR_SCHEMA_UTILS_JS);
RegisterModule("utils", IDR_UTILS_JS);
// Mock out the native handler for event_bindings. These mocks will fail if
diff --git a/chrome/renderer/extensions/extension_dispatcher.cc b/chrome/renderer/extensions/extension_dispatcher.cc
index d1ed29a..838746a 100644
--- a/chrome/renderer/extensions/extension_dispatcher.cc
+++ b/chrome/renderer/extensions/extension_dispatcher.cc
@@ -540,6 +540,7 @@ void ExtensionDispatcher::PopulateSourceMap() {
source_map_.RegisterSource("apitest", IDR_EXTENSION_APITEST_JS);
// Libraries.
+ source_map_.RegisterSource("schemaUtils", IDR_SCHEMA_UTILS_JS);
source_map_.RegisterSource("sendRequest", IDR_SEND_REQUEST_JS);
source_map_.RegisterSource("setIcon", IDR_SET_ICON_JS);
source_map_.RegisterSource("utils", IDR_UTILS_JS);
diff --git a/chrome/renderer/renderer_resources.grd b/chrome/renderer/renderer_resources.grd
index 1edc9ec..421a70d 100644
--- a/chrome/renderer/renderer_resources.grd
+++ b/chrome/renderer/renderer_resources.grd
@@ -30,6 +30,7 @@ without changes to the corresponding grd file. fb9 -->
<include name="IDR_SCHEMA_GENERATED_BINDINGS_JS" file="resources\extensions\schema_generated_bindings.js" type="BINDATA" />
<!-- Libraries. -->
+ <include name="IDR_SCHEMA_UTILS_JS" file="resources\extensions\schema_utils.js" type="BINDATA" />
<include name="IDR_SEND_REQUEST_JS" file="resources\extensions\send_request.js" type="BINDATA" />
<include name="IDR_SET_ICON_JS" file="resources\extensions\set_icon.js" type="BINDATA" />
<include name="IDR_UTILS_JS" file="resources\extensions\utils.js" type="BINDATA" />
diff --git a/chrome/renderer/resources/extensions/content_settings_custom_bindings.js b/chrome/renderer/resources/extensions/content_settings_custom_bindings.js
index 826ff45..d92efc1 100644
--- a/chrome/renderer/resources/extensions/content_settings_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/content_settings_custom_bindings.js
@@ -6,6 +6,7 @@
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var sendRequest = require('sendRequest').sendRequest;
+var validate = require('schemaUtils').validate;
chromeHidden.registerCustomType('contentSettings.ContentSetting', function() {
function extendSchema(schema) {
@@ -16,30 +17,31 @@ chromeHidden.registerCustomType('contentSettings.ContentSetting', function() {
function ContentSetting(contentType, settingSchema) {
this.get = function(details, callback) {
- var getSchema = this.parameters.get;
- chromeHidden.validate([details, callback], getSchema);
+ var getSchema = this.functionSchemas.get.definition.parameters;
+ validate([details, callback], getSchema);
return sendRequest('contentSettings.get',
[contentType, details, callback],
extendSchema(getSchema));
};
this.set = function(details, callback) {
- var setSchema = this.parameters.set.slice();
+ var setSchema = this.functionSchemas.set.definition.parameters.slice();
setSchema[0].properties.setting = settingSchema;
- chromeHidden.validate([details, callback], setSchema);
+ validate([details, callback], setSchema);
return sendRequest('contentSettings.set',
[contentType, details, callback],
extendSchema(setSchema));
};
this.clear = function(details, callback) {
- var clearSchema = this.parameters.clear;
- chromeHidden.validate([details, callback], clearSchema);
+ var clearSchema = this.functionSchemas.clear.definition.parameters;
+ validate([details, callback], clearSchema);
return sendRequest('contentSettings.clear',
[contentType, details, callback],
extendSchema(clearSchema));
};
this.getResourceIdentifiers = function(callback) {
- var schema = this.parameters.getResourceIdentifiers;
- chromeHidden.validate([callback], schema);
+ var schema =
+ this.functionSchemas.getResourceIdentifiers.definition.parameters;
+ validate([callback], schema);
return sendRequest(
'contentSettings.getResourceIdentifiers',
[contentType, callback],
diff --git a/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js b/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
index 5a8d798..4d3c3df 100644
--- a/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/declarative_webrequest_custom_bindings.js
@@ -6,6 +6,7 @@
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var utils = require('utils');
+var validate = require('schemaUtils').validate;
chromeHidden.registerCustomHook('declarativeWebRequest', function(api) {
// Returns the schema definition of type |typeId| defined in |namespace|.
@@ -29,7 +30,7 @@ chromeHidden.registerCustomHook('declarativeWebRequest', function(api) {
}
instance.instanceType = 'declarativeWebRequest.' + typeId;
var schema = getSchema('declarativeWebRequest', typeId);
- chromeHidden.validate([instance], [schema]);
+ validate([instance], [schema]);
}
// Setup all data types for the declarative webRequest API.
diff --git a/chrome/renderer/resources/extensions/event.js b/chrome/renderer/resources/extensions/event.js
index 8961ce5..72cc7bb 100644
--- a/chrome/renderer/resources/extensions/event.js
+++ b/chrome/renderer/resources/extensions/event.js
@@ -7,6 +7,7 @@
var DetachEvent = eventBindingsNatives.DetachEvent;
var sendRequest = require('sendRequest').sendRequest;
var utils = require('utils');
+ var validate = require('schemaUtils').validate;
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var GetExtensionAPIDefinition =
@@ -99,12 +100,11 @@
// Validate event arguments (the data that is passed to the callbacks)
// if we are in debug.
if (opt_argSchemas &&
- chromeHidden.validateCallbacks &&
- chromeHidden.validate) {
+ chromeHidden.validateCallbacks) {
this.validateEventArgs_ = function(args) {
try {
- chromeHidden.validate(args, opt_argSchemas);
+ validate(args, opt_argSchemas);
} catch (exception) {
return "Event validation error during " + opt_eventName + " -- " +
exception;
@@ -306,8 +306,8 @@
var conditionsSchema = buildArrayOfChoicesSchema(conditions);
var actionsSchema = buildArrayOfChoicesSchema(actions);
rules.forEach(function(rule) {
- chromeHidden.validate([rule.conditions], [conditionsSchema]);
- chromeHidden.validate([rule.actions], [actionsSchema]);
+ validate([rule.conditions], [conditionsSchema]);
+ validate([rule.actions], [actionsSchema]);
})
};
diff --git a/chrome/renderer/resources/extensions/schema_generated_bindings.js b/chrome/renderer/resources/extensions/schema_generated_bindings.js
index 29700bb..11fee33 100644
--- a/chrome/renderer/resources/extensions/schema_generated_bindings.js
+++ b/chrome/renderer/resources/extensions/schema_generated_bindings.js
@@ -16,6 +16,7 @@
var utils = require('utils');
var isDevChannel = requireNative('channel').IsDevChannel;
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+ var schemaUtils = require('schemaUtils');
// The object to generate the bindings for "internal" APIs in, so that
// extensions can't directly call them (without access to chromeHidden),
@@ -26,156 +27,6 @@
var internalAPIs = {};
chromeHidden.internalAPIs = internalAPIs;
- // Validate arguments.
- var schemaValidator = new chromeHidden.JSONSchemaValidator();
- chromeHidden.validate = function(args, parameterSchemas) {
- if (args.length > parameterSchemas.length)
- throw new Error("Too many arguments.");
-
- for (var i = 0; i < parameterSchemas.length; i++) {
- if (i in args && args[i] !== null && args[i] !== undefined) {
- schemaValidator.resetErrors();
- schemaValidator.validate(args[i], parameterSchemas[i]);
- if (schemaValidator.errors.length == 0)
- continue;
-
- var message = "Invalid value for argument " + (i + 1) + ". ";
- for (var i = 0, err; err = schemaValidator.errors[i]; i++) {
- if (err.path) {
- message += "Property '" + err.path + "': ";
- }
- message += err.message;
- message = message.substring(0, message.length - 1);
- message += ", ";
- }
- message = message.substring(0, message.length - 2);
- message += ".";
-
- throw new Error(message);
- } else if (!parameterSchemas[i].optional) {
- throw new Error("Parameter " + (i + 1) + " is required.");
- }
- }
- };
-
- // Generate all possible signatures for a given API function.
- function getSignatures(parameterSchemas) {
- if (parameterSchemas.length === 0)
- return [[]];
-
- var signatures = [];
- var remaining = getSignatures(parameterSchemas.slice(1));
- for (var i = 0; i < remaining.length; i++)
- signatures.push([parameterSchemas[0]].concat(remaining[i]))
-
- if (parameterSchemas[0].optional)
- return signatures.concat(remaining);
- return signatures;
- };
-
- // Return true if arguments match a given signature's schema.
- function argumentsMatchSignature(args, candidateSignature) {
- if (args.length != candidateSignature.length)
- return false;
-
- for (var i = 0; i < candidateSignature.length; i++) {
- var argType = chromeHidden.JSONSchemaValidator.getType(args[i]);
- if (!schemaValidator.isValidSchemaType(argType, candidateSignature[i]))
- return false;
- }
- return true;
- };
-
- // Finds the function signature for the given arguments.
- function resolveSignature(args, definedSignature) {
- var candidateSignatures = getSignatures(definedSignature);
- for (var i = 0; i < candidateSignatures.length; i++) {
- if (argumentsMatchSignature(args, candidateSignatures[i]))
- return candidateSignatures[i];
- }
- return null;
- };
-
- // Returns a string representing the defined signature of the API function.
- // Example return value for chrome.windows.getCurrent:
- // "windows.getCurrent(optional object populate, function callback)"
- function getParameterSignatureString(name, definedSignature) {
- var getSchemaTypeString = function(schema) {
- var schemaTypes = schemaValidator.getAllTypesForSchema(schema);
- var typeName = schemaTypes.join(" or ") + " " + schema.name;
- if (schema.optional)
- return "optional " + typeName;
- return typeName;
- };
-
- var typeNames = definedSignature.map(getSchemaTypeString);
- return name + "(" + typeNames.join(", ") + ")";
- };
-
- // Returns a string representing a call to an API function.
- // Example return value for call: chrome.windows.get(1, callback) is:
- // "windows.get(int, function)"
- function getArgumentSignatureString(name, args) {
- var typeNames = args.map(chromeHidden.JSONSchemaValidator.getType);
- return name + "(" + typeNames.join(", ") + ")";
- };
-
- // Finds the correct signature for the given arguments, then validates the
- // arguments against that signature. Returns a 'normalized' arguments list
- // where nulls are inserted where optional parameters were omitted.
- function normalizeArgumentsAndValidate(args, funDef) {
- if (funDef.allowAmbiguousOptionalArguments) {
- chromeHidden.validate(args, funDef.definition.parameters);
- return args;
- }
-
- var definedSignature = funDef.definition.parameters;
- var resolvedSignature = resolveSignature(args, definedSignature);
- if (!resolvedSignature)
- throw new Error("Invocation of form " +
- getArgumentSignatureString(funDef.name, args) +
- " doesn't match definition " +
- getParameterSignatureString(funDef.name, definedSignature));
-
- chromeHidden.validate(args, resolvedSignature);
-
- var normalizedArgs = [];
- var ai = 0;
- for (var si = 0; si < definedSignature.length; si++) {
- if (definedSignature[si] === resolvedSignature[ai])
- normalizedArgs.push(args[ai++]);
- else
- normalizedArgs.push(null);
- }
- return normalizedArgs;
- };
-
- // Validates that a given schema for an API function is not ambiguous.
- function isFunctionSignatureAmbiguous(functionDef) {
- if (functionDef.allowAmbiguousOptionalArguments)
- return false;
-
- var signaturesAmbiguous = function(signature1, signature2) {
- if (signature1.length != signature2.length)
- return false;
-
- for (var i = 0; i < signature1.length; i++) {
- if (!schemaValidator.checkSchemaOverlap(signature1[i], signature2[i]))
- return false;
- }
- return true;
- };
-
- var candidateSignatures = getSignatures(functionDef.parameters);
- for (var i = 0; i < candidateSignatures.length; i++) {
- for (var j = i + 1; j < candidateSignatures.length; j++) {
- if (signaturesAmbiguous(candidateSignatures[i], candidateSignatures[j]))
- return true;
- }
- }
- return false;
- };
-
// Stores the name and definition of each API function, with methods to
// modify their behaviour (such as a custom way to handle requests to the
// API, a custom callback, etc).
@@ -295,9 +146,12 @@
// The functions in the schema are in list form, so we move them into a
// dictionary for easier access.
var self = this;
- self.parameters = {};
+ self.functionSchemas = {};
schema.functions.forEach(function(f) {
- self.parameters[f.name] = f.parameters;
+ self.functionSchemas[f.name] = {
+ name: f.name,
+ definition: f
+ }
});
};
@@ -390,7 +244,7 @@
if (!isSchemaNodeSupported(t, platform, manifestVersion))
return;
- schemaValidator.addTypes(t);
+ schemaUtils.schemaValidator.addTypes(t);
if (t.type == 'object' && customTypes[t.id]) {
customTypes[t.id].prototype.setSchema(t);
}
@@ -444,7 +298,8 @@
// to do that we would need to better factor this code so that it
// doesn't depend on so much v8::Extension machinery.
if (chromeHidden.validateAPI &&
- isFunctionSignatureAmbiguous(apiFunction.definition)) {
+ schemaUtils.isFunctionSignatureAmbiguous(
+ apiFunction.definition)) {
throw new Error(
apiFunction.name + ' has ambiguous optional arguments. ' +
'To implement custom disambiguation logic, add ' +
@@ -458,7 +313,7 @@
if (this.updateArgumentsPreValidate)
args = this.updateArgumentsPreValidate.apply(this, args);
- args = normalizeArgumentsAndValidate(args, this);
+ args = schemaUtils.normalizeArgumentsAndValidate(args, this);
if (this.updateArgumentsPostValidate)
args = this.updateArgumentsPostValidate.apply(this, args);
@@ -473,9 +328,8 @@
// Validate return value if defined - only in debug.
if (chromeHidden.validateCallbacks &&
- chromeHidden.validate &&
this.definition.returns) {
- chromeHidden.validate([retval], [this.definition.returns]);
+ schemaUtils.validate([retval], [this.definition.returns]);
}
return retval;
}).bind(apiFunction);
diff --git a/chrome/renderer/resources/extensions/schema_utils.js b/chrome/renderer/resources/extensions/schema_utils.js
new file mode 100644
index 0000000..a2587a2
--- /dev/null
+++ b/chrome/renderer/resources/extensions/schema_utils.js
@@ -0,0 +1,161 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Routines used to validate and normalize arguments.
+
+var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+
+// TODO(benwells): unit test this file.
+// JSONSchemaValidator is not loaded in unit tests.
+var validate;
+if (chromeHidden.JSONSchemaValidator) {
+ var schemaValidator = new chromeHidden.JSONSchemaValidator();
+
+ // Validate arguments.
+ validate = function(args, parameterSchemas) {
+ if (args.length > parameterSchemas.length)
+ throw new Error("Too many arguments.");
+ for (var i = 0; i < parameterSchemas.length; i++) {
+ if (i in args && args[i] !== null && args[i] !== undefined) {
+ schemaValidator.resetErrors();
+ schemaValidator.validate(args[i], parameterSchemas[i]);
+ if (schemaValidator.errors.length == 0)
+ continue;
+ var message = "Invalid value for argument " + (i + 1) + ". ";
+ for (var i = 0, err;
+ err = schemaValidator.errors[i]; i++) {
+ if (err.path) {
+ message += "Property '" + err.path + "': ";
+ }
+ message += err.message;
+ message = message.substring(0, message.length - 1);
+ message += ", ";
+ }
+ message = message.substring(0, message.length - 2);
+ message += ".";
+ throw new Error(message);
+ } else if (!parameterSchemas[i].optional) {
+ throw new Error("Parameter " + (i + 1) + " is required.");
+ }
+ }
+ };
+} else {
+ validate = function() {};
+}
+
+// Generate all possible signatures for a given API function.
+function getSignatures(parameterSchemas) {
+ if (parameterSchemas.length === 0)
+ return [[]];
+ var signatures = [];
+ var remaining = getSignatures(parameterSchemas.slice(1));
+ for (var i = 0; i < remaining.length; i++)
+ signatures.push([parameterSchemas[0]].concat(remaining[i]))
+ if (parameterSchemas[0].optional)
+ return signatures.concat(remaining);
+ return signatures;
+};
+
+// Return true if arguments match a given signature's schema.
+function argumentsMatchSignature(args, candidateSignature) {
+ if (args.length != candidateSignature.length)
+ return false;
+ for (var i = 0; i < candidateSignature.length; i++) {
+ var argType = chromeHidden.JSONSchemaValidator.getType(args[i]);
+ if (!schemaValidator.isValidSchemaType(argType,
+ candidateSignature[i]))
+ return false;
+ }
+ return true;
+};
+
+// Finds the function signature for the given arguments.
+function resolveSignature(args, definedSignature) {
+ var candidateSignatures = getSignatures(definedSignature);
+ for (var i = 0; i < candidateSignatures.length; i++) {
+ if (argumentsMatchSignature(args, candidateSignatures[i]))
+ return candidateSignatures[i];
+ }
+ return null;
+};
+
+// Returns a string representing the defined signature of the API function.
+// Example return value for chrome.windows.getCurrent:
+// "windows.getCurrent(optional object populate, function callback)"
+function getParameterSignatureString(name, definedSignature) {
+ var getSchemaTypeString = function(schema) {
+ var schemaTypes = schemaValidator.getAllTypesForSchema(schema);
+ var typeName = schemaTypes.join(" or ") + " " + schema.name;
+ if (schema.optional)
+ return "optional " + typeName;
+ return typeName;
+ };
+ var typeNames = definedSignature.map(getSchemaTypeString);
+ return name + "(" + typeNames.join(", ") + ")";
+};
+
+// Returns a string representing a call to an API function.
+// Example return value for call: chrome.windows.get(1, callback) is:
+// "windows.get(int, function)"
+function getArgumentSignatureString(name, args) {
+ var typeNames = args.map(chromeHidden.JSONSchemaValidator.getType);
+ return name + "(" + typeNames.join(", ") + ")";
+};
+
+// Finds the correct signature for the given arguments, then validates the
+// arguments against that signature. Returns a 'normalized' arguments list
+// where nulls are inserted where optional parameters were omitted.
+// |args| is expected to be an array.
+function normalizeArgumentsAndValidate(args, funDef) {
+ if (funDef.allowAmbiguousOptionalArguments) {
+ validate(args, funDef.definition.parameters);
+ return args;
+ }
+ var definedSignature = funDef.definition.parameters;
+ var resolvedSignature = resolveSignature(args, definedSignature);
+ if (!resolvedSignature)
+ throw new Error("Invocation of form " +
+ getArgumentSignatureString(funDef.name, args) +
+ " doesn't match definition " +
+ getParameterSignatureString(funDef.name, definedSignature));
+ validate(args, resolvedSignature);
+ var normalizedArgs = [];
+ var ai = 0;
+ for (var si = 0; si < definedSignature.length; si++) {
+ if (definedSignature[si] === resolvedSignature[ai])
+ normalizedArgs.push(args[ai++]);
+ else
+ normalizedArgs.push(null);
+ }
+ return normalizedArgs;
+};
+
+// Validates that a given schema for an API function is not ambiguous.
+function isFunctionSignatureAmbiguous(functionDef) {
+ if (functionDef.allowAmbiguousOptionalArguments)
+ return false;
+ var signaturesAmbiguous = function(signature1, signature2) {
+ if (signature1.length != signature2.length)
+ return false;
+ for (var i = 0; i < signature1.length; i++) {
+ if (!schemaValidator.checkSchemaOverlap(
+ signature1[i], signature2[i]))
+ return false;
+ }
+ return true;
+ };
+ var candidateSignatures = getSignatures(functionDef.parameters);
+ for (var i = 0; i < candidateSignatures.length; i++) {
+ for (var j = i + 1; j < candidateSignatures.length; j++) {
+ if (signaturesAmbiguous(candidateSignatures[i], candidateSignatures[j]))
+ return true;
+ }
+ }
+ return false;
+};
+
+exports.isFunctionSignatureAmbiguous = isFunctionSignatureAmbiguous;
+exports.normalizeArgumentsAndValidate = normalizeArgumentsAndValidate;
+exports.schemaValidator = schemaValidator;
+exports.validate = validate;
diff --git a/chrome/renderer/resources/extensions/send_request.js b/chrome/renderer/resources/extensions/send_request.js
index 2e79b8a..abb582a 100644
--- a/chrome/renderer/resources/extensions/send_request.js
+++ b/chrome/renderer/resources/extensions/send_request.js
@@ -4,6 +4,7 @@
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var natives = requireNative('sendRequest');
+var validate = require('schemaUtils').validate;
// Callback handling.
var requests = [];
@@ -44,8 +45,7 @@ chromeHidden.handleResponse = function(requestId, name,
if (request.callbackSchema.parameters.length > 1) {
throw new Error("Callbacks may only define one parameter");
}
- chromeHidden.validate(callbackArgs,
- request.callbackSchema.parameters);
+ validate(callbackArgs, request.callbackSchema.parameters);
} catch (exception) {
return "Callback validation error during " + name + " -- " +
exception.stack;
@@ -72,9 +72,8 @@ function prepareRequest(args, argSchemas) {
// Look for callback param.
if (argSchemas.length > 0 &&
- args.length == argSchemas.length &&
argSchemas[argSchemas.length - 1].type == "function") {
- request.callback = args[argSchemas.length - 1];
+ request.callback = args[args.length - 1];
request.callbackSchema = argSchemas[argSchemas.length - 1];
--argCount;
}
diff --git a/chrome/renderer/resources/extensions/storage_custom_bindings.js b/chrome/renderer/resources/extensions/storage_custom_bindings.js
index 7d8eaa1..9b0ece5 100644
--- a/chrome/renderer/resources/extensions/storage_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/storage_custom_bindings.js
@@ -5,6 +5,8 @@
// Custom bindings for the storage API.
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
+var normalizeArgumentsAndValidate =
+ require('schemaUtils').normalizeArgumentsAndValidate
var sendRequest = require('sendRequest').sendRequest;
chromeHidden.registerCustomType('storage.StorageArea', function() {
@@ -22,18 +24,20 @@ chromeHidden.registerCustomType('storage.StorageArea', function() {
// TODO(kalman): Put as a method on CustomBindingsObject and re-use (or
// even generate) for other APIs that need to do this. Same for other
// callers of registerCustomType().
+ var self = this;
function bindApiFunction(functionName) {
- this[functionName] = function() {
- var schema = this.parameters[functionName];
- chromeHidden.validate(arguments, schema);
+ self[functionName] = function() {
+ var funSchema = this.functionSchemas[functionName];
+ var args = Array.prototype.slice.call(arguments);
+ args = normalizeArgumentsAndValidate(args, funSchema);
return sendRequest(
'storage.' + functionName,
- [namespace].concat(Array.prototype.slice.call(arguments)),
- extendSchema(schema));
+ [namespace].concat(args),
+ extendSchema(funSchema.definition.parameters));
};
}
var apiFunctions = ['get', 'set', 'remove', 'clear', 'getBytesInUse'];
- apiFunctions.forEach(bindApiFunction.bind(this));
+ apiFunctions.forEach(bindApiFunction);
}
return StorageArea;
diff --git a/chrome/renderer/resources/extensions/types_custom_bindings.js b/chrome/renderer/resources/extensions/types_custom_bindings.js
index daf029a..4af67b4d 100644
--- a/chrome/renderer/resources/extensions/types_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/types_custom_bindings.js
@@ -6,6 +6,7 @@
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var sendRequest = require('sendRequest').sendRequest;
+var validate = require('schemaUtils').validate;
chromeHidden.registerCustomType('types.ChromeSetting', function() {
@@ -17,23 +18,23 @@ chromeHidden.registerCustomType('types.ChromeSetting', function() {
function ChromeSetting(prefKey, valueSchema) {
this.get = function(details, callback) {
- var getSchema = this.parameters.get;
- chromeHidden.validate([details, callback], getSchema);
+ var getSchema = this.functionSchemas.get.definition.parameters;
+ validate([details, callback], getSchema);
return sendRequest('types.ChromeSetting.get',
[prefKey, details, callback],
extendSchema(getSchema));
};
this.set = function(details, callback) {
- var setSchema = this.parameters.set.slice();
+ var setSchema = this.functionSchemas.set.definition.parameters.slice();
setSchema[0].properties.value = valueSchema;
- chromeHidden.validate([details, callback], setSchema);
+ validate([details, callback], setSchema);
return sendRequest('types.ChromeSetting.set',
[prefKey, details, callback],
extendSchema(setSchema));
};
this.clear = function(details, callback) {
- var clearSchema = this.parameters.clear;
- chromeHidden.validate([details, callback], clearSchema);
+ var clearSchema = this.functionSchemas.clear.definition.parameters;
+ validate([details, callback], clearSchema);
return sendRequest('types.ChromeSetting.clear',
[prefKey, details, callback],
extendSchema(clearSchema));
diff --git a/chrome/renderer/resources/extensions/web_request_custom_bindings.js b/chrome/renderer/resources/extensions/web_request_custom_bindings.js
index 9216696..d2c52ea 100644
--- a/chrome/renderer/resources/extensions/web_request_custom_bindings.js
+++ b/chrome/renderer/resources/extensions/web_request_custom_bindings.js
@@ -9,6 +9,7 @@ var GetUniqueSubEventName = webRequestNatives.GetUniqueSubEventName;
var chromeHidden = requireNative('chrome_hidden').GetChromeHidden();
var sendRequest = require('sendRequest').sendRequest;
+var validate = require('schemaUtils').validate;
// WebRequestEvent object. This is used for special webRequest events with
// extra parameters. Each invocation of addListener creates a new named
@@ -63,8 +64,7 @@ WebRequestEvent.prototype.addListener =
var subEventName = GetUniqueSubEventName(this.eventName_);
// Note: this could fail to validate, in which case we would not add the
// subEvent listener.
- chromeHidden.validate(Array.prototype.slice.call(arguments, 1),
- this.extraArgSchemas_);
+ validate(Array.prototype.slice.call(arguments, 1), this.extraArgSchemas_);
chromeHidden.internalAPIs.webRequestInternal.addEventListener(
cb, opt_filter, opt_extraInfo, this.eventName_, subEventName);