diff --git a/addons/web/static/lib/nivjs/src/niv.js b/addons/web/static/lib/nivjs/src/niv.js index e572edc73c1..e2c997a64a0 100644 --- a/addons/web/static/lib/nivjs/src/niv.js +++ b/addons/web/static/lib/nivjs/src/niv.js @@ -45,54 +45,88 @@ niv = (function() { // Create a new Class that inherits from this class this.Class.extend = function(prop) { - var _super = this.prototype; + var _super = this.prototype; - // Instantiate a base class (but only create the instance, - // don't run the init constructor) - initializing = true; - var prototype = new this(); - initializing = false; + // Instantiate a web class (but only create the instance, + // don't run the init constructor) + initializing = true; + var prototype = new this(); + initializing = false; - // Copy the properties over onto the new prototype - for ( var name in prop) { - // Check if we're overwriting an existing function - prototype[name] = typeof prop[name] == "function" - && typeof _super[name] == "function" - && fnTest.test(prop[name]) ? (function(name, fn) { - return function() { - var tmp = this._super; + // Copy the properties over onto the new prototype + for (var name in prop) { + // Check if we're overwriting an existing function + prototype[name] = typeof prop[name] == "function" && + typeof _super[name] == "function" && + fnTest.test(prop[name]) ? + (function(name, fn) { + return function() { + var tmp = this._super; - // Add a new ._super() method that is the same method - // but on the super-class - this._super = _super[name]; + // Add a new ._super() method that is the same + // method but on the super-class + this._super = _super[name]; - // The method only need to be bound temporarily, so we - // remove it when we're done executing - var ret = fn.apply(this, arguments); - this._super = tmp; + // The method only need to be bound temporarily, so + // we remove it when we're done executing + var ret = fn.apply(this, arguments); + this._super = tmp; - return ret; - }; - })(name, prop[name]) : prop[name]; + return ret; + }; + })(name, prop[name]) : + prop[name]; + } + + // The dummy class constructor + function Class() { + // All construction is actually done in the init method + if (!initializing && this.init) { + var ret = this.init.apply(this, arguments); + if (ret) { return ret; } } - - // The dummy class constructor - function Class() { - // All construction is actually done in the init method - if (!initializing && this.init) - this.init.apply(this, arguments); + return this; + } + Class.include = function (properties) { + for (var name in properties) { + if (typeof properties[name] !== 'function' + || !fnTest.test(properties[name])) { + prototype[name] = properties[name]; + } else if (typeof prototype[name] === 'function' + && prototype.hasOwnProperty(name)) { + prototype[name] = (function (name, fn, previous) { + return function () { + var tmp = this._super; + this._super = previous; + var ret = fn.apply(this, arguments); + this._super = tmp; + return ret; + } + })(name, properties[name], prototype[name]); + } else if (typeof _super[name] === 'function') { + prototype[name] = (function (name, fn) { + return function () { + var tmp = this._super; + this._super = _super[name]; + var ret = fn.apply(this, arguments); + this._super = tmp; + return ret; + } + })(name, properties[name]); + } } + }; - // Populate our constructed prototype object - Class.prototype = prototype; + // Populate our constructed prototype object + Class.prototype = prototype; - // Enforce the constructor to be what we expect - Class.prototype.constructor = Class; + // Enforce the constructor to be what we expect + Class.constructor = Class; - // And make this class extendable - Class.extend = arguments.callee; - - return Class; + // And make this class extendable + Class.extend = arguments.callee; + + return Class; }; }).call(lib); // end of John Resig's code diff --git a/addons/web/static/lib/nivjs/test/test.js b/addons/web/static/lib/nivjs/test/test.js index c93dea99ac6..244ba8d7f26 100644 --- a/addons/web/static/lib/nivjs/test/test.js +++ b/addons/web/static/lib/nivjs/test/test.js @@ -115,6 +115,10 @@ test("base", function() { equal($el.length, 1); equal($el.parents()[0], $("body")[0]); equal($el.html(), "test"); + + var y = new Claz(x); + equal(y.getParent(), x); + x.destroy(); $el = $("#testdiv"); equal($el.length, 0); diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index 9a564c653bb..7b88279cf16 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -999,7 +999,7 @@ openerp.web.Widget = niv.Widget.extend(_.extend({}, openerp.web.CallbackEnabledM */ init: function(parent) { openerp.web.CallbackEnabledMixin.init.call(this); - this._super(); + this._super(parent); this.session = openerp.connection; }, /**