[IMP] have registries remain linked so alterations to a parent registry alters its clone as well (if keys are not overwritten in the child)

bzr revid: xmo@openerp.com-20120208124309-iho04vgae2nz6xix
This commit is contained in:
Xavier Morel 2012-02-08 13:43:09 +01:00
parent 69fdc31167
commit ff570e8d23
2 changed files with 29 additions and 2 deletions

View File

@ -254,6 +254,7 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
* @param {Object} mapping a mapping of keys to object-paths
*/
init: function (mapping) {
this.parent = null;
this.map = mapping || {};
},
/**
@ -269,6 +270,9 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
get_object: function (key, silent_error) {
var path_string = this.map[key];
if (path_string === undefined) {
if (this.parent) {
return this.parent.get_object(key, silent_error);
}
if (silent_error) { return void 'nooo'; }
throw new openerp.web.KeyNotFound(key);
}
@ -327,8 +331,9 @@ openerp.web.Registry = openerp.web.Class.extend( /** @lends openerp.web.Registry
* @param {Object} [mapping={}] a mapping of keys to object-paths
*/
clone: function (mapping) {
return new openerp.web.Registry(
_.extend({}, this.map, mapping || {}));
var child = new openerp.web.Registry(mapping);
child.parent = this;
return child;
}
});

View File

@ -6,6 +6,7 @@ $(document).ready(function () {
window.openerp.web.core(openerp);
openerp.web.Foo = {};
openerp.web.Bar = {};
openerp.web.Foo2 = {};
}
});
test('key fetch', function () {
@ -30,4 +31,25 @@ $(document).ready(function () {
.add('bar', 'openerp.web.Bar');
strictEqual(reg.get_object('bar'), openerp.web.Bar);
});
test('extension', function () {
var reg = new openerp.web.Registry({
foo: 'openerp.web.Foo',
bar: 'openerp.web.Bar'
});
var reg2 = reg.clone({ 'foo': 'openerp.web.Foo2' });
strictEqual(reg.get_object('foo'), openerp.web.Foo);
strictEqual(reg2.get_object('foo'), openerp.web.Foo2);
});
test('remain-linked', function () {
var reg = new openerp.web.Registry({
foo: 'openerp.web.Foo',
bar: 'openerp.web.Bar'
});
var reg2 = reg.clone();
reg.add('foo2', 'openerp.web.Foo2');
strictEqual(reg.get_object('foo2'), openerp.web.Foo2);
strictEqual(reg2.get_object('foo2'), openerp.web.Foo2);
});
});