diff --git a/addons/web/static/src/legacy/js/views/basic/basic_renderer.js b/addons/web/static/src/legacy/js/views/basic/basic_renderer.js index f2a19a0ca6f..95a227ffa03 100644 --- a/addons/web/static/src/legacy/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/legacy/js/views/basic/basic_renderer.js @@ -47,11 +47,19 @@ var BasicRenderer = AbstractRenderer.extend(WidgetAdapterMixin, { // and on which field it is set. this.handleField = null; this.viewEditable = params.viewEditable; + + // There an issue with bootstrap 5.1 (probably fixed in 5.2). A reference + // to some nodes with attached tooltips are kept and can never be garbage collected. + // We thus manually dispose them at destroy. + this.jQueryNodesWithTooltip = []; }, /** * @override */ destroy: function () { + for (const $node of this.jQueryNodesWithTooltip) { + $node.tooltip("dispose"); + } this._super.apply(this, arguments); WidgetAdapterMixin.destroy.call(this); }, @@ -315,6 +323,8 @@ var BasicRenderer = AbstractRenderer.extend(WidgetAdapterMixin, { // widget's $el $node = $node.length ? $node : widget.$el; $node.tooltip(this._getTooltipOptions(widget)); + + this.jQueryNodesWithTooltip.push($node); }, /** * Does the necessary DOM updates to match the given modifiers data. The