Set room `connection_status' to DISCONNECTED...

when receiving an `unavailable` presence for ourselves.
This commit is contained in:
JC Brand 2019-05-28 13:59:53 +02:00
parent 85c4d144ed
commit e053b97043
2 changed files with 59 additions and 49 deletions

View File

@ -2138,6 +2138,7 @@
const __ = _converse.__; const __ = _converse.__;
await test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'oldnick'); await test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'oldnick');
const view = _converse.chatboxviews.get('lounge@localhost'); const view = _converse.chatboxviews.get('lounge@localhost');
expect(view.model.get('connection_status')).toBe(converse.ROOMSTATUS.ENTERED);
const chat_content = view.el.querySelector('.chat-content'); const chat_content = view.el.querySelector('.chat-content');
let occupants = view.el.querySelector('.occupant-list'); let occupants = view.el.querySelector('.occupant-list');
@ -2169,6 +2170,7 @@
expect(sizzle('div.chat-info:last').pop().textContent).toBe( expect(sizzle('div.chat-info:last').pop().textContent).toBe(
__(_converse.muc.new_nickname_messages["303"], "newnick") __(_converse.muc.new_nickname_messages["303"], "newnick")
); );
expect(view.model.get('connection_status')).toBe(converse.ROOMSTATUS.DISCONNECTED);
occupants = view.el.querySelector('.occupant-list'); occupants = view.el.querySelector('.occupant-list');
expect(occupants.childNodes.length).toBe(1); expect(occupants.childNodes.length).toBe(1);
@ -2187,6 +2189,7 @@
.c('status').attrs({code:'110'}).nodeTree; .c('status').attrs({code:'110'}).nodeTree;
_converse.connection._dataRecv(test_utils.createRequest(presence)); _converse.connection._dataRecv(test_utils.createRequest(presence));
expect(view.model.get('connection_status')).toBe(converse.ROOMSTATUS.ENTERED);
// XXX: currently we still have an additional "has entered the groupchat" // XXX: currently we still have an additional "has entered the groupchat"
// notification for the new nickname. Ideally we'd not have // notification for the new nickname. Ideally we'd not have
// that, but that's probably not possible without some // that, but that's probably not possible without some

View File

@ -1281,30 +1281,33 @@ converse.plugins.add('converse-muc', {
_converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this}); _converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
}, },
onErrorPresence (pres) {
// TODO: currently showErrorMessageFromPresence handles
// 'error" presences in converse-muc-views.
// Instead, they should be handled here and the presence
// handler removed from there.
if (sizzle(`error not-authorized[xmlns="${Strophe.NS.STANZAS}"]`, pres).length) {
this.save('connection_status', converse.ROOMSTATUS.PASSWORD_REQUIRED);
} else {
this.save('connection_status', converse.ROOMSTATUS.DISCONNECTED);
}
},
/** /**
* Handles all MUC presence stanzas. * Handles all MUC presence stanzas.
* @private * @private
* @method _converse.ChatRoom#onPresence * @method _converse.ChatRoom#onPresence
* @param { XMLElement } pres - The stanza * @param { XMLElement } stanza
*/ */
onPresence (pres) { onPresence (stanza) {
if (pres.getAttribute('type') === 'error') { if (stanza.getAttribute('type') === 'error') {
// TODO: currently showErrorMessageFromPresence handles return this.onErrorPresence(stanza);
// 'error" presences in converse-muc-views.
// Instead, they should be handled here and the presence
// handler removed from there.
if (sizzle(`error not-authorized[xmlns="${Strophe.NS.STANZAS}"]`, pres).length) {
this.save('connection_status', converse.ROOMSTATUS.PASSWORD_REQUIRED);
} else {
this.save('connection_status', converse.ROOMSTATUS.DISCONNECTED);
}
return;
} }
const is_self = pres.querySelector("status[code='110']"); if (stanza.querySelector("status[code='110']")) {
if (is_self && pres.getAttribute('type') !== 'unavailable') { this.onOwnPresence(stanza);
this.onOwnPresence(pres);
} }
this.updateOccupantsOnPresence(pres); this.updateOccupantsOnPresence(stanza);
if (this.get('role') !== 'none' && this.get('connection_status') === converse.ROOMSTATUS.CONNECTING) { if (this.get('role') !== 'none' && this.get('connection_status') === converse.ROOMSTATUS.CONNECTING) {
this.save('connection_status', converse.ROOMSTATUS.CONNECTED); this.save('connection_status', converse.ROOMSTATUS.CONNECTED);
} }
@ -1325,41 +1328,45 @@ converse.plugins.add('converse-muc', {
* @method _converse.ChatRoom#onOwnPresence * @method _converse.ChatRoom#onOwnPresence
* @param { XMLElement } pres - The stanza * @param { XMLElement } pres - The stanza
*/ */
onOwnPresence (pres) { onOwnPresence (stanza) {
this.saveAffiliationAndRole(pres); this.saveAffiliationAndRole(stanza);
const locked_room = pres.querySelector("status[code='201']"); if (stanza.getAttribute('type') === 'unavailable') {
if (locked_room) { this.save('connection_status', converse.ROOMSTATUS.DISCONNECTED);
if (this.get('auto_configure')) { } else {
this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures()); const locked_room = stanza.querySelector("status[code='201']");
} else if (_converse.muc_instant_rooms) { if (locked_room) {
// Accept default configuration if (this.get('auto_configure')) {
this.saveConfiguration().then(() => this.refreshRoomFeatures()); this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures());
} else { } else if (_converse.muc_instant_rooms) {
/** // Accept default configuration
* Triggered when a new room has been created which first needs to be configured this.saveConfiguration().then(() => this.refreshRoomFeatures());
* and when `auto_configure` is set to `false`. } else {
* Used by `_converse.ChatRoomView` in order to know when to render the /**
* configuration form for a new room. * Triggered when a new room has been created which first needs to be configured
* @event _converse.ChatRoom#configurationNeeded * and when `auto_configure` is set to `false`.
* @example _converse.api.listen.on('configurationNeeded', () => { ... }); * Used by `_converse.ChatRoomView` in order to know when to render the
*/ * configuration form for a new room.
this.trigger('configurationNeeded'); * @event _converse.ChatRoom#configurationNeeded
return; // We haven't yet entered the groupchat, so bail here. * @example _converse.api.listen.on('configurationNeeded', () => { ... });
} */
} else if (!this.features.get('fetched')) { this.trigger('configurationNeeded');
// The features for this groupchat weren't fetched. return; // We haven't yet entered the groupchat, so bail here.
// That must mean it's a new groupchat without locking }
// (in which case Prosody doesn't send a 201 status), } else if (!this.features.get('fetched')) {
// otherwise the features would have been fetched in // The features for this groupchat weren't fetched.
// the "initialize" method already. // That must mean it's a new groupchat without locking
if (this.get('affiliation') === 'owner' && this.get('auto_configure')) { // (in which case Prosody doesn't send a 201 status),
this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures()); // otherwise the features would have been fetched in
} else { // the "initialize" method already.
this.getRoomFeatures(); if (this.get('affiliation') === 'owner' && this.get('auto_configure')) {
this.autoConfigureChatRoom().then(() => this.refreshRoomFeatures());
} else {
this.getRoomFeatures();
}
} }
this.save('connection_status', converse.ROOMSTATUS.ENTERED);
} }
this.save('connection_status', converse.ROOMSTATUS.ENTERED);
}, },
/** /**