Commit 397927b1 authored by JC Brand's avatar JC Brand

Fix broken tests and update changelog

parent 6af02904
...@@ -2,7 +2,9 @@ ...@@ -2,7 +2,9 @@
## 3.2.0 (Unreleased) ## 3.2.0 (Unreleased)
- #866 Add babel in order to support ES2015 syntax - All promises are now native (or polyfilled) ES2015 Promises
instead of jQuery's Deferred. [jcbrand]
- #866 Add babel in order to support ES2015 syntax [jcbrand]
## 3.1.0 (2017-07-05) ## 3.1.0 (2017-07-05)
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -144,24 +144,25 @@ ...@@ -144,24 +144,25 @@
var room_jid = 'kitchen@conference.shakespeare.lit'; var room_jid = 'kitchen@conference.shakespeare.lit';
test_utils.openAndEnterChatRoom( test_utils.openAndEnterChatRoom(
_converse, 'kitchen', 'conference.shakespeare.lit', 'fires'); _converse, 'kitchen', 'conference.shakespeare.lit', 'fires').then(function () {
var view = _converse.chatboxviews.get(room_jid); var view = _converse.chatboxviews.get(room_jid);
view.model.set({'minimized': true}); view.model.set({'minimized': true});
var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost';
var message = 'fires: Your attention is required';
var nick = mock.chatroom_names[0],
msg = $msg({
from: room_jid+'/'+nick,
id: (new Date()).getTime(),
to: 'dummy@localhost',
type: 'groupchat'
}).c('body').t(message).tree();
view.handleMUCMessage(msg);
var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost'; expect(_converse.minimized_chats.toggleview.$('.unread-message-count').is(':visible')).toBeTruthy();
var message = 'fires: Your attention is required'; expect(_converse.minimized_chats.toggleview.$('.unread-message-count').text()).toBe('1');
var nick = mock.chatroom_names[0], done();
msg = $msg({ });
from: room_jid+'/'+nick,
id: (new Date()).getTime(),
to: 'dummy@localhost',
type: 'groupchat'
}).c('body').t(message).tree();
view.handleMUCMessage(msg);
expect(_converse.minimized_chats.toggleview.$('.unread-message-count').is(':visible')).toBeTruthy();
expect(_converse.minimized_chats.toggleview.$('.unread-message-count').text()).toBe('1');
done();
})); }));
}); });
})); }));
...@@ -43,36 +43,37 @@ ...@@ -43,36 +43,37 @@
function (done, _converse) { function (done, _converse) {
test_utils.createContacts(_converse, 'current'); test_utils.createContacts(_converse, 'current');
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy'); test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy').then(function () {
var view = _converse.chatboxviews.get('lounge@localhost'); var view = _converse.chatboxviews.get('lounge@localhost');
if (!view.$el.find('.chat-area').length) { view.renderChatArea(); } if (!view.$el.find('.chat-area').length) { view.renderChatArea(); }
var no_notification = false; var no_notification = false;
if (typeof window.Notification === 'undefined') { if (typeof window.Notification === 'undefined') {
no_notification = true; no_notification = true;
window.Notification = function () { window.Notification = function () {
return { return {
'close': function () {} 'close': function () {}
};
}; };
}; }
} spyOn(_converse, 'showMessageNotification').and.callThrough();
spyOn(_converse, 'showMessageNotification').and.callThrough(); spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
spyOn(_converse, 'areDesktopNotificationsEnabled').and.returnValue(true);
var message = 'dummy: This message will show a desktop notification';
var message = 'dummy: This message will show a desktop notification'; var nick = mock.chatroom_names[0],
var nick = mock.chatroom_names[0], msg = $msg({
msg = $msg({ from: 'lounge@localhost/'+nick,
from: 'lounge@localhost/'+nick, id: (new Date()).getTime(),
id: (new Date()).getTime(), to: 'dummy@localhost',
to: 'dummy@localhost', type: 'groupchat'
type: 'groupchat' }).c('body').t(message).tree();
}).c('body').t(message).tree(); _converse.chatboxes.onMessage(msg); // This will emit 'message'
_converse.chatboxes.onMessage(msg); // This will emit 'message' expect(_converse.areDesktopNotificationsEnabled).toHaveBeenCalled();
expect(_converse.areDesktopNotificationsEnabled).toHaveBeenCalled(); expect(_converse.showMessageNotification).toHaveBeenCalled();
expect(_converse.showMessageNotification).toHaveBeenCalled(); if (no_notification) {
if (no_notification) { delete window.Notification;
delete window.Notification; }
} done();
done(); });
})); }));
it("is shown for headline messages", it("is shown for headline messages",
...@@ -158,43 +159,44 @@ ...@@ -158,43 +159,44 @@
function (done, _converse) { function (done, _converse) {
test_utils.createContacts(_converse, 'current'); test_utils.createContacts(_converse, 'current');
test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy'); test_utils.openAndEnterChatRoom(_converse, 'lounge', 'localhost', 'dummy').then(function () {
_converse.play_sounds = true; _converse.play_sounds = true;
spyOn(_converse, 'playSoundNotification'); spyOn(_converse, 'playSoundNotification');
var view = _converse.chatboxviews.get('lounge@localhost'); var view = _converse.chatboxviews.get('lounge@localhost');
if (!view.$el.find('.chat-area').length) { view.renderChatArea(); } if (!view.$el.find('.chat-area').length) { view.renderChatArea(); }
var text = 'This message will play a sound because it mentions dummy'; var text = 'This message will play a sound because it mentions dummy';
var message = $msg({ var message = $msg({
from: 'lounge@localhost/otheruser', from: 'lounge@localhost/otheruser',
id: '1', id: '1',
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t(text); }).c('body').t(text);
view.onChatRoomMessage(message.nodeTree); view.onChatRoomMessage(message.nodeTree);
expect(_converse.playSoundNotification).toHaveBeenCalled(); expect(_converse.playSoundNotification).toHaveBeenCalled();
text = "This message won't play a sound"; text = "This message won't play a sound";
message = $msg({ message = $msg({
from: 'lounge@localhost/otheruser', from: 'lounge@localhost/otheruser',
id: '2', id: '2',
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t(text); }).c('body').t(text);
view.onChatRoomMessage(message.nodeTree); view.onChatRoomMessage(message.nodeTree);
expect(_converse.playSoundNotification, 1); expect(_converse.playSoundNotification, 1);
_converse.play_sounds = false; _converse.play_sounds = false;
text = "This message won't play a sound because it is sent by dummy"; text = "This message won't play a sound because it is sent by dummy";
message = $msg({ message = $msg({
from: 'lounge@localhost/dummy', from: 'lounge@localhost/dummy',
id: '3', id: '3',
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t(text); }).c('body').t(text);
view.onChatRoomMessage(message.nodeTree); view.onChatRoomMessage(message.nodeTree);
expect(_converse.playSoundNotification, 1); expect(_converse.playSoundNotification, 1);
_converse.play_sounds = false; _converse.play_sounds = false;
done(); done();
});
})); }));
}); });
}); });
......
...@@ -94,56 +94,57 @@ ...@@ -94,56 +94,57 @@
.then(function () { .then(function () {
var room_jid = 'kitchen@conference.shakespeare.lit'; var room_jid = 'kitchen@conference.shakespeare.lit';
test_utils.openAndEnterChatRoom( test_utils.openAndEnterChatRoom(
_converse, 'kitchen', 'conference.shakespeare.lit', 'romeo'); _converse, 'kitchen', 'conference.shakespeare.lit', 'romeo').then(function () {
var view = _converse.chatboxviews.get(room_jid);
view.model.set({'minimized': true}); var view = _converse.chatboxviews.get(room_jid);
view.model.set({'minimized': true});
var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost'; var contact_jid = mock.cur_names[5].replace(/ /g,'.').toLowerCase() + '@localhost';
var nick = mock.chatroom_names[0]; var nick = mock.chatroom_names[0];
view.handleMUCMessage( view.handleMUCMessage(
$msg({ $msg({
from: room_jid+'/'+nick, from: room_jid+'/'+nick,
id: (new Date()).getTime(), id: (new Date()).getTime(),
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t('foo').tree()); }).c('body').t('foo').tree());
// If the user isn't mentioned, the counter doesn't get incremented, but the text of the room is bold // If the user isn't mentioned, the counter doesn't get incremented, but the text of the room is bold
var room_el = _converse.rooms_list_view.el.querySelector( var room_el = _converse.rooms_list_view.el.querySelector(
".available-chatroom" ".available-chatroom"
); );
expect(_.includes(room_el.classList, 'unread-msgs')); expect(_.includes(room_el.classList, 'unread-msgs'));
// If the user is mentioned, the counter also gets updated // If the user is mentioned, the counter also gets updated
view.handleMUCMessage( view.handleMUCMessage(
$msg({ $msg({
from: room_jid+'/'+nick, from: room_jid+'/'+nick,
id: (new Date()).getTime(), id: (new Date()).getTime(),
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t('romeo: Your attention is required').tree() }).c('body').t('romeo: Your attention is required').tree()
); );
var indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator"); var indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator");
expect(indicator_el.textContent).toBe('1'); expect(indicator_el.textContent).toBe('1');
view.handleMUCMessage( view.handleMUCMessage(
$msg({ $msg({
from: room_jid+'/'+nick, from: room_jid+'/'+nick,
id: (new Date()).getTime(), id: (new Date()).getTime(),
to: 'dummy@localhost', to: 'dummy@localhost',
type: 'groupchat' type: 'groupchat'
}).c('body').t('romeo: and another thing...').tree() }).c('body').t('romeo: and another thing...').tree()
); );
indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator"); indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator");
expect(indicator_el.textContent).toBe('2'); expect(indicator_el.textContent).toBe('2');
// When the chat gets maximized again, the unread indicators are removed // When the chat gets maximized again, the unread indicators are removed
view.model.set({'minimized': false}); view.model.set({'minimized': false});
indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator"); indicator_el = _converse.rooms_list_view.el.querySelector(".msgs-indicator");
expect(_.isNull(indicator_el)); expect(_.isNull(indicator_el));
room_el = _converse.rooms_list_view.el.querySelector(".available-chatroom"); room_el = _converse.rooms_list_view.el.querySelector(".available-chatroom");
expect(_.includes(room_el.classList, 'unread-msgs')).toBeFalsy(); expect(_.includes(room_el.classList, 'unread-msgs')).toBeFalsy();
done(); done();
});
}); });
})); }));
}); });
......
...@@ -62,7 +62,7 @@ ...@@ -62,7 +62,7 @@
const ROOMS_PANEL_ID = 'chatrooms'; const ROOMS_PANEL_ID = 'chatrooms';
const CHATROOMS_TYPE = 'chatroom'; const CHATROOMS_TYPE = 'chatroom';
const { Strophe, Backbone, $iq, $build, $msg, $pres, b64_sha1, sizzle, utils, _, fp, moment } = converse.env; const { Strophe, Backbone, Promise, $iq, $build, $msg, $pres, b64_sha1, sizzle, utils, _, fp, moment } = converse.env;
// Add Strophe Namespaces // Add Strophe Namespaces
Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC + "#admin"); Strophe.addNamespace('MUC_ADMIN', Strophe.NS.MUC + "#admin");
...@@ -448,11 +448,12 @@ ...@@ -448,11 +448,12 @@
this.registerHandlers(); this.registerHandlers();
if (this.model.get('connection_status') !== ROOMSTATUS.ENTERED) { if (this.model.get('connection_status') !== ROOMSTATUS.ENTERED) {
this.getRoomFeatures().always(() => { const handler = () => {
this.join(); this.join();
this.fetchMessages(); this.fetchMessages();
_converse.emit('chatRoomOpened', this); _converse.emit('chatRoomOpened', this);
}); }
this.getRoomFeatures().then(handler, handler);
} else { } else {
this.fetchMessages(); this.fetchMessages();
_converse.emit('chatRoomOpened', this); _converse.emit('chatRoomOpened', this);
...@@ -636,13 +637,13 @@ ...@@ -636,13 +637,13 @@
* A promise which resolves once the list has been * A promise which resolves once the list has been
* retrieved. * retrieved.
*/ */
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
affiliation = affiliation || 'member'; affiliation = affiliation || 'member';
const iq = $iq({to: chatroom_jid, type: "get"}) const iq = $iq({to: chatroom_jid, type: "get"})
.c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
.c("item", {'affiliation': affiliation}); .c("item", {'affiliation': affiliation});
_converse.connection.sendIQ(iq, deferred.resolve, deferred.reject); _converse.connection.sendIQ(iq, resolve, reject);
return deferred.promise(); });
}, },
parseMemberListIQ (iq) { parseMemberListIQ (iq) {
...@@ -725,18 +726,18 @@ ...@@ -725,18 +726,18 @@
* (Object) member: Map containing the member's jid and * (Object) member: Map containing the member's jid and
* optionally a reason and affiliation. * optionally a reason and affiliation.
*/ */
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
const iq = $iq({to: chatroom_jid, type: "set"}) const iq = $iq({to: chatroom_jid, type: "set"})
.c("query", {xmlns: Strophe.NS.MUC_ADMIN}) .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
.c("item", { .c("item", {
'affiliation': member.affiliation || affiliation, 'affiliation': member.affiliation || affiliation,
'jid': member.jid 'jid': member.jid
}); });
if (!_.isUndefined(member.reason)) { if (!_.isUndefined(member.reason)) {
iq.c("reason", member.reason); iq.c("reason", member.reason);
} }
_converse.connection.sendIQ(iq, deferred.resolve, deferred.reject); _converse.connection.sendIQ(iq, resolve, reject);
return deferred; });
}, },
setAffiliation (affiliation, members) { setAffiliation (affiliation, members) {
...@@ -772,10 +773,10 @@ ...@@ -772,10 +773,10 @@
members, members,
_.partial(this.sendAffiliationIQ, this.model.get('jid'), affiliation) _.partial(this.sendAffiliationIQ, this.model.get('jid'), affiliation)
); );
return $.when.apply($, promises); return Promise.all(promises);
}, },
setAffiliations (members, onSuccess, onError) { setAffiliations (members) {
/* Send IQ stanzas to the server to modify the /* Send IQ stanzas to the server to modify the
* affiliations in this room. * affiliations in this room.
* *
...@@ -786,14 +787,8 @@ ...@@ -786,14 +787,8 @@
* (Function) onSuccess: callback for a succesful response * (Function) onSuccess: callback for a succesful response
* (Function) onError: callback for an error response * (Function) onError: callback for an error response
*/ */
if (_.isEmpty(members)) {
// Succesfully updated with zero affilations :)
onSuccess(null);
return;
}
const affiliations = _.uniq(_.map(members, 'affiliation')); const affiliations = _.uniq(_.map(members, 'affiliation'));
const promises = _.map(affiliations, _.partial(this.setAffiliation.bind(this), _, members)); _.each(affiliations, _.partial(this.setAffiliation.bind(this), _, members));
$.when.apply($, promises).done(onSuccess).fail(onError);
}, },
marshallAffiliationIQs () { marshallAffiliationIQs () {
...@@ -814,12 +809,13 @@ ...@@ -814,12 +809,13 @@
if (_.isString(affiliations)) { if (_.isString(affiliations)) {
affiliations = [affiliations]; affiliations = [affiliations];
} }
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
const promises = _.map(affiliations, _.partial(this.requestMemberList, this.model.get('jid'))); const promises = _.map(affiliations, _.partial(this.requestMemberList, this.model.get('jid')));
$.when.apply($, promises).always( Promise.all(promises).then(
_.flow(this.marshallAffiliationIQs.bind(this), deferred.resolve) _.flow(this.marshallAffiliationIQs.bind(this), resolve),
); _.flow(this.marshallAffiliationIQs.bind(this), resolve)
return deferred.promise(); );
});
}, },
updateMemberLists (members, affiliations, deltaFunc) { updateMemberLists (members, affiliations, deltaFunc) {
...@@ -840,15 +836,9 @@ ...@@ -840,15 +836,9 @@
* updated or once it's been established there's no need * updated or once it's been established there's no need
* to update the list. * to update the list.
*/ */
const deferred = new $.Deferred();
this.getJidsWithAffiliations(affiliations).then((old_members) => { this.getJidsWithAffiliations(affiliations).then((old_members) => {
this.setAffiliations( this.setAffiliations(deltaFunc(members, old_members));
deltaFunc(members, old_members),
deferred.resolve,
deferred.reject
);
}); });
return deferred.promise();
}, },
directInvite (recipient, reason) { directInvite (recipient, reason) {
...@@ -1010,14 +1000,14 @@ ...@@ -1010,14 +1000,14 @@
this.setAffiliation('admin', this.setAffiliation('admin',
[{ 'jid': args[0], [{ 'jid': args[0],
'reason': args[1] 'reason': args[1]
}]).fail(this.onCommandError.bind(this)); }]).then(null, this.onCommandError.bind(this));
break; break;
case 'ban': case 'ban':
if (!this.validateRoleChangeCommand(command, args)) { break; } if (!this.validateRoleChangeCommand(command, args)) { break; }
this.setAffiliation('outcast', this.setAffiliation('outcast',
[{ 'jid': args[0], [{ 'jid': args[0],
'reason': args[1] 'reason': args[1]
}]).fail(this.onCommandError.bind(this)); }]).then(null, this.onCommandError.bind(this));
break; break;
case 'clear': case 'clear':
this.clearChatRoomMessages(); this.clearChatRoomMessages();
...@@ -1065,7 +1055,7 @@ ...@@ -1065,7 +1055,7 @@
this.setAffiliation('member', this.setAffiliation('member',
[{ 'jid': args[0], [{ 'jid': args[0],
'reason': args[1] 'reason': args[1]
}]).fail(this.onCommandError.bind(this)); }]).then(null, this.onCommandError.bind(this));
break; break;
case 'nick': case 'nick':
_converse.connection.send($pres({ _converse.connection.send($pres({
...@@ -1079,7 +1069,7 @@ ...@@ -1079,7 +1069,7 @@
this.setAffiliation('owner', this.setAffiliation('owner',
[{ 'jid': args[0], [{ 'jid': args[0],
'reason': args[1] 'reason': args[1]
}]).fail(this.onCommandError.bind(this)); }]).then(null, this.onCommandError.bind(this));
break; break;
case 'op': case 'op':
if (!this.validateRoleChangeCommand(command, args)) { break; } if (!this.validateRoleChangeCommand(command, args)) { break; }
...@@ -1092,7 +1082,7 @@ ...@@ -1092,7 +1082,7 @@
this.setAffiliation('none', this.setAffiliation('none',
[{ 'jid': args[0], [{ 'jid': args[0],
'reason': args[1] 'reason': args[1]
}]).fail(this.onCommandError.bind(this)); }]).then(null, this.onCommandError.bind(this));
break; break;
case 'topic': case 'topic':
case 'subject': case 'subject':
...@@ -1330,22 +1320,18 @@ ...@@ -1330,22 +1320,18 @@
* Parameters: * Parameters:
* (HTMLElement) form: The configuration form DOM element. * (HTMLElement) form: The configuration form DOM element.
*/ */
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
const $inputs = $(form).find(':input:not([type=button]):not([type=submit])'), const $inputs = $(form).find(':input:not([type=button]):not([type=submit])'),
configArray = []; configArray = [];
$inputs.each(function () { $inputs.each(function () {
configArray.push(utils.webForm2xForm(this)); configArray.push(utils.webForm2xForm(this));
}); });
this.sendConfiguration( this.sendConfiguration(configArray, resolve, reject);
configArray, this.$el.find('div.chatroom-form-container').hide((el) => {
deferred.resolve, $(el).remove();
deferred.reject this.renderAfterTransition();
); });
this.$el.find('div.chatroom-form-container').hide((el) => {
$(el).remove();
this.renderAfterTransition();
}); });
return deferred.promise();
}, },
autoConfigureChatRoom () { autoConfigureChatRoom () {
...@@ -1360,44 +1346,38 @@ ...@@ -1360,44 +1346,38 @@
* containing the configuration. * containing the configuration.
*/ */
const that = this; const that = this;
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
this.fetchRoomConfiguration().then(function (stanza) {
this.fetchRoomConfiguration().then(function (stanza) { const configArray = [],
const configArray = [], fields = stanza.querySelectorAll('field'),
fields = stanza.querySelectorAll('field'), config = that.model.get('roomconfig');
config = that.model.get('roomconfig'); let count = fields.length;
let count = fields.length; _.each(fields, function (field) {
const fieldname = field.getAttribute('var').replace('muc#roomconfig_', ''),
_.each(fields, function (field) { type = field.getAttribute('type');
const fieldname = field.getAttribute('var').replace('muc#roomconfig_', ''), let value;
type = field.getAttribute('type'); if (fieldname in config) {
let value; switch (type) {
if (fieldname in config) { case 'boolean':
switch (type) { value = config[fieldname] ? 1 : 0;
case 'boolean': break;
value = config[fieldname] ? 1 : 0; case 'list-multi':
break; // TODO: we don't yet handle "list-multi" types
case 'list-multi': value = field.innerHTML;
// TODO: we don't yet handle "list-multi" types break;
value = field.innerHTML; default:
break; value = config[fieldname];
default: }
value = config[fieldname]; field.innerHTML = $build('value').t(value);
} }
field.innerHTML = $build('value').t(value); configArray.push(field);
} if (!--count) {
configArray.push(field); that.sendConfiguration(configArray, resolve, reject);
if (!--count) { }
that.sendConfiguration( });
configArray,
deferred.resolve,
deferred.reject
);
}
}); });
}); });
return deferred;
}, },
cancelConfiguration () { cancelConfiguration () {
...@@ -1419,70 +1399,72 @@ ...@@ -1419,70 +1399,72 @@
* Parameters: * Parameters:
* (Function) handler: The handler for the response IQ * (Function) handler: The handler for the response IQ
*/ */
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
_converse.connection.sendIQ( _converse.connection.sendIQ(
$iq({ $iq({
'to': this.model.get('jid'), 'to': this.model.get('jid'),
'type': "get" 'type': "get"
}).c("query", {xmlns: Strophe.NS.MUC_OWNER}), }).c("query", {xmlns: Strophe.NS.MUC_OWNER}),
(iq) => { (iq) => {
if (handler) { if (handler) {
handler.apply(this, arguments); handler.apply(this, arguments);
}
resolve(iq);
},
reject // errback
);
});
},
parseRoomFeatures (iq) {
/* See http://xmpp.org/extensions/xep-0045.html#disco-roominfo
*
* <identity
* category='conference'
* name='A Dark Cave'
* type='text'/>
* <feature var='http://jabber.org/protocol/muc'/>
* <feature var='muc_passwordprotected'/>
* <feature var='muc_hidden'/>
* <feature var='muc_temporary'/>
* <feature var='muc_open'/>
* <feature var='muc_unmoderated'/>
* <feature var='muc_nonanonymous'/>
* <feature var='urn:xmpp:mam:0'/>
*/
const features = {
'features_fetched': true
};
_.each(iq.querySelectorAll('feature'), function (field) {
const fieldname = field.getAttribute('var');
if (!fieldname.startsWith('muc_')) {
if (fieldname === Strophe.NS.MAM) {
features.mam_enabled = true;
} }
deferred.resolve(iq); return;
}, }
deferred.reject // errback features[fieldname.replace('muc_', '')] = true;
); });
return deferred.promise(); const desc_field = iq.querySelector('field[var="muc#roominfo_description"] value');
if (!_.isNull(desc_field)) {
features.description = desc_field.textContent;
}
this.model.save(features);
}, },
getRoomFeatures () { getRoomFeatures () {
/* Fetch the room disco info, parse it and then /* Fetch the room disco info, parse it and then
* save it on the Backbone.Model of this chat rooms. * save it on the Backbone.Model of this chat rooms.
*/ */
const deferred = new $.Deferred(); return new Promise((resolve, reject) => {
const that = this; _converse.connection.disco.info(
_converse.connection.disco.info(this.model.get('jid'), null, this.model.get('jid'),
function (iq) { null,
/* See http://xmpp.org/extensions/xep-0045.html#disco-roominfo _.flow(this.parseRoomFeatures.bind(this), resolve),
* () => { reject(new Error("Could not parse the room features")) },
* <identity 5000
* category='conference' );
* name='A Dark Cave' });
* type='text'/>
* <feature var='http://jabber.org/protocol/muc'/>
* <feature var='muc_passwordprotected'/>
* <feature var='muc_hidden'/>
* <feature var='muc_temporary'/>
* <feature var='muc_open'/>
* <feature var='muc_unmoderated'/>
* <feature var='muc_nonanonymous'/>
* <feature var='urn:xmpp:mam:0'/>
*/
const features = {
'features_fetched': true
};
_.each(iq.querySelectorAll('feature'), function (field) {
const fieldname = field.getAttribute('var');
if (!fieldname.startsWith('muc_')) {
if (fieldname === Strophe.NS.MAM) {
features.mam_enabled = true;
}
return;
}
features[fieldname.replace('muc_', '')] = true;
});
const desc_field = iq.querySelector('field[var="muc#roominfo_description"] value');
if (!_.isNull(desc_field)) {
features.description = desc_field.textContent;
}
that.model.save(features);
return deferred.resolve();
},
deferred.reject,
5000
);
return deferred.promise();
}, },
getAndRenderConfigurationForm (ev) { getAndRenderConfigurationForm (ev) {
......
...@@ -86,54 +86,60 @@ ...@@ -86,54 +86,60 @@
this.openRoomsPanel(_converse); this.openRoomsPanel(_converse);
var roomspanel = _converse.chatboxviews.get('controlbox').roomspanel; var roomspanel = _converse.chatboxviews.get('controlbox').roomspanel;
roomspanel.$el.find('input.new-chatroom-name').val(room); roomspanel.$el.find('input.new-chatroom-name').val(room);
roomspanel.$el.find('input.new-chatroom-nick').val(nick);
roomspanel.$el.find('input.new-chatroom-server').val(server); roomspanel.$el.find('input.new-chatroom-server').val(server);
roomspanel.$el.find('form').submit(); roomspanel.$el.find('form').submit();
this.closeControlBox(_converse); this.closeControlBox(_converse);
}; };
utils.openAndEnterChatRoom = function (converse, room, server, nick) { utils.openAndEnterChatRoom = function (converse, room, server, nick) {
sinon.spy(converse.connection, 'sendIQ'); return new Promise(function (resolve, reject) {
utils.openChatRoom(converse, room, server); sinon.spy(converse.connection, 'sendIQ');
var view = converse.chatboxviews.get((room+'@'+server).toLowerCase()); utils.openChatRoom(converse, room, server);
var view = converse.chatboxviews.get((room+'@'+server).toLowerCase());
// We pretend this is a new room, so no disco info is returned.
var IQ_id = converse.connection.sendIQ.firstCall.returnValue; // We pretend this is a new room, so no disco info is returned.
var features_stanza = $iq({ var IQ_id = converse.connection.sendIQ.firstCall.returnValue;
from: 'lounge@localhost', var features_stanza = $iq({
'id': IQ_id, 'from': 'lounge@localhost',
'to': 'dummy@localhost/desktop', 'id': IQ_id,
'type': 'error' 'to': 'dummy@localhost/desktop',
}).c('error', {'type': 'cancel'}) 'type': 'error'
.c('item-not-found', {'xmlns': "urn:ietf:params:xml:ns:xmpp-stanzas"}); }).c('error', {'type': 'cancel'})
converse.connection._dataRecv(utils.createRequest(features_stanza)); .c('item-not-found', {'xmlns': "urn:ietf:params:xml:ns:xmpp-stanzas"});
converse.connection._dataRecv(utils.createRequest(features_stanza));
// The XMPP server returns the reserved nick for this user.
IQ_id = converse.connection.sendIQ.secondCall.returnValue; utils.waitUntil(function () {
var stanza = $iq({ return converse.connection.sendIQ.secondCall;
'type': 'result', }).then(function () {
'id': IQ_id, // The XMPP server returns the reserved nick for this user.
'from': view.model.get('jid'), IQ_id = converse.connection.sendIQ.secondCall.returnValue;
'to': converse.connection.jid var stanza = $iq({
}).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info', 'node': 'x-roomuser-item'}) 'type': 'result',
.c('identity', {'category': 'conference', 'name': nick, 'type': 'text'}); 'id': IQ_id,
converse.connection._dataRecv(utils.createRequest(stanza)); 'from': view.model.get('jid'),
// The user has just entered the room (because join was called) 'to': converse.connection.jid
// and receives their own presence from the server. }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info', 'node': 'x-roomuser-item'})
// See example 24: http://xmpp.org/extensions/xep-0045.html#enter-pres .c('identity', {'category': 'conference', 'name': nick, 'type': 'text'});
var presence = $pres({ converse.connection._dataRecv(utils.createRequest(stanza));
to: converse.connection.jid, // The user has just entered the room (because join was called)
from: room+'@'+server+'/'+nick, // and receives their own presence from the server.
id: 'DC352437-C019-40EC-B590-AF29E879AF97' // See example 24: http://xmpp.org/extensions/xep-0045.html#enter-pres
}).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'}) var presence = $pres({
.c('item').attrs({ to: converse.connection.jid,
affiliation: 'member', from: room+'@'+server+'/'+nick,
jid: converse.bare_jid, id: 'DC352437-C019-40EC-B590-AF29E879AF97'
role: 'occupant' }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
}).up() .c('item').attrs({
.c('status').attrs({code:'110'}); affiliation: 'member',
converse.connection._dataRecv(utils.createRequest(presence)); jid: converse.bare_jid,
converse.connection.sendIQ.restore(); role: 'occupant'
}).up()
.c('status').attrs({code:'110'});
converse.connection._dataRecv(utils.createRequest(presence));
converse.connection.sendIQ.restore();
resolve();
});
});
}; };
utils.clearBrowserStorage = function () { utils.clearBrowserStorage = function () {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment