diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index 1dae9f705ff..52388f8e638 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -629,15 +629,23 @@ var BasicRenderer = AbstractRenderer.extend({ // Prepare widget rendering and save the related deferred var def = widget._widgetRenderAndInsert(function () {}); - if (def.state() === 'pending') { + var async = def.state() === 'pending'; + if (async) { this.defs.push(def); } + var $el = async ? $('
') : widget.$el; - // handle other attributes/modifiers - this._handleAttributes(widget.$el, node); - this._registerModifiers(node, record, widget); - widget.$el.addClass('o_widget'); - return widget.$el; + var self = this; + def.then(function () { + self._handleAttributes(widget.$el, node); + self._registerModifiers(node, record, widget); + widget.$el.addClass('o_widget'); + if (async) { + $el.replaceWith(widget.$el); + } + }); + + return $el; }, /** diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 66891c84187..9e98d94b8d5 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -7172,6 +7172,35 @@ QUnit.module('Views', { assert.ok("Behavior can't be tested"); }); + QUnit.test('asynchronous rendering of a widget tag', function (assert) { + assert.expect(1); + + var def1 = $.Deferred(); + + var MyWidget = Widget.extend({ + willStart: function() { + return def1; + }, + }); + + widgetRegistry.add('test', MyWidget); + + createAsyncView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '', + }).then(function(form) { + assert.strictEqual(form.$('div.o_widget').length, 1, + "there should be a div with widget class"); + form.destroy(); + delete widgetRegistry.map.test; + }); + + def1.resolve(); + }); }); });