diff --git a/addons/mail/static/src/js/thread_field.js b/addons/mail/static/src/js/thread_field.js index 481dc49af36..0d7635cae8b 100644 --- a/addons/mail/static/src/js/thread_field.js +++ b/addons/mail/static/src/js/thread_field.js @@ -21,7 +21,7 @@ var ThreadField = AbstractField.extend(chat_mixin, { this.msgIDs = this.value.res_ids; }, willStart: function () { - return this._chatReady(); + return this.alive(this._chatReady()); }, start: function () { var self = this; @@ -43,7 +43,7 @@ var ThreadField = AbstractField.extend(chat_mixin, { var def1 = this.thread.appendTo(this.$el); var def2 = this._super.apply(this, arguments); - return $.when(def1, def2).then(function () { + return this.alive($.when(def1, def2)).then(function () { // unwrap the thread to remove an unnecessary level on div self.setElement(self.thread.$el); diff --git a/addons/mail/static/tests/chatter_tests.js b/addons/mail/static/tests/chatter_tests.js index 030539a72b9..d0b685ebbec 100644 --- a/addons/mail/static/tests/chatter_tests.js +++ b/addons/mail/static/tests/chatter_tests.js @@ -13,6 +13,7 @@ var BasicComposer = Composers.BasicComposer; var createAsyncView = testUtils.createAsyncView; var createView = testUtils.createView; +var createAsyncView = testUtils.createAsyncView; QUnit.module('mail', {}, function () { @@ -944,5 +945,69 @@ QUnit.test('fieldmany2many tags email', function (assert) { $('.modal-footer .btn-primary').click(); }); +QUnit.test('does not render and crash when destroyed before chat system is ready', function (assert) { + assert.expect(0); + + var def = $.Deferred(); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '
' + + '' + + '' + + '' + + '
' + + '
', + res_id: 2, + mockRPC: function (route, args) { + if (route === '/mail/read_followers') { + return $.when({ + followers: [], + subtypes: [], + }); + } + return this._super(route, args); + }, + intercepts: { + chat_manager_ready: function (event) { + // we delay the return of the chat_manager ready event + event.data.callback(def); + }, + get_messages: function (event) { + event.stopPropagation(); + event.data.callback($.when([{ + attachment_ids: [], + body: "", + date: moment("2016-12-20 09:35:40"), + id: 34, + res_id: 3, + author_id: ["3", "Fu Ck Mil Grom"], + }])); + }, + get_bus: function (event) { + event.stopPropagation(); + event.data.callback(new Bus()); + }, + get_session: function (event) { + event.stopPropagation(); + event.data.callback({uid: 1}); + }, + }, + }); + + form.destroy(); + // here, the chat_manager system is ready, and the chatter can try to render + // itself. We simply make sure here that no crashes occur (since the form + // view is destroyed, all rpcs will be dropped, and many other mechanisms + // relying on events will not work, such as _getBus) + def.resolve(); +}); + }); });