diff --git a/addons/web/static/src/js/views/abstract_controller.js b/addons/web/static/src/js/views/abstract_controller.js index 866abb03d65..f68c4b793a8 100644 --- a/addons/web/static/src/js/views/abstract_controller.js +++ b/addons/web/static/src/js/views/abstract_controller.js @@ -125,7 +125,9 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { this._controlPanelModel.on('search', this, this._onSearch); this._controlPanelModel.on('get-controller-query-params', this, this._onGetOwnedQueryParams); } - this.renderer.on_attach_callback(); + if (!(this.renderer instanceof owl.Component)) { + this.renderer.on_attach_callback(); + } }, /** * Called each time the controller is detached from the DOM. @@ -136,7 +138,9 @@ var AbstractController = mvc.Controller.extend(ActionMixin, { this._controlPanelModel.off('search', this); this._controlPanelModel.off('get-controller-query-params', this); } - this.renderer.on_detach_callback(); + if (!(this.renderer instanceof owl.Component)) { + this.renderer.on_detach_callback(); + } }, //-------------------------------------------------------------------------- diff --git a/addons/web/static/tests/views/abstract_controller_tests.js b/addons/web/static/tests/views/abstract_controller_tests.js index 09b95abddda..43b71b5293a 100644 --- a/addons/web/static/tests/views/abstract_controller_tests.js +++ b/addons/web/static/tests/views/abstract_controller_tests.js @@ -134,5 +134,35 @@ QUnit.module("Views", { assert.hasClass(document.activeElement, "o_searchview_input"); view.destroy(); }); + + QUnit.test('Owl Renderer mounted/willUnmount hooks are properly called', async function (assert) { + // This test could be removed as soon as controllers and renderers will + // both be converted in Owl. + assert.expect(3); + + class Renderer extends AbstractRenderer { + mounted() { + assert.step("mounted"); + } + willUnmount() { + assert.step("unmounted"); + } + } + Renderer.template = xml`