[FIX] web: proper rendering of widget tag

There was no consideration of the fact that the widget
rendering process could be asynchronous. This commit
fixes that situation so that render a node of type
<widget name="..."> is now possible.
This commit is contained in:
Mathieu Duckerts-Antoine
2018-05-30 12:03:24 +02:00
parent c2c9a60466
commit 3cfd3e6b0b
2 changed files with 43 additions and 6 deletions
@@ -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 ? $('<div>') : 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;
},
/**
@@ -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: '<form>' +
'<widget name="test"/>' +
'</form>',
}).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();
});
});
});