diff --git a/docs/CHANGES.md b/docs/CHANGES.md
index 5cfb5cd19..819ce8a01 100755
--- a/docs/CHANGES.md
+++ b/docs/CHANGES.md
@@ -20,6 +20,9 @@
- Allow JIDs not on the roster to be invited to a chatroom. [jcbrand]
- #770 Allow setting contact attrs on chats.open [Ape]
+## 2.0.7 (2017-02-14)
+- Bugfix. 'TypeError: this.sendConfiguration(...).then is not a function' when an instant room is created. [jcbrand]
+
## 2.0.6 (2017-02-13)
- Escape user-generated input to prevent JS-injection attacks. (Thanks to SamWhited) [jcbrand]
- #486 Honor existing mam user configuration [throwaway42]
diff --git a/spec/chatroom.js b/spec/chatroom.js
index 9381cc3d1..3e99ce570 100644
--- a/spec/chatroom.js
+++ b/spec/chatroom.js
@@ -235,6 +235,114 @@
}));
});
+ describe("An instant chat room", function () {
+ it("will be created when muc_instant_rooms is set to true", mock.initConverse(function (_converse) {
+ var sent_IQ, IQ_id;
+ var sendIQ = _converse.connection.sendIQ;
+ spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
+ sent_IQ = iq;
+ IQ_id = sendIQ.bind(this)(iq, callback, errback);
+ });
+ /*
+ *
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+ test_utils.openChatRoom(_converse, 'lounge', 'localhost', 'dummy');
+ // We pretend this is a new room, so no disco info is returned.
+ var features_stanza = $iq({
+ from: 'lounge@localhost',
+ 'id': IQ_id,
+ 'to': 'dummy@localhost/desktop',
+ 'type': 'error'
+ }).c('error', {'type': 'cancel'})
+ .c('item-not-found', {'xmlns': "urn:ietf:params:xml:ns:xmpp-stanzas"});
+ _converse.connection._dataRecv(test_utils.createRequest(features_stanza));
+
+
+ var view = _converse.chatboxviews.get('lounge@localhost');
+ spyOn(view, 'join').andCallThrough();
+
+ /*
+ *
+ *
+ */
+ expect(sent_IQ.toLocaleString()).toBe(
+ ""+
+ ""
+ );
+ /* *
+ *
+ *
+ *
+ *
+ */
+ var stanza = $iq({
+ 'type': 'error',
+ 'id': IQ_id,
+ 'from': view.model.get('jid'),
+ 'to': _converse.connection.jid
+ }).c('error', {'type': 'cancel'})
+ .c('item-not-found', {'xmlns': "urn:ietf:params:xml:ns:xmpp-stanzas"});
+ _converse.connection._dataRecv(test_utils.createRequest(stanza));
+
+ // TODO: enter nickname
+ var $input = view.$el.find('input.new-chatroom-nick');
+ $input.val('nicky').parents('form').submit();
+
+ expect(view.join).toHaveBeenCalled();
+
+ // The user has just entered the room (because join was called)
+ // and receives their own presence from the server.
+ // See example 24:
+ // http://xmpp.org/extensions/xep-0045.html#enter-pres
+ //
+ /*
+ *
+ *
+ *
+ *
+ *
+ *
+ */
+ var presence = $pres({
+ to:'dummy@localhost/resource',
+ from:'lounge@localhost/thirdwitch',
+ id:'5025e055-036c-4bc5-a227-706e7e352053'
+ }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
+ .c('item').attrs({
+ affiliation: 'owner',
+ jid: 'dummy@localhost/resource',
+ role: 'moderator'
+ }).up()
+ .c('status').attrs({code:'110'}).up()
+ .c('status').attrs({code:'201'}).nodeTree;
+
+ _converse.connection._dataRecv(test_utils.createRequest(presence));
+ var info_text = view.$el.find('.chat-content .chat-info').text();
+ expect(info_text).toBe('A new room has been created');
+
+ // An instant room is created by saving the default configuratoin.
+ //
+ /*
+ *
+ *
+ */
+ expect(sent_IQ.toLocaleString()).toBe(
+ ""+
+ ""+
+ "");
+ }));
+ });
+
describe("A Chat Room", function () {
it("can have spaces and special characters in its name", mock.initConverse(function (_converse) {
diff --git a/src/converse-muc.js b/src/converse-muc.js
index e29e866e6..56841b7bc 100755
--- a/src/converse-muc.js
+++ b/src/converse-muc.js
@@ -1203,19 +1203,25 @@
* Parameters:
* (HTMLElement) form: The configuration form DOM element.
*/
+ var deferred = new $.Deferred();
var that = this;
var $inputs = $(form).find(':input:not([type=button]):not([type=submit])'),
configArray = [];
$inputs.each(function () {
configArray.push(utils.webForm2xForm(this));
});
- this.sendConfiguration(configArray);
+ this.sendConfiguration(
+ configArray,
+ deferred.resolve,
+ deferred.reject
+ );
this.$el.find('div.chatroom-form-container').hide(
function () {
$(this).remove();
that.$el.find('.chat-area').removeClass('hidden');
that.$el.find('.occupants').removeClass('hidden');
});
+ return deferred.promise();
},
autoConfigureChatRoom: function (stanza) {
@@ -1727,7 +1733,7 @@
*
* See http://xmpp.org/extensions/xep-0045.html#createroom-instant
*/
- this.sendConfiguration().then(this.getRoomFeatures.bind(this));
+ this.saveConfiguration().then(this.getRoomFeatures.bind(this));
},
onChatRoomPresence: function (pres) {