Add jshint checking and fix errors.
This commit is contained in:
parent
218b4714fd
commit
e835a25184
21
Gruntfile.js
21
Gruntfile.js
@ -1,6 +1,6 @@
|
||||
/*global __dirname, process */
|
||||
module.exports = function(grunt) {
|
||||
var path = require('path');
|
||||
var cfg = require('./package.json');
|
||||
grunt.initConfig({
|
||||
jst: {
|
||||
compile: {
|
||||
@ -36,20 +36,6 @@ module.exports = function(grunt) {
|
||||
}
|
||||
},
|
||||
|
||||
jshint: {
|
||||
options: {
|
||||
trailing: true
|
||||
},
|
||||
target: {
|
||||
src : [
|
||||
'converse.js',
|
||||
'mock.js',
|
||||
'main.js',
|
||||
'tests_main.js',
|
||||
'spec/*.js'
|
||||
]
|
||||
}
|
||||
},
|
||||
cssmin: {
|
||||
options: {
|
||||
banner: "/*"+
|
||||
@ -70,7 +56,6 @@ module.exports = function(grunt) {
|
||||
}
|
||||
});
|
||||
grunt.loadNpmTasks('grunt-contrib-cssmin');
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-contrib-jst');
|
||||
grunt.loadNpmTasks('grunt-json');
|
||||
grunt.loadNpmTasks('grunt-contrib-requirejs');
|
||||
@ -136,8 +121,4 @@ module.exports = function(grunt) {
|
||||
});
|
||||
|
||||
grunt.registerTask('minify', 'Create a new minified builds', ['cssmin', 'jsmin']);
|
||||
|
||||
grunt.registerTask('check', 'Perform all checks (e.g. before releasing)', function () {
|
||||
grunt.task.run('jshint', 'test');
|
||||
});
|
||||
};
|
||||
|
30
Makefile
30
Makefile
@ -1,18 +1,29 @@
|
||||
# You can set these variables from the command line.
|
||||
BOWER ?= node_modules/.bin/bower
|
||||
BUILDDIR = ./docs
|
||||
PAPER =
|
||||
PHANTOMJS ?= ./node_modules/.bin/phantomjs
|
||||
SPHINXBUILD ?= ./bin/sphinx-build
|
||||
SPHINXOPTS =
|
||||
PO2JSON ?= ./node_modules/.bin/po2json
|
||||
SASS ?= ./.bundle/bin/sass
|
||||
BUNDLE ?= ./.bundle/bin/bundle
|
||||
GRUNT ?= ./node_modules/.bin/grunt
|
||||
HTTPSERVE ?= ./node_modules/.bin/http-server
|
||||
JSHINT ?= ./node_modules/.bin/jshint
|
||||
PAPER =
|
||||
PHANTOMJS ?= ./node_modules/.bin/phantomjs
|
||||
PO2JSON ?= ./node_modules/.bin/po2json
|
||||
SASS ?= ./.bundle/bin/sass
|
||||
SPHINXBUILD ?= ./bin/sphinx-build
|
||||
SPHINXOPTS =
|
||||
|
||||
# Internal variables.
|
||||
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) ./docs/source
|
||||
SOURCES = $(wildcard *.js) $(wildcard spec/*.js) $(wildcard src/*.js)
|
||||
JSHINTEXCEPTIONS = $(GENERATED) \
|
||||
src/otr.js \
|
||||
src/crypto.js \
|
||||
src/build-no-jquery.js \
|
||||
src/build-no-locales-no-otr.js \
|
||||
src/build-no-otr.js \
|
||||
src/build.js \
|
||||
src/bigint.js
|
||||
CHECKSOURCES = $(filter-out $(JSHINTEXCEPTIONS),$(SOURCES))
|
||||
|
||||
.PHONY: help
|
||||
help:
|
||||
@ -135,9 +146,12 @@ build:: stamp-npm
|
||||
########################################################################
|
||||
## Tests
|
||||
|
||||
.PHONY: jshint
|
||||
jshint: stamp-npm
|
||||
$(JSHINT) --config jshintrc $(CHECKSOURCES)
|
||||
|
||||
.PHONY: watch
|
||||
check: stamp-npm
|
||||
$(GRUNT) jshint
|
||||
check: stamp-npm jshint
|
||||
$(PHANTOMJS) node_modules/phantom-jasmine/lib/run_jasmine_test.coffee tests.html
|
||||
|
||||
########################################################################
|
||||
|
191
converse.js
191
converse.js
@ -3,6 +3,9 @@
|
||||
//
|
||||
// Copyright (c) 2012-2015, Jan-Carel Brand <jc@opkode.com>
|
||||
// Licensed under the Mozilla Public License (MPLv2)
|
||||
//
|
||||
/*global Backbone, CryptoJS, crypto, define, window, jQuery, setTimeout, clearTimeout, document, templates, _,
|
||||
$iq, $msg, $pres, $build, DSA, OTR, Strophe, moment, utils, b64_sha1, locales */
|
||||
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
@ -50,9 +53,6 @@
|
||||
* Cannot use this due to Safari bug.
|
||||
* See https://github.com/jcbrand/converse.js/issues/196
|
||||
*/
|
||||
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
console = { log: function () {}, error: function () {} };
|
||||
}
|
||||
|
||||
// Use Mustache style syntax for variable interpolation
|
||||
/* Configuration of underscore templates (this config is distinct to the
|
||||
@ -228,7 +228,7 @@
|
||||
// Detect support for the user's locale
|
||||
// ------------------------------------
|
||||
this.isConverseLocale = function (locale) { return typeof locales[locale] !== "undefined"; };
|
||||
this.isMomentLocale = function (locale) { return moment.locale() != moment.locale(locale); };
|
||||
this.isMomentLocale = function (locale) { return moment.locale() !== moment.locale(locale); };
|
||||
|
||||
this.isLocaleAvailable = function (locale, available) {
|
||||
/* Check whether the locale or sub locale (e.g. en-US, en) is supported.
|
||||
@ -240,7 +240,7 @@
|
||||
return locale;
|
||||
} else {
|
||||
var sublocale = locale.split("-")[0];
|
||||
if (sublocale != locale && available(sublocale)) {
|
||||
if (sublocale !== locale && available(sublocale)) {
|
||||
return sublocale;
|
||||
}
|
||||
}
|
||||
@ -517,11 +517,17 @@
|
||||
};
|
||||
|
||||
this.log = function (txt, level) {
|
||||
if (this.debug) {
|
||||
if (level == 'error') {
|
||||
console.log('ERROR: '+txt);
|
||||
var logger;
|
||||
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
logger = { log: function () {}, error: function () {} };
|
||||
} else {
|
||||
console.log(txt);
|
||||
logger = console;
|
||||
}
|
||||
if (this.debug) {
|
||||
if (level === 'error') {
|
||||
logger.log('ERROR: '+txt);
|
||||
} else {
|
||||
logger.log(txt);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -626,7 +632,7 @@
|
||||
converse.onConnected();
|
||||
}
|
||||
} else if (status === Strophe.Status.DISCONNECTED) {
|
||||
if (converse.disconnection_cause == Strophe.Status.CONNFAIL && converse.auto_reconnect) {
|
||||
if (converse.disconnection_cause === Strophe.Status.CONNFAIL && converse.auto_reconnect) {
|
||||
converse.reconnect(condition);
|
||||
} else {
|
||||
converse.renderLoginPanel();
|
||||
@ -674,14 +680,14 @@
|
||||
|
||||
this.updateMsgCounter = function () {
|
||||
if (this.msg_counter > 0) {
|
||||
if (document.title.search(/^Messages \(\d+\) /) == -1) {
|
||||
if (document.title.search(/^Messages \(\d+\) /) === -1) {
|
||||
document.title = "Messages (" + this.msg_counter + ") " + document.title;
|
||||
} else {
|
||||
document.title = document.title.replace(/^Messages \(\d+\) /, "Messages (" + this.msg_counter + ") ");
|
||||
}
|
||||
window.blur();
|
||||
window.focus();
|
||||
} else if (document.title.search(/^Messages \(\d+\) /) != -1) {
|
||||
} else if (document.title.search(/^Messages \(\d+\) /) !== -1) {
|
||||
document.title = document.title.replace(/^Messages \(\d+\) /, "");
|
||||
}
|
||||
};
|
||||
@ -766,7 +772,7 @@
|
||||
}.bind(this));
|
||||
|
||||
$(window).on("blur focus", function (ev) {
|
||||
if ((this.windowState != ev.type) && (ev.type == 'focus')) {
|
||||
if ((this.windowState !== ev.type) && (ev.type === 'focus')) {
|
||||
converse.clearMsgCounter();
|
||||
}
|
||||
this.windowState = ev.type;
|
||||
@ -918,7 +924,7 @@
|
||||
}
|
||||
},
|
||||
|
||||
generatePrivateKey: function () {
|
||||
generatePrivateKey: function (instance_tag) {
|
||||
var key = new DSA();
|
||||
var jid = converse.connection.jid;
|
||||
if (converse.cache_otr_key) {
|
||||
@ -997,7 +1003,7 @@
|
||||
|
||||
getSession: function (callback) {
|
||||
var cipher = CryptoJS.lib.PasswordBasedCipher;
|
||||
var result, pass, instance_tag, saved_key, pass_check;
|
||||
var pass, instance_tag, saved_key, pass_check;
|
||||
if (converse.cache_otr_key) {
|
||||
pass = converse.otr.getSessionPassphrase();
|
||||
if (typeof pass !== "undefined") {
|
||||
@ -1027,9 +1033,10 @@
|
||||
true // show spinner
|
||||
);
|
||||
setTimeout(function () {
|
||||
var instance_tag = OTR.makeInstanceTag();
|
||||
callback({
|
||||
'key': converse.otr.generatePrivateKey.apply(this),
|
||||
'instance_tag': OTR.makeInstanceTag()
|
||||
'key': converse.otr.generatePrivateKey.call(this, instance_tag),
|
||||
'instance_tag': instance_tag
|
||||
});
|
||||
}, 500);
|
||||
},
|
||||
@ -1084,7 +1091,7 @@
|
||||
// query message from our contact. Otherwise, it is us who will
|
||||
// send the query message to them.
|
||||
this.save({'otr_status': UNENCRYPTED});
|
||||
var session = this.getSession(function (session) {
|
||||
this.getSession(function (session) {
|
||||
this.otr = new OTR({
|
||||
fragment_size: 140,
|
||||
send_interval: 200,
|
||||
@ -1147,7 +1154,7 @@
|
||||
} else {
|
||||
time = moment().format();
|
||||
}
|
||||
if ((is_groupchat && from === this.get('nick')) || (!is_groupchat && from == converse.bare_jid)) {
|
||||
if ((is_groupchat && from === this.get('nick')) || (!is_groupchat && from === converse.bare_jid)) {
|
||||
sender = 'me';
|
||||
} else {
|
||||
sender = 'them';
|
||||
@ -1324,7 +1331,7 @@
|
||||
}
|
||||
}
|
||||
}.bind(this),
|
||||
function (iq) {
|
||||
function () {
|
||||
this.clearSpinner();
|
||||
converse.log("Error while trying to fetch archived messages", "error");
|
||||
}.bind(this)
|
||||
@ -1341,7 +1348,7 @@
|
||||
* We need this information for the drag-resizing feature.
|
||||
*/
|
||||
var $flyout = this.$el.find('.box-flyout');
|
||||
if (typeof this.model.get('height') == 'undefined') {
|
||||
if (typeof this.model.get('height') === 'undefined') {
|
||||
var height = $flyout.height();
|
||||
var width = $flyout.width();
|
||||
this.model.set('height', height);
|
||||
@ -1531,7 +1538,7 @@
|
||||
}
|
||||
this.$content.find('div.chat-event').remove();
|
||||
|
||||
if (this.is_chatroom && attrs.sender == 'them' && (new RegExp("\\b"+this.model.get('nick')+"\\b")).test(text)) {
|
||||
if (this.is_chatroom && attrs.sender === 'them' && (new RegExp("\\b"+this.model.get('nick')+"\\b")).test(text)) {
|
||||
// Add special class to mark groupchat messages in which we
|
||||
// are mentioned.
|
||||
extra_classes += ' mentioned';
|
||||
@ -1585,7 +1592,7 @@
|
||||
} else {
|
||||
this.showMessage(_.clone(message.attributes));
|
||||
}
|
||||
if ((message.get('sender') != 'me') && (converse.windowState == 'blur')) {
|
||||
if ((message.get('sender') !== 'me') && (converse.windowState === 'blur')) {
|
||||
converse.incrementMsgCounter();
|
||||
}
|
||||
if (!this.model.get('minimized') && !this.$el.is(':visible')) {
|
||||
@ -1605,18 +1612,19 @@
|
||||
.c('body').t(message.get('message')).up()
|
||||
.c(ACTIVE, {'xmlns': Strophe.NS.CHATSTATES}).up();
|
||||
|
||||
if (this.model.get('otr_status') != UNENCRYPTED) {
|
||||
if (this.model.get('otr_status') !== UNENCRYPTED) {
|
||||
// OTR messages aren't carbon copied
|
||||
messageStanza.c('private', {'xmlns': Strophe.NS.CARBONS});
|
||||
}
|
||||
converse.connection.send(messageStanza);
|
||||
if (converse.forward_messages) {
|
||||
// Forward the message, so that other connected resources are also aware of it.
|
||||
var forwarded = $msg({ to: converse.bare_jid, type: 'chat', id: message.get('msgid') })
|
||||
converse.connection.send(
|
||||
$msg({ to: converse.bare_jid, type: 'chat', id: message.get('msgid') })
|
||||
.c('forwarded', {xmlns:'urn:xmpp:forward:0'})
|
||||
.c('delay', {xmns:'urn:xmpp:delay',stamp:timestamp}).up()
|
||||
.cnode(messageStanza.tree());
|
||||
converse.connection.send(forwarded);
|
||||
.c('delay', {xmns:'urn:xmpp:delay',stamp:(new Date()).getTime()}).up()
|
||||
.cnode(messageStanza.tree())
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
@ -1701,7 +1709,7 @@
|
||||
this.chat_state_timeout = setTimeout(
|
||||
this.setChatState.bind(this), converse.TIMEOUTS.INACTIVE, INACTIVE);
|
||||
}
|
||||
if (!no_save && this.model.get('chat_state') != state) {
|
||||
if (!no_save && this.model.get('chat_state') !== state) {
|
||||
this.model.set('chat_state', state);
|
||||
}
|
||||
return this;
|
||||
@ -1711,7 +1719,7 @@
|
||||
/* Event handler for when a key is pressed in a chat box textarea.
|
||||
*/
|
||||
var $textarea = $(ev.target), message;
|
||||
if (ev.keyCode == KEY.ENTER) {
|
||||
if (ev.keyCode === KEY.ENTER) {
|
||||
ev.preventDefault();
|
||||
message = $textarea.val();
|
||||
$textarea.val('').focus();
|
||||
@ -1727,7 +1735,7 @@
|
||||
} else if (!this.model.get('chatroom')) { // chat state data is currently only for single user chat
|
||||
// Set chat state to composing if keyCode is not a forward-slash
|
||||
// (which would imply an internal command and not a message).
|
||||
this.setChatState(COMPOSING, ev.keyCode==KEY.FORWARD_SLASH);
|
||||
this.setChatState(COMPOSING, ev.keyCode === KEY.FORWARD_SLASH);
|
||||
}
|
||||
},
|
||||
|
||||
@ -1828,20 +1836,20 @@
|
||||
},
|
||||
|
||||
showOTRError: function (msg) {
|
||||
if (msg == 'Message cannot be sent at this time.') {
|
||||
if (msg === 'Message cannot be sent at this time.') {
|
||||
this.showHelpMessages(
|
||||
[__('Your message could not be sent')], 'error');
|
||||
} else if (msg == 'Received an unencrypted message.') {
|
||||
} else if (msg === 'Received an unencrypted message.') {
|
||||
this.showHelpMessages(
|
||||
[__('We received an unencrypted message')], 'error');
|
||||
} else if (msg == 'Received an unreadable encrypted message.') {
|
||||
} else if (msg === 'Received an unreadable encrypted message.') {
|
||||
this.showHelpMessages(
|
||||
[__('We received an unreadable encrypted message')],
|
||||
'error');
|
||||
} else {
|
||||
this.showHelpMessages(['Encryption error occured: '+msg], 'error');
|
||||
}
|
||||
console.log("OTR ERROR:"+msg);
|
||||
converse.log("OTR ERROR:"+msg);
|
||||
},
|
||||
|
||||
startOTRFromToolbar: function (ev) {
|
||||
@ -1917,7 +1925,7 @@
|
||||
converse.emit('contactStatusMessageChanged', item.attributes, item.get('status'));
|
||||
},
|
||||
|
||||
onOTRStatusChanged: function (item) {
|
||||
onOTRStatusChanged: function () {
|
||||
this.renderToolbar().informOTRChange();
|
||||
},
|
||||
|
||||
@ -1997,13 +2005,13 @@
|
||||
informOTRChange: function () {
|
||||
var data = this.model.toJSON();
|
||||
var msgs = [];
|
||||
if (data.otr_status == UNENCRYPTED) {
|
||||
if (data.otr_status === UNENCRYPTED) {
|
||||
msgs.push(__("Your messages are not encrypted anymore"));
|
||||
} else if (data.otr_status == UNVERIFIED) {
|
||||
} else if (data.otr_status === UNVERIFIED) {
|
||||
msgs.push(__("Your messages are now encrypted but your contact's identity has not been verified."));
|
||||
} else if (data.otr_status == VERIFIED) {
|
||||
} else if (data.otr_status === VERIFIED) {
|
||||
msgs.push(__("Your contact's identify has been verified."));
|
||||
} else if (data.otr_status == FINISHED) {
|
||||
} else if (data.otr_status === FINISHED) {
|
||||
msgs.push(__("Your contact has ended encryption on their end, you should do the same."));
|
||||
}
|
||||
return this.showHelpMessages(msgs, 'info', false);
|
||||
@ -2012,13 +2020,13 @@
|
||||
renderToolbar: function () {
|
||||
if (converse.show_toolbar) {
|
||||
var data = this.model.toJSON();
|
||||
if (data.otr_status == UNENCRYPTED) {
|
||||
if (data.otr_status === UNENCRYPTED) {
|
||||
data.otr_tooltip = __('Your messages are not encrypted. Click here to enable OTR encryption.');
|
||||
} else if (data.otr_status == UNVERIFIED) {
|
||||
} else if (data.otr_status === UNVERIFIED) {
|
||||
data.otr_tooltip = __('Your messages are encrypted, but your contact has not been verified.');
|
||||
} else if (data.otr_status == VERIFIED) {
|
||||
} else if (data.otr_status === VERIFIED) {
|
||||
data.otr_tooltip = __('Your messages are encrypted and your contact verified.');
|
||||
} else if (data.otr_status == FINISHED) {
|
||||
} else if (data.otr_status === FINISHED) {
|
||||
data.otr_tooltip = __('Your contact has closed their end of the private session, you should do the same');
|
||||
}
|
||||
this.$el.find('.chat-toolbar').html(
|
||||
@ -2080,7 +2088,7 @@
|
||||
},
|
||||
|
||||
hide: function () {
|
||||
if (this.$el.is(':visible') && this.$el.css('opacity') == "1") {
|
||||
if (this.$el.is(':visible') && this.$el.css('opacity') === "1") {
|
||||
this.$el.hide();
|
||||
converse.refreshWebkit();
|
||||
}
|
||||
@ -2088,12 +2096,12 @@
|
||||
},
|
||||
|
||||
show: function (callback) {
|
||||
if (this.$el.is(':visible') && this.$el.css('opacity') == "1") {
|
||||
if (this.$el.is(':visible') && this.$el.css('opacity') === "1") {
|
||||
return this.focus();
|
||||
}
|
||||
this.initDragResize();
|
||||
this.$el.fadeIn(function () {
|
||||
if (typeof callback == "function") {
|
||||
if (typeof callback === "function") {
|
||||
callback.apply(this, arguments);
|
||||
}
|
||||
if (converse.connection.connected) {
|
||||
@ -2288,7 +2296,6 @@
|
||||
* all its public rooms.
|
||||
*/
|
||||
var name, jid, i, fragment,
|
||||
that = this,
|
||||
$available_chatrooms = this.$el.find('#available-chatrooms');
|
||||
this.rooms = $(iq).find('query').find('item');
|
||||
if (this.rooms.length) {
|
||||
@ -2330,7 +2337,7 @@
|
||||
);
|
||||
},
|
||||
|
||||
showRooms: function (ev) {
|
||||
showRooms: function () {
|
||||
var $available_chatrooms = this.$el.find('#available-chatrooms');
|
||||
var $server = this.$el.find('input.new-chatroom-server');
|
||||
var server = $server.val();
|
||||
@ -2552,7 +2559,6 @@
|
||||
},
|
||||
|
||||
renderContactsPanel: function () {
|
||||
var model;
|
||||
this.$el.html(converse.templates.controlbox(this.model.toJSON()));
|
||||
this.contactspanel = new converse.ContactsPanel({'$parent': this.$el.find('.controlbox-panes')});
|
||||
this.contactspanel.render();
|
||||
@ -2621,7 +2627,7 @@
|
||||
},
|
||||
|
||||
featureAdded: function (feature) {
|
||||
if ((feature.get('var') == Strophe.NS.MUC) && (converse.allow_muc)) {
|
||||
if ((feature.get('var') === Strophe.NS.MUC) && (converse.allow_muc)) {
|
||||
this.roomspanel.model.save({muc_domain: feature.get('from')});
|
||||
var $server= this.$el.find('input.new-chatroom-server');
|
||||
if (! $server.is(':focus')) {
|
||||
@ -2830,10 +2836,9 @@
|
||||
this.maximize();
|
||||
}
|
||||
}, this);
|
||||
this.model.on('destroy', function (model, response, options) {
|
||||
this.model.on('destroy', function () {
|
||||
this.hide().leave();
|
||||
},
|
||||
this);
|
||||
}, this);
|
||||
|
||||
this.occupantsview = new converse.ChatRoomOccupantsView({
|
||||
model: new converse.ChatRoomOccupants({nick: this.model.get('nick')})
|
||||
@ -3182,7 +3187,7 @@
|
||||
instructions = $stanza.find('instructions').text();
|
||||
$form.find('span.spinner').remove();
|
||||
$form.append($('<legend>').text(title));
|
||||
if (instructions && instructions != title) {
|
||||
if (instructions && instructions !== title) {
|
||||
$form.append($('<p class="instructions">').text(instructions));
|
||||
}
|
||||
_.each($fields, function (field) {
|
||||
@ -3422,7 +3427,7 @@
|
||||
showErrorMessage: function ($error) {
|
||||
// We didn't enter the room, so we must remove it from the MUC
|
||||
// add-on
|
||||
if ($error.attr('type') == 'auth') {
|
||||
if ($error.attr('type') === 'auth') {
|
||||
if ($error.find('not-authorized').length) {
|
||||
this.renderPasswordForm();
|
||||
} else if ($error.find('registration-required').length) {
|
||||
@ -3430,11 +3435,11 @@
|
||||
} else if ($error.find('forbidden').length) {
|
||||
this.showDisconnectMessage(__('You have been banned from this room'));
|
||||
}
|
||||
} else if ($error.attr('type') == 'modify') {
|
||||
} else if ($error.attr('type') === 'modify') {
|
||||
if ($error.find('jid-malformed').length) {
|
||||
this.showDisconnectMessage(__('No nickname was specified'));
|
||||
}
|
||||
} else if ($error.attr('type') == 'cancel') {
|
||||
} else if ($error.attr('type') === 'cancel') {
|
||||
if ($error.find('not-allowed').length) {
|
||||
this.showDisconnectMessage(__('You are not allowed to create new rooms'));
|
||||
} else if ($error.find('not-acceptable').length) {
|
||||
@ -3459,7 +3464,7 @@
|
||||
this.showErrorMessage($presence.find('error'));
|
||||
} else {
|
||||
is_self = ($presence.find("status[code='110']").length) ||
|
||||
($presence.attr('from') == this.model.get('id')+'/'+Strophe.escapeNode(nick));
|
||||
($presence.attr('from') === this.model.get('id')+'/'+Strophe.escapeNode(nick));
|
||||
if (this.model.get('connection_status') !== Strophe.Status.CONNECTED) {
|
||||
this.model.set('connection_status', Strophe.Status.CONNECTED);
|
||||
}
|
||||
@ -3611,7 +3616,7 @@
|
||||
*/
|
||||
var $message = $(message),
|
||||
contact_jid, $forwarded, $delay, from_bare_jid, from_resource, is_me, msgid,
|
||||
chatbox, resource, roster_item,
|
||||
chatbox, resource,
|
||||
from_jid = $message.attr('from'),
|
||||
to_jid = $message.attr('to'),
|
||||
to_resource = Strophe.getResourceFromJid(to_jid),
|
||||
@ -3635,7 +3640,7 @@
|
||||
}
|
||||
from_bare_jid = Strophe.getBareJidFromJid(from_jid);
|
||||
from_resource = Strophe.getResourceFromJid(from_jid);
|
||||
is_me = from_bare_jid == converse.bare_jid;
|
||||
is_me = from_bare_jid === converse.bare_jid;
|
||||
msgid = $message.attr('id');
|
||||
|
||||
if (is_me) {
|
||||
@ -4291,7 +4296,6 @@
|
||||
|
||||
subscribeToSuggestedItems: function (msg) {
|
||||
$(msg).find('item').each(function (i, items) {
|
||||
var $this = $(this);
|
||||
if (this.getAttribute('action') === 'add') {
|
||||
converse.roster.addAndSubscribe(
|
||||
this.getAttribute('jid'), null, converse.xmppstatus.get('fullname'));
|
||||
@ -4380,7 +4384,7 @@
|
||||
if (item) {
|
||||
resources = item.get('resources');
|
||||
if (resources) {
|
||||
if (_.indexOf(resources, resource) == -1) {
|
||||
if (_.indexOf(resources, resource) === -1) {
|
||||
resources.push(resource);
|
||||
item.set({'resources': resources});
|
||||
}
|
||||
@ -4539,16 +4543,16 @@
|
||||
converse.rejectPresenceSubscription(jid, __("This client does not allow presence subscriptions"));
|
||||
}
|
||||
if (converse.auto_subscribe) {
|
||||
if ((!contact) || (contact.get('subscription') != 'to')) {
|
||||
if ((!contact) || (contact.get('subscription') !== 'to')) {
|
||||
this.subscribeBack(bare_jid);
|
||||
} else {
|
||||
contact.authorize();
|
||||
}
|
||||
} else {
|
||||
if (contact) {
|
||||
if (contact.get('subscription') != 'none') {
|
||||
if (contact.get('subscription') !== 'none') {
|
||||
contact.authorize();
|
||||
} else if (contact.get('ask') == "subscribe") {
|
||||
} else if (contact.get('ask') === "subscribe") {
|
||||
contact.authorize();
|
||||
}
|
||||
} else if (!contact) {
|
||||
@ -4583,7 +4587,7 @@
|
||||
} else if (($presence.find('x').attr('xmlns') || '').indexOf(Strophe.NS.MUC) === 0) {
|
||||
return; // Ignore MUC
|
||||
}
|
||||
if (contact && (status_message.text() != contact.get('status'))) {
|
||||
if (contact && (status_message.text() !== contact.get('status'))) {
|
||||
contact.save({'status': status_message.text()});
|
||||
}
|
||||
if (presence_type === 'subscribed' && contact) {
|
||||
@ -4675,7 +4679,7 @@
|
||||
view.$el.detach();
|
||||
if (index === 0) {
|
||||
this.$el.after(view.$el);
|
||||
} else if (index == (this.model.contacts.length-1)) {
|
||||
} else if (index === (this.model.contacts.length-1)) {
|
||||
this.$el.nextUntil('dt').last().after(view.$el);
|
||||
} else {
|
||||
this.$el.nextUntil('dt').eq(index).before(view.$el);
|
||||
@ -5026,16 +5030,16 @@
|
||||
onContactChange: function (contact) {
|
||||
this.updateChatBox(contact).update();
|
||||
if (_.has(contact.changed, 'subscription')) {
|
||||
if (contact.changed.subscription == 'from') {
|
||||
if (contact.changed.subscription === 'from') {
|
||||
this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
|
||||
} else if (_.contains(['both', 'to'], contact.get('subscription'))) {
|
||||
this.addExistingContact(contact);
|
||||
}
|
||||
}
|
||||
if (_.has(contact.changed, 'ask') && contact.changed.ask == 'subscribe') {
|
||||
if (_.has(contact.changed, 'ask') && contact.changed.ask === 'subscribe') {
|
||||
this.addContactToGroup(contact, HEADER_PENDING_CONTACTS);
|
||||
}
|
||||
if (_.has(contact.changed, 'subscription') && contact.changed.requesting == 'true') {
|
||||
if (_.has(contact.changed, 'subscription') && contact.changed.requesting === 'true') {
|
||||
this.addContactToGroup(contact, HEADER_REQUESTING_CONTACTS);
|
||||
}
|
||||
this.liveFilter();
|
||||
@ -5089,7 +5093,7 @@
|
||||
index = $groups.length ? this.model.indexOf(view.model) : 0;
|
||||
if (index === 0) {
|
||||
this.$roster.prepend(view.$el);
|
||||
} else if (index == (this.model.length-1)) {
|
||||
} else if (index === (this.model.length-1)) {
|
||||
this.appendGroup(view);
|
||||
} else {
|
||||
$($groups.eq(index)).before(view.$el);
|
||||
@ -5263,8 +5267,7 @@
|
||||
chat_status = this.model.get('status') || 'offline',
|
||||
options = $('option', $select),
|
||||
$options_target,
|
||||
options_list = [],
|
||||
that = this;
|
||||
options_list = [];
|
||||
this.$el.html(converse.templates.choose_status());
|
||||
this.$el.find('#fancy-xmpp-status-select')
|
||||
.html(converse.templates.chat_status({
|
||||
@ -5381,7 +5384,7 @@
|
||||
onFeatureAdded: function (feature) {
|
||||
var prefs = feature.get('preferences') || {};
|
||||
converse.emit('serviceDiscovered', feature);
|
||||
if (feature.get('var') == Strophe.NS.MAM && prefs['default'] !== converse.message_archiving) {
|
||||
if (feature.get('var') === Strophe.NS.MAM && prefs['default'] !== converse.message_archiving) {
|
||||
// Ask the server for archiving preferences
|
||||
converse.connection.sendIQ(
|
||||
$iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}),
|
||||
@ -5614,8 +5617,7 @@
|
||||
if (ev && ev.preventDefault) { ev.preventDefault(); }
|
||||
var $form = $(ev.target),
|
||||
$domain_input = $form.find('input[name=domain]'),
|
||||
domain = $domain_input.val(),
|
||||
errors = false;
|
||||
domain = $domain_input.val();
|
||||
if (!domain) {
|
||||
$domain_input.addClass('error');
|
||||
return;
|
||||
@ -5643,7 +5645,7 @@
|
||||
|
||||
onRegistering: function (status, error) {
|
||||
var that;
|
||||
console.log('onRegistering');
|
||||
converse.log('onRegistering');
|
||||
if (_.contains([
|
||||
Strophe.Status.DISCONNECTED,
|
||||
Strophe.Status.CONNFAIL,
|
||||
@ -5662,7 +5664,7 @@
|
||||
this.domain
|
||||
), 'error');
|
||||
}
|
||||
} else if (status == Strophe.Status.REGISTERED) {
|
||||
} else if (status === Strophe.Status.REGISTERED) {
|
||||
converse.log("Registered successfully.");
|
||||
converse.connection.reset();
|
||||
that = this;
|
||||
@ -5703,7 +5705,7 @@
|
||||
'title': this.title,
|
||||
'instructions': this.instructions
|
||||
}));
|
||||
if (this.form_type == 'xform') {
|
||||
if (this.form_type === 'xform') {
|
||||
$fields = $stanza.find('field');
|
||||
_.each($fields, function (field) {
|
||||
$form.append(utils.xForm2webForm.bind(this, $(field), $stanza));
|
||||
@ -5711,7 +5713,7 @@
|
||||
} else {
|
||||
// Show fields
|
||||
_.each(Object.keys(this.fields), function (key) {
|
||||
if (key == "username") {
|
||||
if (key === "username") {
|
||||
$input = templates.form_username({
|
||||
domain: ' @'+this.domain,
|
||||
name: key,
|
||||
@ -5803,7 +5805,7 @@
|
||||
var $inputs = $(ev.target).find(':input:not([type=button]):not([type=submit])'),
|
||||
iq = $iq({type: "set"}).c("query", {xmlns:Strophe.NS.REGISTER});
|
||||
|
||||
if (this.form_type == 'xform') {
|
||||
if (this.form_type === 'xform') {
|
||||
iq.c("x", {xmlns: Strophe.NS.XFORM, type: 'submit'});
|
||||
$inputs.each(function () {
|
||||
iq.cnode(utils.webForm2xForm(this)).up();
|
||||
@ -5865,7 +5867,7 @@
|
||||
this.fields[_var.toLowerCase()] = $(field).children('value').text();
|
||||
} else {
|
||||
// TODO: other option seems to be type="fixed"
|
||||
console.log("WARNING: Found field we couldn't parse");
|
||||
converse.log("WARNING: Found field we couldn't parse");
|
||||
}
|
||||
}.bind(this));
|
||||
this.form_type = 'xform';
|
||||
@ -5879,7 +5881,7 @@
|
||||
* Parameters:
|
||||
* (XMLElement) stanza - The IQ stanza.
|
||||
*/
|
||||
var i, field, error = null, that,
|
||||
var error = null,
|
||||
query = stanza.getElementsByTagName("query");
|
||||
if (query.length > 0) {
|
||||
query = query[0];
|
||||
@ -5959,7 +5961,6 @@
|
||||
jid = $jid_input.val(),
|
||||
$pw_input = $form.find('input[name=password]'),
|
||||
password = $pw_input.val(),
|
||||
$bsu_input = null,
|
||||
errors = false;
|
||||
|
||||
if (! jid) {
|
||||
@ -6071,8 +6072,8 @@
|
||||
|
||||
this.setUpXMLLogging = function () {
|
||||
if (this.debug) {
|
||||
this.connection.xmlInput = function (body) { console.log(body); };
|
||||
this.connection.xmlOutput = function (body) { console.log(body); };
|
||||
this.connection.xmlInput = function (body) { converse.log(body); };
|
||||
this.connection.xmlOutput = function (body) { converse.log(body); };
|
||||
}
|
||||
};
|
||||
|
||||
@ -6261,7 +6262,7 @@
|
||||
* models that are in the "overrides" namespace.
|
||||
*/
|
||||
var override = plugin.overrides[key];
|
||||
if (typeof override == "object") {
|
||||
if (typeof override === "object") {
|
||||
this._extendObject(converse[key], override);
|
||||
} else {
|
||||
this._overrideAttribute(key, plugin);
|
||||
@ -6332,7 +6333,7 @@
|
||||
if (!_.contains(_.keys(STATUS_WEIGHTS), value)) {
|
||||
throw new Error('Invalid availability value. See https://xmpp.org/rfcs/rfc3921.html#rfc.section.2.2.2.1');
|
||||
}
|
||||
if (typeof message == "string") {
|
||||
if (typeof message === "string") {
|
||||
data.status_message = message;
|
||||
}
|
||||
converse.xmppstatus.save(data);
|
||||
@ -6433,7 +6434,7 @@
|
||||
* get the next or previous page in the result set.
|
||||
*/
|
||||
var date, messages = [];
|
||||
if (typeof options == "function") {
|
||||
if (typeof options === "function") {
|
||||
callback = options;
|
||||
errback = callback;
|
||||
}
|
||||
@ -6442,14 +6443,14 @@
|
||||
}
|
||||
var queryid = converse.connection.getUniqueId();
|
||||
var attrs = {'type':'set'};
|
||||
if (typeof options != "undefined" && options.groupchat) {
|
||||
if (typeof options !== "undefined" && options.groupchat) {
|
||||
if (!options['with']) {
|
||||
throw new Error('You need to specify a "with" value containing the chat room JID, when querying groupchat messages.');
|
||||
}
|
||||
attrs.to = options['with'];
|
||||
}
|
||||
var stanza = $iq(attrs).c('query', {'xmlns':Strophe.NS.MAM, 'queryid':queryid});
|
||||
if (typeof options != "undefined") {
|
||||
if (typeof options !== "undefined") {
|
||||
stanza.c('x', {'xmlns':Strophe.NS.XFORM, 'type': 'submit'})
|
||||
.c('field', {'var':'FORM_TYPE', 'type': 'hidden'})
|
||||
.c('value').t(Strophe.NS.MAM).up().up();
|
||||
@ -6475,8 +6476,8 @@
|
||||
}
|
||||
}
|
||||
converse.connection.addHandler(function (message) {
|
||||
var $msg = $(message), $fin, rsm, i;
|
||||
if (typeof callback == "function") {
|
||||
var $msg = $(message), $fin, rsm;
|
||||
if (typeof callback === "function") {
|
||||
$fin = $msg.find('fin[xmlns="'+Strophe.NS.MAM+'"]');
|
||||
if ($fin.length) {
|
||||
rsm = new Strophe.RSM({xml: $fin.find('set')[0]});
|
||||
@ -6484,7 +6485,7 @@
|
||||
_.extend(rsm, _.pick(options, MAM_ATTRIBUTES));
|
||||
callback(messages, rsm);
|
||||
return false; // We've received all messages, decommission this handler
|
||||
} else if (queryid == $msg.find('result').attr('queryid')) {
|
||||
} else if (queryid === $msg.find('result').attr('queryid')) {
|
||||
messages.push(message);
|
||||
}
|
||||
return true;
|
||||
|
30
jshintrc
Normal file
30
jshintrc
Normal file
@ -0,0 +1,30 @@
|
||||
{
|
||||
"browser": true,
|
||||
"devel": true,
|
||||
"eqeqeq": true,
|
||||
"indent": 4,
|
||||
"jquery": false,
|
||||
"smarttabs": true,
|
||||
"trailing": true,
|
||||
"undef": true,
|
||||
"unused": "vars",
|
||||
"white": false,
|
||||
"predef": [
|
||||
"afterEach",
|
||||
"beforeEach",
|
||||
"converse_api",
|
||||
"define",
|
||||
"define",
|
||||
"describe",
|
||||
"expect",
|
||||
"global",
|
||||
"it",
|
||||
"jasmine",
|
||||
"module",
|
||||
"require",
|
||||
"runs",
|
||||
"spyOn",
|
||||
"xit",
|
||||
"waits"
|
||||
]
|
||||
}
|
2
main.js
2
main.js
@ -4,7 +4,7 @@ if (typeof(require) === 'undefined') {
|
||||
* We want to save the configuration in a variable so that we can reuse it in
|
||||
* tests/main.js.
|
||||
*/
|
||||
require = {
|
||||
require = { // jshint ignore:line
|
||||
config: function (c) {
|
||||
config = c;
|
||||
}
|
||||
|
4
package.json
Executable file → Normal file
4
package.json
Executable file → Normal file
@ -24,7 +24,7 @@
|
||||
"webchat"
|
||||
],
|
||||
"author": "JC Brand",
|
||||
"license": "MPL",
|
||||
"license": "MPL-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/jcbrand/converse.js/issues"
|
||||
},
|
||||
@ -36,7 +36,6 @@
|
||||
"grunt": "~0.4.4",
|
||||
"grunt-cli": "~0.1.13",
|
||||
"grunt-contrib-cssmin": "~0.9.0",
|
||||
"grunt-contrib-jshint": "~0.10.0",
|
||||
"grunt-contrib-jst": "~0.6.0",
|
||||
"grunt-contrib-requirejs": "~0.4.3",
|
||||
"grunt-json": "^0.1.3",
|
||||
@ -48,6 +47,7 @@
|
||||
"po2json": "^0.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"jshint": "^2.8.0",
|
||||
"requirejs": "~2.1.15"
|
||||
}
|
||||
}
|
||||
|
@ -1,13 +1,15 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
var $msg = converse_api.env.$msg;
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
var moment = converse_api.env.moment;
|
||||
@ -27,7 +29,7 @@
|
||||
});
|
||||
|
||||
it("is created when you click on a roster item", function () {
|
||||
var i, $el, click, jid, chatboxview;
|
||||
var i, $el, jid, chatboxview;
|
||||
// openControlBox was called earlier, so the controlbox is
|
||||
// visible, but no other chat boxes have been created.
|
||||
expect(this.chatboxes.length).toEqual(1);
|
||||
@ -50,7 +52,7 @@
|
||||
}.bind(converse));
|
||||
|
||||
it("can be trimmed to conserve space", function () {
|
||||
var i, $el, click, jid, key, chatbox, chatboxview;
|
||||
var i, $el, jid, chatbox, chatboxview, trimmedview;
|
||||
// openControlBox was called earlier, so the controlbox is
|
||||
// visible, but no other chat boxes have been created.
|
||||
var trimmed_chatboxes = converse.minimized_chats;
|
||||
@ -99,7 +101,7 @@
|
||||
|
||||
it("is focused if its already open and you click on its corresponding roster item", function () {
|
||||
var contact_jid = mock.cur_names[2].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
var i, $el, click, jid, chatboxview, chatbox;
|
||||
var $el, jid, chatboxview, chatbox;
|
||||
// openControlBox was called earlier, so the controlbox is
|
||||
// visible, but no other chat boxes have been created.
|
||||
expect(this.chatboxes.length).toEqual(1);
|
||||
@ -141,8 +143,9 @@
|
||||
expect(newchatboxes.length).toEqual(7);
|
||||
// Check that the chatboxes items retrieved from browserStorage
|
||||
// have the same attributes values as the original ones.
|
||||
attrs = ['id', 'box_id', 'visible'];
|
||||
for (i=0; i<attrs.length; i++) {
|
||||
var attrs = ['id', 'box_id', 'visible'];
|
||||
var new_attrs, old_attrs;
|
||||
for (var i=0; i<attrs.length; i++) {
|
||||
new_attrs = _.pluck(_.pluck(newchatboxes.models, 'attributes'), attrs[i]);
|
||||
old_attrs = _.pluck(_.pluck(this.chatboxes.models, 'attributes'), attrs[i]);
|
||||
expect(_.isEqual(new_attrs, old_attrs)).toEqual(true);
|
||||
@ -565,7 +568,7 @@
|
||||
expect(chatview.model.get('minimized')).toBeTruthy();
|
||||
var message = 'This message is sent to a minimized chatbox';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
msg = $msg({
|
||||
var msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
type: 'chat',
|
||||
@ -945,7 +948,7 @@
|
||||
spyOn(converse, 'emit');
|
||||
var sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
// <paused> state
|
||||
msg = $msg({
|
||||
var msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
type: 'chat',
|
||||
@ -954,7 +957,7 @@
|
||||
this.chatboxes.onMessage(msg);
|
||||
expect(converse.emit).toHaveBeenCalledWith('message', msg);
|
||||
var chatboxview = this.chatboxviews.get(sender_jid);
|
||||
$events = chatboxview.$el.find('.chat-event');
|
||||
var $events = chatboxview.$el.find('.chat-event');
|
||||
expect($events.length).toBe(1);
|
||||
expect($events.text()).toEqual(mock.cur_names[1].split(' ')[0] + ' has stopped typing');
|
||||
}.bind(converse));
|
||||
@ -1030,7 +1033,7 @@
|
||||
expect(view.$el.find('.chat-event').length).toBe(0);
|
||||
view.showStatusNotification(sender_jid+' '+'is typing');
|
||||
expect(view.$el.find('.chat-event').length).toBe(1);
|
||||
msg = $msg({
|
||||
var msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
type: 'chat',
|
||||
@ -1048,7 +1051,7 @@
|
||||
spyOn(converse, 'emit');
|
||||
var sender_jid = mock.cur_names[1].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
// <paused> state
|
||||
msg = $msg({
|
||||
var msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
type: 'chat',
|
||||
@ -1057,7 +1060,7 @@
|
||||
this.chatboxes.onMessage(msg);
|
||||
expect(converse.emit).toHaveBeenCalledWith('message', msg);
|
||||
var chatboxview = this.chatboxviews.get(sender_jid);
|
||||
$events = chatboxview.$el.find('.chat-event');
|
||||
var $events = chatboxview.$el.find('.chat-event');
|
||||
expect($events.length).toBe(1);
|
||||
expect($events.text()).toEqual(mock.cur_names[1].split(' ')[0] + ' has gone away');
|
||||
}.bind(converse));
|
||||
@ -1090,7 +1093,6 @@
|
||||
expect(converse.emit).toHaveBeenCalledWith('messageSend', message);
|
||||
|
||||
message = '/clear';
|
||||
var old_length = view.model.messages.length;
|
||||
spyOn(view, 'onMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'clearMessages').andCallThrough();
|
||||
spyOn(window, 'confirm').andCallFake(function () {
|
||||
@ -1118,7 +1120,7 @@
|
||||
spyOn(converse, 'incrementMsgCounter').andCallThrough();
|
||||
$(window).trigger('blur');
|
||||
var message = 'This message will increment the message counter';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost',
|
||||
msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
@ -1149,7 +1151,7 @@
|
||||
spyOn(converse, 'incrementMsgCounter').andCallThrough();
|
||||
$(window).trigger('focus');
|
||||
var message = 'This message will not increment the message counter';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
var sender_jid = mock.cur_names[0].replace(/ /g,'.').toLowerCase() + '@localhost',
|
||||
msg = $msg({
|
||||
from: sender_jid,
|
||||
to: this.connection.jid,
|
||||
|
@ -1,14 +1,16 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils",
|
||||
"utils"
|
||||
], function ($, mock, test_utils, utils) {
|
||||
return factory($, mock, test_utils, utils);
|
||||
], function ($, _, mock, test_utils, utils) {
|
||||
return factory($, _, mock, test_utils, utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils, utils) {
|
||||
} (this, function ($, _, mock, test_utils, utils) {
|
||||
var $pres = converse_api.env.$pres;
|
||||
var $msg = converse_api.env.$msg;
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
@ -42,8 +44,8 @@
|
||||
var view = this.chatboxviews.get('lounge@localhost'),
|
||||
$participants = view.$('.participant-list');
|
||||
spyOn(view, 'onChatRoomPresence').andCallThrough();
|
||||
var presence, room = {}, i, role;
|
||||
for (i=0; i<mock.chatroom_names.length; i++) {
|
||||
var presence, role;
|
||||
for (var i=0; i<mock.chatroom_names.length; i++) {
|
||||
name = mock.chatroom_names[i];
|
||||
role = mock.chatroom_roles[name].role;
|
||||
// See example 21 http://xmpp.org/extensions/xep-0045.html#enter-pres
|
||||
@ -117,13 +119,13 @@
|
||||
spyOn(window, 'prompt').andCallFake(function () {
|
||||
return null;
|
||||
});
|
||||
var roster = {}, $input;
|
||||
var $input;
|
||||
var view = this.chatboxviews.get('lounge@localhost');
|
||||
view.$el.find('.chat-area').remove();
|
||||
view.renderChatArea(); // Will init the widget
|
||||
test_utils.createContacts('current'); // We need roster contacts, so that we have someone to invite
|
||||
$input = view.$el.find('input.invited-contact.tt-input');
|
||||
$hint = view.$el.find('input.invited-contact.tt-hint');
|
||||
var $hint = view.$el.find('input.invited-contact.tt-hint');
|
||||
runs (function () {
|
||||
expect($input.length).toBe(1);
|
||||
expect($input.attr('placeholder')).toBe('Invite...');
|
||||
@ -198,7 +200,6 @@
|
||||
spyOn(converse, 'playNotification');
|
||||
var view = this.chatboxviews.get('lounge@localhost');
|
||||
if (!view.$el.find('.chat-area').length) { view.renderChatArea(); }
|
||||
var nick = mock.chatroom_names[0];
|
||||
var text = 'This message will play a sound because it mentions dummy';
|
||||
var message = $msg({
|
||||
from: 'lounge@localhost/otheruser',
|
||||
@ -237,7 +238,6 @@
|
||||
spyOn(converse, 'emit');
|
||||
var view = this.chatboxviews.get('lounge@localhost');
|
||||
if (!view.$el.find('.chat-area').length) { view.renderChatArea(); }
|
||||
var nick = mock.chatroom_names[0];
|
||||
var text = 'This is a sent message';
|
||||
view.$el.find('.chat-textarea').text(text);
|
||||
view.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
|
||||
@ -318,7 +318,7 @@
|
||||
|
||||
this.connection._dataRecv(test_utils.createRequest(presence));
|
||||
expect(view.onChatRoomPresence).toHaveBeenCalled();
|
||||
$participants = view.$('.participant-list');
|
||||
var $participants = view.$('.participant-list');
|
||||
expect($participants.children().length).toBe(1);
|
||||
expect($participants.children().first(0).text()).toBe("oldnick");
|
||||
expect($chat_content.find('div.chat-info').length).toBe(1);
|
||||
@ -421,8 +421,9 @@
|
||||
expect(newchatboxes.length).toEqual(2);
|
||||
// Check that the chatrooms retrieved from browserStorage
|
||||
// have the same attributes values as the original ones.
|
||||
attrs = ['id', 'box_id', 'visible'];
|
||||
for (i=0; i<attrs.length; i++) {
|
||||
var attrs = ['id', 'box_id', 'visible'];
|
||||
var new_attrs, old_attrs;
|
||||
for (var i=0; i<attrs.length; i++) {
|
||||
new_attrs = _.pluck(_.pluck(newchatboxes.models, 'attributes'), attrs[i]);
|
||||
old_attrs = _.pluck(_.pluck(this.chatboxes.models, 'attributes'), attrs[i]);
|
||||
// FIXME: should have have to sort here? Order must
|
||||
@ -453,7 +454,7 @@
|
||||
expect(view.$el.is(':visible')).toBeFalsy();
|
||||
expect(view.model.get('minimized')).toBeTruthy();
|
||||
expect(view.minimize).toHaveBeenCalled();
|
||||
trimmedview = trimmed_chatboxes.get(view.model.get('id'));
|
||||
var trimmedview = trimmed_chatboxes.get(view.model.get('id'));
|
||||
trimmedview.$("a.restore-chat").click();
|
||||
});
|
||||
waits(250);
|
||||
@ -469,7 +470,7 @@
|
||||
|
||||
it("can be closed again by clicking a DOM element with class 'close-chatbox-button'", function () {
|
||||
test_utils.openChatRoom('lounge', 'localhost', 'dummy');
|
||||
var view = this.chatboxviews.get('lounge@localhost'), chatroom = view.model, $el;
|
||||
var view = this.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'close').andCallThrough();
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(view, 'leave');
|
||||
@ -497,10 +498,7 @@
|
||||
|
||||
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');
|
||||
|
||||
var view = converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onChatRoomMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'clearChatRoomMessages');
|
||||
view.$el.find('.chat-textarea').text('/clear');
|
||||
@ -512,10 +510,7 @@
|
||||
|
||||
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');
|
||||
|
||||
var view = converse.chatboxviews.get('lounge@localhost');
|
||||
spyOn(view, 'onChatRoomMessageSubmitted').andCallThrough();
|
||||
spyOn(view, 'setAffiliation').andCallThrough();
|
||||
spyOn(view, 'showStatusNotification').andCallThrough();
|
||||
|
@ -1,13 +1,15 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
var $pres = converse_api.env.$pres;
|
||||
var $iq = converse_api.env.$iq;
|
||||
|
||||
@ -138,7 +140,7 @@
|
||||
var names = mock.cur_names;
|
||||
expect($filter.length).toBe(1);
|
||||
expect($filter.is(':visible')).toBeFalsy();
|
||||
for (i=0; i<names.length; i++) {
|
||||
for (var i=0; i<names.length; i++) {
|
||||
converse.roster.create({
|
||||
ask: null,
|
||||
fullname: names[i],
|
||||
@ -255,7 +257,6 @@
|
||||
_clearContacts();
|
||||
utils.createGroupedContacts();
|
||||
var $filter = converse.rosterview.$('.roster-filter');
|
||||
var $roster = converse.rosterview.$roster;
|
||||
runs (function () {
|
||||
$filter.val("xxx");
|
||||
$filter.trigger('keydown');
|
||||
@ -316,7 +317,7 @@
|
||||
var groups = ['colleagues', 'friends'];
|
||||
runs($.proxy(function () {
|
||||
_clearContacts();
|
||||
var i=0, j=0;
|
||||
var i=0;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
converse.rosterview.render();
|
||||
@ -484,7 +485,7 @@
|
||||
}, this));
|
||||
waits(50);
|
||||
runs($.proxy(function () {
|
||||
contact = this.roster.create({
|
||||
this.roster.create({
|
||||
jid: name.replace(/ /g,'.').toLowerCase() + '@localhost',
|
||||
subscription: 'none',
|
||||
ask: 'subscribe',
|
||||
@ -508,7 +509,7 @@
|
||||
_addContacts();
|
||||
var name;
|
||||
spyOn(window, 'confirm').andReturn(true);
|
||||
for (i=0; i<mock.pend_names.length; i++) {
|
||||
for (var i=0; i<mock.pend_names.length; i++) {
|
||||
name = mock.pend_names[i];
|
||||
converse.rosterview.$el.find(".pending-contact-name:contains('"+name+"')")
|
||||
.siblings('.remove-xmpp-contact').click();
|
||||
@ -661,7 +662,7 @@
|
||||
var jid, t;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
for (var i=0; i<mock.cur_names.length; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'online');
|
||||
expect(this.rosterview.update).toHaveBeenCalled();
|
||||
@ -681,7 +682,7 @@
|
||||
var jid, t;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
for (var i=0; i<mock.cur_names.length; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'dnd');
|
||||
expect(this.rosterview.update).toHaveBeenCalled();
|
||||
@ -701,7 +702,7 @@
|
||||
var jid, t;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
for (var i=0; i<mock.cur_names.length; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'away');
|
||||
expect(this.rosterview.update).toHaveBeenCalled();
|
||||
@ -721,7 +722,7 @@
|
||||
var jid, t;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
for (var i=0; i<mock.cur_names.length; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'xa');
|
||||
expect(this.rosterview.update).toHaveBeenCalled();
|
||||
@ -741,7 +742,7 @@
|
||||
var jid, t;
|
||||
spyOn(converse, 'emit');
|
||||
spyOn(this.rosterview, 'update').andCallThrough();
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
for (var i=0; i<mock.cur_names.length; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'unavailable');
|
||||
expect(this.rosterview.update).toHaveBeenCalled();
|
||||
@ -758,7 +759,7 @@
|
||||
});
|
||||
waits(50);
|
||||
runs($.proxy(function () {
|
||||
var i;
|
||||
var i, jid;
|
||||
for (i=0; i<3; i++) {
|
||||
jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.roster.get(jid).set('chat_status', 'online');
|
||||
@ -1010,7 +1011,7 @@
|
||||
it("are saved to, and can be retrieved from, browserStorage", $.proxy(function () {
|
||||
var new_attrs, old_attrs, attrs;
|
||||
var num_contacts = this.roster.length;
|
||||
new_roster = new this.RosterContacts();
|
||||
var new_roster = new this.RosterContacts();
|
||||
// Roster items are yet to be fetched from browserStorage
|
||||
expect(new_roster.length).toEqual(0);
|
||||
new_roster.browserStorage = this.roster.browserStorage;
|
||||
@ -1019,7 +1020,7 @@
|
||||
// Check that the roster items retrieved from browserStorage
|
||||
// have the same attributes values as the original ones.
|
||||
attrs = ['jid', 'fullname', 'subscription', 'ask'];
|
||||
for (i=0; i<attrs.length; i++) {
|
||||
for (var i=0; i<attrs.length; i++) {
|
||||
new_attrs = _.pluck(_.pluck(new_roster.models, 'attributes'), attrs[i]);
|
||||
old_attrs = _.pluck(_.pluck(this.roster.models, 'attributes'), attrs[i]);
|
||||
// Roster items in storage are not necessarily sorted,
|
||||
@ -1030,7 +1031,7 @@
|
||||
}, converse));
|
||||
|
||||
it("will show fullname and jid properties on tooltip", $.proxy(function () {
|
||||
var jid, name, i, t;
|
||||
var jid, name, i;
|
||||
for (i=0; i<mock.cur_names.length; i++) {
|
||||
name = mock.cur_names[i];
|
||||
jid = name.replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
|
@ -1,13 +1,15 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
var b64_sha1 = converse_api.env.b64_sha1;
|
||||
|
||||
return describe("Converse", $.proxy(function(mock, test_utils) {
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
|
@ -1,17 +1,18 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
"use strict";
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
var $iq = converse_api.env.$iq;
|
||||
var $pres = converse_api.env.$pres;
|
||||
var $msg = converse_api.env.$msg;
|
||||
var moment = converse_api.env.moment;
|
||||
// See: https://xmpp.org/rfcs/rfc3921.html
|
||||
|
@ -1,13 +1,15 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
var $msg = converse_api.env.$msg;
|
||||
|
||||
return describe("The Minimized Chats Widget", $.proxy(function(mock, test_utils) {
|
||||
@ -67,7 +69,6 @@
|
||||
|
||||
it("shows the number messages received to minimized chats", $.proxy(function () {
|
||||
var i, contact_jid, chatview, msg;
|
||||
var sender_jid = mock.cur_names[4].replace(/ /g,'.').toLowerCase() + '@localhost';
|
||||
this.minimized_chats.toggleview.model.set({'collapsed': true});
|
||||
expect(this.minimized_chats.toggleview.$('.unread-message-count').is(':visible')).toBeFalsy();
|
||||
for (i=0; i<3; i++) {
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
|
@ -1,13 +1,15 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
"underscore",
|
||||
"mock",
|
||||
"test_utils"
|
||||
], function ($, mock, test_utils) {
|
||||
return factory($, mock, test_utils);
|
||||
], function ($, _, mock, test_utils) {
|
||||
return factory($, _, mock, test_utils);
|
||||
}
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
} (this, function ($, _, mock, test_utils) {
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
var $iq = converse_api.env.$iq;
|
||||
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
@ -9,7 +10,6 @@
|
||||
);
|
||||
} (this, function ($, mock, test_utils) {
|
||||
"use strict";
|
||||
var Strophe = converse_api.env.Strophe;
|
||||
var $iq = converse_api.env.$iq;
|
||||
var $pres = converse_api.env.$pres;
|
||||
// See:
|
||||
@ -355,7 +355,7 @@
|
||||
/* The process by which a user subscribes to a contact, including
|
||||
* the interaction between roster items and subscription states.
|
||||
*/
|
||||
var contact, stanza, sent_stanza, sent_IQ, IQ_id;
|
||||
var contact, stanza, sent_stanza, sent_IQ;
|
||||
runs($.proxy(function () {
|
||||
// Add a new roster contact via roster push
|
||||
stanza = $iq({'type': 'set'}).c('query', {'xmlns': 'jabber:iq:roster'})
|
||||
@ -373,11 +373,9 @@
|
||||
expect(this.roster.get('contact@example.org') instanceof this.RosterContact).toBeTruthy();
|
||||
spyOn(contact, "ackUnsubscribe").andCallThrough();
|
||||
|
||||
var send = this.connection.send;
|
||||
spyOn(converse.connection, 'send').andCallFake(function (stanza) {
|
||||
sent_stanza = stanza;
|
||||
});
|
||||
var sendIQ = this.connection.sendIQ;
|
||||
spyOn(this.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
|
||||
sent_IQ = iq;
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
@ -14,7 +15,7 @@
|
||||
describe("The Registration Panel", $.proxy(function (mock, test_utils) {
|
||||
beforeEach(function () {
|
||||
test_utils.closeControlBox();
|
||||
connection = mock.mock_connection;
|
||||
var connection = mock.mock_connection;
|
||||
connection.connected = false;
|
||||
converse._tearDown();
|
||||
converse.initialize({
|
||||
|
@ -1,3 +1,4 @@
|
||||
/*global converse */
|
||||
(function (root, factory) {
|
||||
define([
|
||||
"jquery",
|
||||
|
@ -1,5 +1,6 @@
|
||||
define("converse-dependencies", [
|
||||
"jquery",
|
||||
"underscore",
|
||||
"polyfill",
|
||||
"utils",
|
||||
"otr",
|
||||
@ -13,7 +14,7 @@ define("converse-dependencies", [
|
||||
"backbone.overview",
|
||||
"jquery.browser",
|
||||
"typeahead"
|
||||
], function($, dummy, utils, otr, moment, Strophe) {
|
||||
], function($, _, dummy, utils, otr, moment, Strophe) {
|
||||
return _.extend({
|
||||
'underscore': _,
|
||||
'jQuery': $,
|
||||
|
@ -1,5 +1,6 @@
|
||||
define("converse-dependencies", [
|
||||
"jquery",
|
||||
"underscore",
|
||||
"utils",
|
||||
"polyfill",
|
||||
"moment_with_locales",
|
||||
@ -12,7 +13,7 @@ define("converse-dependencies", [
|
||||
"backbone.overview",
|
||||
"jquery.browser",
|
||||
"typeahead"
|
||||
], function($, dummy, utils, moment, Strophe) {
|
||||
], function($, _, dummy, utils, moment, Strophe) {
|
||||
return _.extend({
|
||||
'underscore': _,
|
||||
'jQuery': $,
|
||||
|
1
src/jquery-external.js
vendored
1
src/jquery-external.js
vendored
@ -1,3 +1,4 @@
|
||||
/*global jQuery */
|
||||
define('jquery', [], function () {
|
||||
return jQuery;
|
||||
});
|
||||
|
@ -1,7 +1,5 @@
|
||||
/*global $ */
|
||||
(function (root, factory) {
|
||||
if (typeof console === "undefined" || typeof console.log === "undefined") {
|
||||
console = { log: function () {}, error: function () {} };
|
||||
}
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define("converse", ["jquery"], function($) {
|
||||
return factory($);
|
||||
|
17
src/utils.js
17
src/utils.js
@ -1,10 +1,11 @@
|
||||
/*global jQuery, templates, escape, Jed, _ */
|
||||
(function (root, factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
define(["jquery", "converse-templates", "locales"], factory);
|
||||
define(["jquery", "underscore", "converse-templates", "locales"], factory);
|
||||
} else {
|
||||
root.utils = factory(jQuery, templates);
|
||||
root.utils = factory(jQuery, _, templates);
|
||||
}
|
||||
}(this, function ($, templates, locales) {
|
||||
}(this, function ($, _, templates, locales) {
|
||||
"use strict";
|
||||
|
||||
var XFORM_TYPE_MAP = {
|
||||
@ -156,7 +157,7 @@
|
||||
// FIXME: take <required> into consideration
|
||||
var options = [], j, $options, $values, value, values;
|
||||
|
||||
if ($field.attr('type') == 'list-single' || $field.attr('type') == 'list-multi') {
|
||||
if ($field.attr('type') === 'list-single' || $field.attr('type') === 'list-multi') {
|
||||
values = [];
|
||||
$values = $field.children('value');
|
||||
for (j=0; j<$values.length; j++) {
|
||||
@ -176,19 +177,19 @@
|
||||
name: $field.attr('var'),
|
||||
label: $field.attr('label'),
|
||||
options: options.join(''),
|
||||
multiple: ($field.attr('type') == 'list-multi'),
|
||||
multiple: ($field.attr('type') === 'list-multi'),
|
||||
required: $field.find('required').length
|
||||
});
|
||||
} else if ($field.attr('type') == 'fixed') {
|
||||
} else if ($field.attr('type') === 'fixed') {
|
||||
return $('<p class="form-help">').text($field.find('value').text());
|
||||
} else if ($field.attr('type') == 'jid-multi') {
|
||||
} else if ($field.attr('type') === 'jid-multi') {
|
||||
return templates.form_textarea({
|
||||
name: $field.attr('var'),
|
||||
label: $field.attr('label') || '',
|
||||
value: $field.find('value').text(),
|
||||
required: $field.find('required').length
|
||||
});
|
||||
} else if ($field.attr('type') == 'boolean') {
|
||||
} else if ($field.attr('type') === 'boolean') {
|
||||
return templates.form_checkbox({
|
||||
name: $field.attr('var'),
|
||||
type: XFORM_TYPE_MAP[$field.attr('type')],
|
||||
|
Loading…
Reference in New Issue
Block a user