blob: 63c68caf70ddcd834659041abf5be7df2f008e46 [file] [log] [blame]
<!DOCTYPE html>
<!--
Copyright (c) 2014 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.
-->
<link rel="import" href="/base/base.html">
<script>
'use strict';
tr.exportTo('tr.b', function() {
function RegisteredTypeInfo(constructor, metadata) {
this.constructor = constructor;
this.metadata = metadata;
};
var BASIC_REGISTRY_MODE = 'BASIC_REGISTRY_MODE';
var TYPE_BASED_REGISTRY_MODE = 'TYPE_BASED_REGISTRY_MODE';
var ALL_MODES = {BASIC_REGISTRY_MODE: true, TYPE_BASED_REGISTRY_MODE: true};
function ExtensionRegistryOptions(mode) {
if (mode === undefined)
throw new Error('Mode is required');
if (!ALL_MODES[mode])
throw new Error('Not a mode.');
this.mode_ = mode;
this.defaultMetadata_ = {};
this.defaultConstructor_ = undefined;
this.mandatoryBaseClass_ = undefined;
this.defaultTypeInfo_ = undefined;
this.frozen_ = false;
}
ExtensionRegistryOptions.prototype = {
freeze: function() {
if (this.frozen_)
throw new Error('Frozen');
this.frozen_ = true;
},
get mode() {
return this.mode_;
},
get defaultMetadata() {
return this.defaultMetadata_;
},
set defaultMetadata(defaultMetadata) {
if (this.frozen_)
throw new Error('Frozen');
this.defaultMetadata_ = defaultMetadata;
this.defaultTypeInfo_ = undefined;
},
get defaultConstructor() {
return this.defaultConstructor_;
},
set defaultConstructor(defaultConstructor) {
if (this.frozen_)
throw new Error('Frozen');
this.defaultConstructor_ = defaultConstructor;
this.defaultTypeInfo_ = undefined;
},
get defaultTypeInfo() {
if (this.defaultTypeInfo_ === undefined && this.defaultConstructor_) {
this.defaultTypeInfo_ = new RegisteredTypeInfo(
this.defaultConstructor,
this.defaultMetadata);
}
return this.defaultTypeInfo_;
},
validateConstructor: function(constructor) {
if (!this.mandatoryBaseClass)
return;
var curProto = constructor.prototype.__proto__;
var ok = false;
while (curProto) {
if (curProto === this.mandatoryBaseClass.prototype) {
ok = true;
break;
}
curProto = curProto.__proto__;
}
if (!ok)
throw new Error(constructor + 'must be subclass of ' + registry);
}
};
return {
BASIC_REGISTRY_MODE: BASIC_REGISTRY_MODE,
TYPE_BASED_REGISTRY_MODE: TYPE_BASED_REGISTRY_MODE,
ExtensionRegistryOptions: ExtensionRegistryOptions,
RegisteredTypeInfo: RegisteredTypeInfo
};
});
</script>