[FIX] web: prevent destroyed widget from calling start

Whenever a widget is destroyed, it should be as inactive as possible.
Before this commit, it could happen that a widget was destroyed after
the willstart method, but before the start method. In that case, bad
things could happen.

For example, the discuss client action tries to look up some information
into the session, with the getSession method. This causes a crash
whenever the widget is destroyed.
This commit is contained in:
Géry Debongnie
2018-04-12 11:27:20 +02:00
parent 473edda86e
commit 2f16d6bfe3
2 changed files with 23 additions and 0 deletions
+3
View File
@@ -391,6 +391,9 @@ var Widget = core.Class.extend(mixins.PropertiesMixin, ServicesMixin, {
_widgetRenderAndInsert: function (insertion, target) {
var self = this;
return this.willStart().then(function () {
if (self.__parentedDestroyed) {
return;
}
self.renderElement();
insertion(target);
return self.start();
@@ -388,6 +388,26 @@ QUnit.module('core', {}, function () {
assert.ok(true,
"there should be no crash when calling _rpc on a destroyed widget");
});
QUnit.test('start is not called when widget is destroyed', function (assert) {
assert.expect(0);
var slowWillStartDef = $.Deferred();
var $fix = $( "#qunit-fixture");
var widget = new (Widget.extend({
willStart: function () {
return slowWillStartDef;
},
start: function () {
throw new Error('Should not call start method');
},
}))();
widget.appendTo($fix);
widget.destroy();
slowWillStartDef.resolve();
});
});
});