Chromium Code Reviews| 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..3b16c59931b8175da60f5c287223bdaadae4e638 100644 |
| --- a/chrome/renderer/resources/extension_process_bindings.js |
| +++ b/chrome/renderer/resources/extension_process_bindings.js |
| @@ -39,8 +39,15 @@ var chrome = chrome || {}; |
| if (!chrome) |
| chrome = {}; |
| + function forEach(dict, f) { |
| + for (key in dict) { |
| + if (dict.hasOwnProperty(key)) |
| + f(key, dict[key]); |
| + } |
| + } |
| + |
| // Validate arguments. |
| - chromeHidden.validationTypes = []; |
| + chromeHidden.validationTypes = {}; |
| chromeHidden.validate = function(args, schemas) { |
| if (args.length > schemas.length) |
| throw new Error("Too many arguments."); |
| @@ -48,7 +55,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 +375,48 @@ var chrome = chrome || {}; |
| }; |
| } |
| + function setupPreferences() { |
|
Aaron Boodman
2011/02/11 18:33:19
You are now the second person (along with mpcomple
Aaron Boodman
2011/02/14 02:54:02
Did you see this comment?
|
| + // 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) |