diff --git a/addons/web/static/src/js/core/mixins.js b/addons/web/static/src/js/core/mixins.js index 228ac2d68dd..06f39e0fcfe 100644 --- a/addons/web/static/src/js/core/mixins.js +++ b/addons/web/static/src/js/core/mixins.js @@ -98,8 +98,8 @@ var ParentedMixin = { * resource it could have reserved. */ destroy : function () { - _.each(this.getChildren(), function (el) { - el.destroy(); + this.getChildren().forEach(function (child) { + child.destroy(); }); this.setParent(undefined); this.__parentedDestroyed = true; diff --git a/addons/web/static/src/js/core/widget.js b/addons/web/static/src/js/core/widget.js index 0de8c6aa1cd..441899e30db 100644 --- a/addons/web/static/src/js/core/widget.js +++ b/addons/web/static/src/js/core/widget.js @@ -172,13 +172,10 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, ServicesMixin, { * destroying itself. */ destroy: function () { - this.getChildren().forEach(function (child) { - child.destroy(); - }); + mixins.PropertiesMixin.destroy.call(this); if (this.$el) { this.$el.remove(); } - mixins.PropertiesMixin.destroy.call(this); }, //-------------------------------------------------------------------------- diff --git a/addons/web/static/tests/core/widget_tests.js b/addons/web/static/tests/core/widget_tests.js index 440cc97b524..13515e08641 100644 --- a/addons/web/static/tests/core/widget_tests.js +++ b/addons/web/static/tests/core/widget_tests.js @@ -468,6 +468,20 @@ QUnit.module('core', {}, function () { slowWillStartPromise.resolve(); }); + QUnit.test("don't destroy twice widget's children", function (assert) { + assert.expect(2); + + var parent = new Widget(); + var child = new (Widget.extend({ + destroy: function () { + assert.step('destroy'); + } + }))(parent); + + parent.destroy(); + assert.verifySteps(['destroy'], "child should have been detroyed only once"); + }); + }); });