| Index: chrome/renderer/resources/extension_process_bindings.js
|
| diff --git a/chrome/renderer/resources/extension_process_bindings.js b/chrome/renderer/resources/extension_process_bindings.js
|
| index 35d516e5db3f1f7b32ce008cb90cd522cd61a8b5..6286fd2da7c1062c9f6d99a067654e2a921af12d 100644
|
| --- a/chrome/renderer/resources/extension_process_bindings.js
|
| +++ b/chrome/renderer/resources/extension_process_bindings.js
|
| @@ -40,7 +40,7 @@ var chrome = chrome || {};
|
| chrome = {};
|
|
|
| // Validate arguments.
|
| - chromeHidden.validationTypes = [];
|
| + chromeHidden.validationTypes = {};
|
| chromeHidden.validate = function(args, schemas) {
|
| if (args.length > schemas.length)
|
| throw new Error("Too many arguments.");
|
| @@ -48,7 +48,9 @@ var chrome = chrome || {};
|
| for (var i = 0; i < schemas.length; i++) {
|
| if (i in args && args[i] !== null && args[i] !== undefined) {
|
| var validator = new chromeHidden.JSONSchemaValidator();
|
| - validator.addTypes(chromeHidden.validationTypes);
|
| + forEach(chromeHidden.validationTypes, function(id, type) {
|
| + validator.addTypes(type);
|
| + });
|
| validator.validate(args[i], schemas[i]);
|
| if (validator.errors.length == 0)
|
| continue;
|
| @@ -366,6 +368,55 @@ var chrome = chrome || {};
|
| };
|
| }
|
|
|
| + function forEach(dict, f) {
|
| + for (key in dict) {
|
| + if (dict.hasOwnProperty(key))
|
| + f(key, dict[key]);
|
| + }
|
| + }
|
| +
|
| + function setupPreferences() {
|
| + // We declare the constructor so that a Preference shows up as such in the
|
| + // Javascript console, but build the Preference in a separate function so
|
| + // that an extension can't construct arbitrary Preference objects.
|
| + function Preference() {
|
| + };
|
| +
|
| + var parameters = {};
|
| + chromeHidden.validationTypes['Preference'].functions.forEach(function(f) {
|
| + parameters[f.name] = f.parameters;
|
| + });
|
| +
|
| + function buildPreference(prefKey, valueSchema) {
|
| + var pref = new Preference();
|
| + var getSchema = parameters.get;
|
| + var extendedGetSchema = getSchema.slice();
|
| + extendedGetSchema.unshift({'type': 'string'});
|
| + pref.get = function(details, callback) {
|
| + chromeHidden.validate([details, callback], getSchema);
|
| + return sendRequest('experimental.preferences.get',
|
| + [prefKey, details, callback],
|
| + extendedGetSchema);
|
| + };
|
| + var setSchema = parameters.set;
|
| + var extendedSetSchema = setSchema.slice();
|
| + extendedSetSchema.unshift({'type': 'string'});
|
| + extendedSetSchema[1].properties.value = valueSchema;
|
| + pref.set = function(details, callback) {
|
| + chromeHidden.validate([details, callback], setSchema);
|
| + return sendRequest('experimental.preferences.set',
|
| + [prefKey, details, callback],
|
| + extendedSetSchema);
|
| + };
|
| + return pref;
|
| + }
|
| +
|
| + // TODO(bauerb): Automatically instantiate these preferences
|
| + // from chrome/common/extensions/api/extension_api.json.
|
| + chrome.experimental.contentSettings.misc.blockThirdPartyCookies =
|
| + buildPreference('blockThirdPartyCookies', {'type':'boolean'});
|
| + }
|
| +
|
| chromeHidden.onLoad.addListener(function (extensionId) {
|
| if (!extensionId) {
|
| return;
|
| @@ -396,7 +447,7 @@ var chrome = chrome || {};
|
| // Add types to global validationTypes
|
| if (apiDef.types) {
|
| apiDef.types.forEach(function(t) {
|
| - chromeHidden.validationTypes.push(t);
|
| + chromeHidden.validationTypes[t.id] = t;
|
| });
|
| }
|
|
|
| @@ -458,11 +509,7 @@ var chrome = chrome || {};
|
|
|
| // Parse any values defined for properties.
|
| if (apiDef.properties) {
|
| - for (var prop in apiDef.properties) {
|
| - if (!apiDef.properties.hasOwnProperty(prop))
|
| - continue;
|
| -
|
| - var property = apiDef.properties[prop];
|
| + forEach(apiDef.properties, function(prop, property) {
|
| if (property.value) {
|
| var value = property.value;
|
| if (property.type === 'integer') {
|
| @@ -475,7 +522,7 @@ var chrome = chrome || {};
|
| }
|
| module[prop] = value;
|
| }
|
| - }
|
| + });
|
| }
|
|
|
| // getTabContentses is retained for backwards compatibility
|
| @@ -798,6 +845,7 @@ var chrome = chrome || {};
|
| setupHiddenContextMenuEvent(extensionId);
|
| setupOmniboxEvents();
|
| setupTtsEvents();
|
| + setupPreferences();
|
| });
|
|
|
| if (!chrome.experimental)
|
|
|