Index: chrome/renderer/resources/extensions/binding.js |
diff --git a/chrome/renderer/resources/extensions/binding.js b/chrome/renderer/resources/extensions/binding.js |
index 59c9917984a99f13ae3339b5d1117cd551e62f11..b5a65a206aac434733851eefb376202022a9c901 100644 |
--- a/chrome/renderer/resources/extensions/binding.js |
+++ b/chrome/renderer/resources/extensions/binding.js |
@@ -17,6 +17,7 @@ var schemaRegistry = requireNative('schema_registry'); |
var schemaUtils = require('schemaUtils'); |
var sendRequest = require('sendRequest').sendRequest; |
var utils = require('utils'); |
+var CHECK = requireNative('logging').CHECK; |
// 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 |
@@ -117,13 +118,25 @@ function isSchemaNodeSupported(schemaNode, platform, manifestVersion) { |
isManifestVersionSupported(schemaNode, manifestVersion); |
} |
+function createCustomType(type) { |
+ var jsModuleName = type.js_module; |
+ CHECK(jsModuleName, 'Custom type ' + type.id + |
+ ' has no "js_module" property.'); |
+ var jsModule = require(jsModuleName); |
+ CHECK(jsModule, 'No module ' + jsModuleName + ' found for ' + type.id + '.'); |
+ var customType = jsModule[jsModuleName]; |
+ CHECK(customType, jsModuleName + ' must export itself.'); |
+ customType.prototype = new CustomBindingsObject(); |
+ customType.prototype.setSchema(type); |
+ return customType; |
+} |
+ |
var platform = getPlatform(); |
function Binding(schema) { |
this.schema_ = schema; |
this.apiFunctions_ = new APIFunctions(); |
this.customEvent_ = null; |
- this.customTypes_ = {}; |
this.customHooks_ = []; |
}; |
@@ -139,15 +152,6 @@ Binding.prototype = { |
// order to do the schema generation (registerCustomEvent and |
// registerCustomType), and those which can only run after the bindings have |
// been generated (registerCustomHook). |
- // |
- |
- // Registers a custom type referenced via "$ref" fields in the API schema |
- // JSON. |
- registerCustomType: function(typeName, customTypeFactory) { |
- var customType = customTypeFactory(); |
- customType.prototype = new CustomBindingsObject(); |
- this.customTypes_[typeName] = customType; |
- }, |
// Registers a custom event type for the API identified by |namespace|. |
// |event| is the event's constructor. |
@@ -184,7 +188,6 @@ Binding.prototype = { |
// bindings that might be present. |
generate: function() { |
var schema = this.schema_; |
- var customTypes = this.customTypes_; |
// TODO(kalman/cduvall): Make GetAvailability handle this, then delete the |
// supporting code. |
@@ -210,18 +213,14 @@ Binding.prototype = { |
mod = mod[name]; |
} |
- // Add types to global schemaValidator |
+ // Add types to global schemaValidator, the types we depend on from other |
+ // namespaces will be added as needed. |
if (schema.types) { |
forEach(schema.types, function(i, t) { |
if (!isSchemaNodeSupported(t, platform, manifestVersion)) |
return; |
schemaUtils.schemaValidator.addTypes(t); |
- if (t.type == 'object' && this.customTypes_[t.id]) { |
- var parts = t.id.split("."); |
- this.customTypes_[t.id].prototype.setSchema(t); |
- mod[parts[parts.length - 1]] = this.customTypes_[t.id]; |
- } |
}, this); |
} |
@@ -371,16 +370,10 @@ Binding.prototype = { |
} else if (type === 'boolean') { |
value = value === 'true'; |
} else if (propertyDef['$ref']) { |
- if (propertyDef['$ref'] in customTypes) { |
- var constructor = customTypes[propertyDef['$ref']]; |
- } else { |
- var refParts = propertyDef['$ref'].split('.'); |
- // This should never try to load a $ref in the current namespace. |
- var constructor = utils.loadRefDependency( |
- propertyDef['$ref'])[refParts[refParts.length - 1]]; |
- } |
- if (!constructor) |
- throw new Error('No custom binding for ' + propertyDef['$ref']); |
+ var ref = propertyDef['$ref']; |
+ var type = utils.loadTypeSchema(propertyDef['$ref'], schema); |
+ CHECK(type, 'Schema for $ref type ' + ref + ' not found'); |
+ var constructor = createCustomType(type); |
var args = value; |
// For an object propertyDef, |value| is an array of constructor |
// arguments, but we want to pass the arguments directly (i.e. |