Commit 12d6785d authored by JC Brand's avatar JC Brand

Fixes #472 Cannot read property 'splitOnce' of undefined

parent 7d1fc391
...@@ -2896,6 +2896,21 @@ ...@@ -2896,6 +2896,21 @@
return this.setAffiliation(room, jid, 'admin', reason, handler_cb, error_cb); return this.setAffiliation(room, jid, 'admin', reason, handler_cb, error_cb);
}, },
validateRoleChangeCommand: function (command, args) {
/* Check that a command to change a chat room user's role or
* affiliation has anough arguments.
*/
// TODO check if first argument is valid
if (args.length < 1 || args.length > 2) {
this.showStatusNotification(
__("Error: the \""+command+"\" command takes two arguments, the user's nickname and optionally a reason."),
true
);
return false;
}
return true;
},
onChatRoomMessageSubmitted: function (text) { onChatRoomMessageSubmitted: function (text) {
/* Gets called when the user presses enter to send off a /* Gets called when the user presses enter to send off a
* message in a chat room. * message in a chat room.
...@@ -2903,15 +2918,17 @@ ...@@ -2903,15 +2918,17 @@
* Parameters: * Parameters:
* (String) text - The message text. * (String) text - The message text.
*/ */
var match = text.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false, '', '']; var match = text.replace(/^\s*/, "").match(/^\/(.*?)(?: (.*))?$/) || [false, '', ''],
var args = match[2].splitOnce(' '); args = match[2] && match[2].splitOnce(' ') || [];
switch (match[1]) { switch (match[1]) {
case 'admin': case 'admin':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.setAffiliation( this.setAffiliation(
this.model.get('jid'), args[0], 'admin', args[1], this.model.get('jid'), args[0], 'admin', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
break; break;
case 'ban': case 'ban':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.setAffiliation( this.setAffiliation(
this.model.get('jid'), args[0], 'outcast', args[1], this.model.get('jid'), args[0], 'outcast', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
...@@ -2920,6 +2937,7 @@ ...@@ -2920,6 +2937,7 @@
this.clearChatRoomMessages(); this.clearChatRoomMessages();
break; break;
case 'deop': case 'deop':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.modifyRole( this.modifyRole(
this.model.get('jid'), args[0], 'participant', args[1], this.model.get('jid'), args[0], 'participant', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
...@@ -2944,16 +2962,19 @@ ...@@ -2944,16 +2962,19 @@
]); ]);
break; break;
case 'kick': case 'kick':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.modifyRole( this.modifyRole(
this.model.get('jid'), args[0], 'none', args[1], this.model.get('jid'), args[0], 'none', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
break; break;
case 'mute': case 'mute':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.modifyRole( this.modifyRole(
this.model.get('jid'), args[0], 'visitor', args[1], this.model.get('jid'), args[0], 'visitor', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
break; break;
case 'member': case 'member':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.setAffiliation( this.setAffiliation(
this.model.get('jid'), args[0], 'member', args[1], this.model.get('jid'), args[0], 'member', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
...@@ -2966,16 +2987,19 @@ ...@@ -2966,16 +2987,19 @@
}).tree()); }).tree());
break; break;
case 'owner': case 'owner':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.setAffiliation( this.setAffiliation(
this.model.get('jid'), args[0], 'owner', args[1], this.model.get('jid'), args[0], 'owner', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
break; break;
case 'op': case 'op':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.modifyRole( this.modifyRole(
this.model.get('jid'), args[0], 'moderator', args[1], this.model.get('jid'), args[0], 'moderator', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
break; break;
case 'revoke': case 'revoke':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.setAffiliation( this.setAffiliation(
this.model.get('jid'), args[0], 'none', args[1], this.model.get('jid'), args[0], 'none', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
...@@ -2990,6 +3014,7 @@ ...@@ -2990,6 +3014,7 @@
); );
break; break;
case 'voice': case 'voice':
if (!this.validateRoleChangeCommand(match[1], args)) { break; }
this.modifyRole( this.modifyRole(
this.model.get('jid'), args[0], 'participant', args[1], this.model.get('jid'), args[0], 'participant', args[1],
undefined, this.onCommandError.bind(this)); undefined, this.onCommandError.bind(this));
......
...@@ -4,11 +4,12 @@ Changelog ...@@ -4,11 +4,12 @@ Changelog
0.9.6 (Unreleased) 0.9.6 (Unreleased)
------------------ ------------------
* Bugfix. Spinner doesn't disappear when scrolling up (when server doesn't support XEP-0313). [jcbrand]
* #462 Fix MUC rooms with names containing special characters not working [1st8] * #462 Fix MUC rooms with names containing special characters not working [1st8]
* #468 Fix [object Object] being sometimes shown as status [1st8] * #468 Fix [object Object] being sometimes shown as status [1st8]
* #472 Fix "Cannot read property 'splitOnce' of undefined" when typing /clear in a chat room. [jcbrand]
* #493 Roster wasn't being updated after a Roster push update [teseo, jcbrand] * #493 Roster wasn't being updated after a Roster push update [teseo, jcbrand]
* #496 Bugfix. Pings weren't being sent out. [teseo, jcbrand] * #496 Bugfix. Pings weren't being sent out. [teseo, jcbrand]
* Bugfix. Spinner doesn't disappear when scrolling up (when server doesn't support XEP-0313). [jcbrand]
0.9.5 (2015-08-24) 0.9.5 (2015-08-24)
------------------ ------------------
......
...@@ -14,6 +14,13 @@ ...@@ -14,6 +14,13 @@
var Strophe = converse_api.env.Strophe; var Strophe = converse_api.env.Strophe;
return describe("ChatRooms", function (mock, test_utils) { return describe("ChatRooms", function (mock, test_utils) {
beforeEach(function () {
runs(function () {
test_utils.closeAllChatBoxes();
test_utils.clearBrowserStorage();
});
});
describe("A Chat Room", function () { describe("A Chat Room", function () {
beforeEach(function () { beforeEach(function () {
runs(function () { runs(function () {
...@@ -479,6 +486,62 @@ ...@@ -479,6 +486,62 @@
}.bind(converse)); }.bind(converse));
}.bind(converse)); }.bind(converse));
describe("Each chat room can take special commands", function () {
beforeEach(function () {
runs(function () {
test_utils.closeAllChatBoxes();
test_utils.clearBrowserStorage();
});
});
it("to clear messages", function () {
test_utils.openChatRoom('lounge', 'localhost', 'dummy');
var view = converse.chatboxviews.get('lounge@localhost'),
chatroom = view.model,
$chat_content = view.$el.find('.chat-content');
spyOn(view, 'onChatRoomMessageSubmitted').andCallThrough();
spyOn(view, 'clearChatRoomMessages');
view.$el.find('.chat-textarea').text('/clear');
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
expect(view.onChatRoomMessageSubmitted).toHaveBeenCalled();
expect(view.clearChatRoomMessages).toHaveBeenCalled();
});
it("to ban a user", function () {
test_utils.openChatRoom('lounge', 'localhost', 'dummy');
var view = converse.chatboxviews.get('lounge@localhost'),
chatroom = view.model,
$chat_content = view.$el.find('.chat-content');
spyOn(view, 'onChatRoomMessageSubmitted').andCallThrough();
spyOn(view, 'setAffiliation').andCallThrough();
spyOn(view, 'showStatusNotification').andCallThrough();
spyOn(view, 'validateRoleChangeCommand').andCallThrough();
view.$el.find('.chat-textarea').text('/ban');
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
expect(view.onChatRoomMessageSubmitted).toHaveBeenCalled();
expect(view.validateRoleChangeCommand).toHaveBeenCalled();
expect(view.showStatusNotification).toHaveBeenCalledWith(
"Error: the \"ban\" command takes two arguments, the user's nickname and optionally a reason.",
true
);
expect(view.setAffiliation).not.toHaveBeenCalled();
// Call now with the correct amount of arguments.
// XXX: Calling onChatRoomMessageSubmitted directly, trying
// again via triggering Event doesn't work for some weird
// reason.
view.onChatRoomMessageSubmitted('/ban jid This is the reason');
expect(view.validateRoleChangeCommand.callCount).toBe(2);
expect(view.showStatusNotification.callCount).toBe(1);
expect(view.setAffiliation).toHaveBeenCalled();
});
}.bind(converse));
describe("When attempting to enter a chatroom", function () { describe("When attempting to enter a chatroom", function () {
beforeEach(function () { beforeEach(function () {
var roomspanel = this.chatboxviews.get('controlbox').roomspanel; var roomspanel = this.chatboxviews.get('controlbox').roomspanel;
......
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