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();
+ });
});
});