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) |