From ff570e8d233eef4445105ed4700eba3da1942c1c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 8 Feb 2012 13:43:09 +0100 Subject: [PATCH] [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 --- addons/web/static/src/js/core.js | 9 +++++++-- addons/web/static/test/registry.js | 22 ++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 6bac3fa39e6..4495334aa23 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -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; } }); diff --git a/addons/web/static/test/registry.js b/addons/web/static/test/registry.js index 0a3e65e9b1c..9606dfae456 100644 --- a/addons/web/static/test/registry.js +++ b/addons/web/static/test/registry.js @@ -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); + }); });