Commit 1125940e authored by JC Brand's avatar JC Brand

Rename the closured converse object to _converse

to indicate that it's private and to differentiate it from the outer "global"
converse object.
parent 176c7243
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -4,19 +4,19 @@
"converse-api",
"mock",
"test_utils"], factory);
} (this, function ($, converse_api, mock, test_utils) {
} (this, function ($, converse, mock, test_utils) {
"use strict";
var Strophe = converse_api.env.Strophe;
var Strophe = converse.env.Strophe;
describe("Service Discovery", function () {
describe("Whenever converse.js discovers a new server feature", function () {
describe("Whenever _converse.js discovers a new server feature", function () {
it("emits the serviceDiscovered event", mock.initConverse(function (converse) {
spyOn(converse, 'emit');
converse.features.create({'var': Strophe.NS.MAM});
expect(converse.emit).toHaveBeenCalled();
expect(converse.emit.argsForCall[0][1].get('var')).toBe(Strophe.NS.MAM);
it("emits the serviceDiscovered event", mock.initConverse(function (_converse) {
spyOn(_converse, 'emit');
_converse.features.create({'var': Strophe.NS.MAM});
expect(_converse.emit).toHaveBeenCalled();
expect(_converse.emit.argsForCall[0][1].get('var')).toBe(Strophe.NS.MAM);
}));
});
});
......
(function (root, factory) {
define(["mock", "converse-api", "test_utils"], factory);
} (this, function (mock, converse_api, test_utils) {
} (this, function (mock, converse, test_utils) {
return describe("The Converse Event Emitter", function() {
return describe("The _converse Event Emitter", function() {
it("allows you to subscribe to emitted events", mock.initConverse(function (converse) {
it("allows you to subscribe to emitted events", mock.initConverse(function (_converse) {
this.callback = function () {};
spyOn(this, 'callback');
converse.on('connected', this.callback);
converse.emit('connected');
_converse.on('connected', this.callback);
_converse.emit('connected');
expect(this.callback).toHaveBeenCalled();
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 2);
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 3);
}));
it("allows you to listen once for an emitted event", mock.initConverse(function (converse) {
it("allows you to listen once for an emitted event", mock.initConverse(function (_converse) {
this.callback = function () {};
spyOn(this, 'callback');
converse.once('connected', this.callback);
converse.emit('connected');
_converse.once('connected', this.callback);
_converse.emit('connected');
expect(this.callback).toHaveBeenCalled();
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 1);
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 1);
}));
it("allows you to stop listening or subscribing to an event", mock.initConverse(function (converse) {
it("allows you to stop listening or subscribing to an event", mock.initConverse(function (_converse) {
this.callback = function () {};
this.anotherCallback = function () {};
this.neverCalled = function () {};
......@@ -36,23 +36,23 @@
spyOn(this, 'callback');
spyOn(this, 'anotherCallback');
spyOn(this, 'neverCalled');
converse.on('connected', this.callback);
converse.on('connected', this.anotherCallback);
_converse.on('connected', this.callback);
_converse.on('connected', this.anotherCallback);
converse.emit('connected');
_converse.emit('connected');
expect(this.callback).toHaveBeenCalled();
expect(this.anotherCallback).toHaveBeenCalled();
converse.off('connected', this.callback);
_converse.off('connected', this.callback);
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 1);
expect(this.anotherCallback.callCount, 2);
converse.once('connected', this.neverCalled);
converse.off('connected', this.neverCalled);
_converse.once('connected', this.neverCalled);
_converse.off('connected', this.neverCalled);
converse.emit('connected');
_converse.emit('connected');
expect(this.callback.callCount, 1);
expect(this.anotherCallback.callCount, 3);
expect(this.neverCalled).not.toHaveBeenCalled();
......
......@@ -6,14 +6,14 @@
"mock",
"test_utils"
], factory);
} (this, function ($, converse_api, utils, mock, test_utils) {
} (this, function ($, converse, utils, mock, test_utils) {
"use strict";
var $msg = converse_api.env.$msg,
_ = converse_api.env._;
var $msg = converse.env.$msg,
_ = converse.env._;
describe("A headlines box", function () {
it("will not open nor display non-headline messages", mock.initConverse(function (converse) {
it("will not open nor display non-headline messages", mock.initConverse(function (_converse) {
/* XMPP spam message:
*
* <message xmlns="jabber:client"
......@@ -25,7 +25,7 @@
* </message
*/
test_utils.openControlBox();
test_utils.openContactsPanel(converse);
test_utils.openContactsPanel(_converse);
sinon.spy(utils, 'isHeadlineMessage');
runs(function () {
var stanza = $msg({
......@@ -36,7 +36,7 @@
})
.c('nick', {'xmlns': "http://jabber.org/protocol/nick"}).t("-wwdmz").up()
.c('body').t('SORRY FOR THIS ADVERT');
converse.connection._dataRecv(test_utils.createRequest(stanza));
_converse.connection._dataRecv(test_utils.createRequest(stanza));
});
waits(250);
runs(function () {
......@@ -47,7 +47,7 @@
}));
it("will open and display headline messages", mock.initConverse(function (converse) {
it("will open and display headline messages", mock.initConverse(function (_converse) {
/*
* <message from='notify.example.com'
* to='romeo@im.example.com'
......@@ -63,7 +63,7 @@
* </message>
*/
test_utils.openControlBox();
test_utils.openContactsPanel(converse);
test_utils.openContactsPanel(_converse);
sinon.spy(utils, 'isHeadlineMessage');
runs(function () {
var stanza = $msg({
......@@ -76,13 +76,13 @@
.c('body').t('&lt;juliet@example.com&gt; You got mail.').up()
.c('x', {'xmlns': 'jabber:x:oob'})
.c('url').t('imap://romeo@example.com/INBOX;UIDVALIDITY=385759043/;UID=18');
converse.connection._dataRecv(test_utils.createRequest(stanza));
_converse.connection._dataRecv(test_utils.createRequest(stanza));
});
waits(250);
runs(function () {
expect(
_.contains(
converse.chatboxviews.keys(),
_converse.chatboxviews.keys(),
'notify.example.com')
).toBeTruthy();
expect(utils.isHeadlineMessage.called).toBeTruthy();
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
(function (root, factory) {
define(["mock", "converse-api", "test_utils"], factory);
} (this, function (mock, converse_api, test_utils) {
var $ = converse_api.env.jQuery;
var Strophe = converse_api.env.Strophe;
var b64_sha1 = converse_api.env.b64_sha1;
} (this, function (mock, converse, test_utils) {
var $ = converse.env.jQuery;
var Strophe = converse.env.Strophe;
var b64_sha1 = converse.env.b64_sha1;
return describe("The OTR module", function() {
it("can store a session passphrase in session storage", mock.initConverse(function (converse) {
it("can store a session passphrase in session storage", mock.initConverse(function (_converse) {
// With no prebind, the user's XMPP password is used and nothing is
// stored in session storage.
test_utils.openControlBox();
test_utils.openContactsPanel(converse);
test_utils.createContacts(converse, 'current');
test_utils.openContactsPanel(_converse);
test_utils.createContacts(_converse, 'current');
var auth = converse.authentication;
var pass = converse.connection.pass;
converse.authentication = "manual";
converse.connection.pass = 's3cr3t!';
expect(converse.otr.getSessionPassphrase()).toBe(converse.connection.pass);
var auth = _converse.authentication;
var pass = _converse.connection.pass;
_converse.authentication = "manual";
_converse.connection.pass = 's3cr3t!';
expect(_converse.otr.getSessionPassphrase()).toBe(_converse.connection.pass);
// With prebind, a random passphrase is generated and stored in
// session storage.
converse.authentication = "prebind";
var pp = converse.otr.getSessionPassphrase();
expect(pp).not.toBe(converse.connection.pass);
expect(pp).toBe(window.sessionStorage[b64_sha1(converse.connection.jid)]);
_converse.authentication = "prebind";
var pp = _converse.otr.getSessionPassphrase();
expect(pp).not.toBe(_converse.connection.pass);
expect(pp).toBe(window.sessionStorage[b64_sha1(_converse.connection.jid)]);
// Clean up
converse.authentication = auth;
converse.connection.pass = pass;
_converse.authentication = auth;
_converse.connection.pass = pass;
}));
it("will add processing hints to sent out encrypted <message> stanzas", mock.initConverse(function (converse) {
it("will add processing hints to sent out encrypted <message> stanzas", mock.initConverse(function (_converse) {
test_utils.openControlBox();
test_utils.openContactsPanel(converse);
test_utils.createContacts(converse, 'current');
test_utils.openContactsPanel(_converse);
test_utils.createContacts(_converse, 'current');
var UNVERIFIED = 1, UNENCRYPTED = 0;
var contact_name = mock.cur_names[0];
var contact_jid = contact_name.replace(/ /g,'.').toLowerCase() + '@localhost';
test_utils.openChatBoxFor(converse, contact_jid);
var chatview = converse.chatboxviews.get(contact_jid);
test_utils.openChatBoxFor(_converse, contact_jid);
var chatview = _converse.chatboxviews.get(contact_jid);
chatview.model.set('otr_status', UNVERIFIED);
var stanza = chatview.createMessageStanza(new converse.Message({ message: 'hello world'}));
var stanza = chatview.createMessageStanza(new _converse.Message({ message: 'hello world'}));
var $hints = $(stanza.nodeTree).find('[xmlns="'+Strophe.NS.HINTS+'"]');
expect($hints.length).toBe(3);
expect($hints.get(0).tagName).toBe('no-store');
......@@ -54,19 +54,19 @@
describe("An OTR Chat Message", function () {
it("will not be carbon copied when it's sent out", mock.initConverse(function (converse) {
it("will not be carbon copied when it's sent out", mock.initConverse(function (_converse) {
test_utils.openControlBox();
test_utils.openContactsPanel(converse);
test_utils.createContacts(converse, 'current');
test_utils.openContactsPanel(_converse);
test_utils.createContacts(_converse, 'current');
var msgtext = "?OTR,1,3,?OTR:AAIDAAAAAAEAAAABAAAAwCQ8HKsag0y0DGKsneo0kzKu1ua5L93M4UKTkCf1I2kbm2RgS5kIxDTxrTj3wVRB+H5Si86E1fKtuBgsDf/bKkGTM0h/49vh5lOD9HkE8cnSrFEn5GN,";
var sender_jid = mock.cur_names[3].replace(/ /g,'.').toLowerCase() + '@localhost';
converse.api.chats.open(sender_jid);
var chatbox = converse.chatboxes.get(sender_jid);
spyOn(converse.connection, 'send');
_converse.api.chats.open(sender_jid);
var chatbox = _converse.chatboxes.get(sender_jid);
spyOn(_converse.connection, 'send');
chatbox.set('otr_status', 1); // Set OTR status to UNVERIFIED, to mock an encrypted session
chatbox.trigger('sendMessage', new converse.Message({ message: msgtext }));
var $sent = $(converse.connection.send.argsForCall[0][0].tree());
chatbox.trigger('sendMessage', new _converse.Message({ message: msgtext }));
var $sent = $(_converse.connection.send.argsForCall[0][0].tree());
expect($sent.find('body').siblings('private').length).toBe(1);
expect($sent.find('private').length).toBe(1);
expect($sent.find('private').attr('xmlns')).toBe('urn:xmpp:carbons:2');
......
......@@ -6,33 +6,33 @@
describe("XMPP Ping", function () {
describe("Ping and pong handlers", function () {
it("are registered when converse.js is connected", mock.initConverse(function (converse) {
spyOn(converse, 'registerPingHandler').andCallThrough();
spyOn(converse, 'registerPongHandler').andCallThrough();
converse.emit('connected');
expect(converse.registerPingHandler).toHaveBeenCalled();
expect(converse.registerPongHandler).toHaveBeenCalled();
it("are registered when _converse.js is connected", mock.initConverse(function (_converse) {
spyOn(_converse, 'registerPingHandler').andCallThrough();
spyOn(_converse, 'registerPongHandler').andCallThrough();
_converse.emit('connected');
expect(_converse.registerPingHandler).toHaveBeenCalled();
expect(_converse.registerPongHandler).toHaveBeenCalled();
}));
it("are registered when converse.js reconnected", mock.initConverse(function (converse) {
spyOn(converse, 'registerPingHandler').andCallThrough();
spyOn(converse, 'registerPongHandler').andCallThrough();
converse.emit('reconnected');
expect(converse.registerPingHandler).toHaveBeenCalled();
expect(converse.registerPongHandler).toHaveBeenCalled();
it("are registered when _converse.js reconnected", mock.initConverse(function (_converse) {
spyOn(_converse, 'registerPingHandler').andCallThrough();
spyOn(_converse, 'registerPongHandler').andCallThrough();
_converse.emit('reconnected');
expect(_converse.registerPingHandler).toHaveBeenCalled();
expect(_converse.registerPongHandler).toHaveBeenCalled();
}));
});
describe("An IQ stanza", function () {
it("is sent out when converse.js pings a server", mock.initConverse(function (converse) {
it("is sent out when _converse.js pings a server", mock.initConverse(function (_converse) {
var sent_stanza, IQ_id;
var sendIQ = converse.connection.sendIQ;
spyOn(converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
var sendIQ = _converse.connection.sendIQ;
spyOn(_converse.connection, 'sendIQ').andCallFake(function (iq, callback, errback) {
sent_stanza = iq;
IQ_id = sendIQ.bind(this)(iq, callback, errback);
});
converse.ping();
_converse.ping();
expect(sent_stanza.toLocaleString()).toBe(
"<iq type='get' to='localhost' id='"+IQ_id+"' xmlns='jabber:client'>"+
"<ping xmlns='urn:xmpp:ping'/>"+
......
(function (root, factory) {
define(["mock", "converse-api", "test_utils"], factory);
} (this, function (mock, converse_api, test_utils) {
var _ = converse_api.env._;
var $iq = converse_api.env.$iq;
} (this, function (mock, converse, test_utils) {
var _ = converse.env._;
var $iq = converse.env.$iq;
describe("Profiling", function() {
afterEach(function () {
converse_api.user.logout();
converse.user.logout();
test_utils.clearBrowserStorage();
});
xit("adds hundreds of contacts to the roster", mock.initConverse(function(converse) {
converse.roster_groups = false;
xit("adds hundreds of contacts to the roster", mock.initConverse(function(_converse) {
_converse.roster_groups = false;
expect(this.roster.pluck('jid').length).toBe(0);
var stanza = $iq({
to: this.connection.jid,
......@@ -33,9 +33,9 @@
// expect(this.roster.pluck('jid').length).toBe(400);
}));
xit("adds hundreds of contacts to the roster, with roster groups", mock.initConverse(function(converse) {
// converse.show_only_online_users = true;
converse.roster_groups = true;
xit("adds hundreds of contacts to the roster, with roster groups", mock.initConverse(function(_converse) {
// _converse.show_only_online_users = true;
_converse.roster_groups = true;
expect(this.roster.pluck('jid').length).toBe(0);
var stanza = $iq({
to: this.connection.jid,
......
This diff is collapsed.
This diff is collapsed.
/*global converse */
/*global _converse */
(function (root, factory) {
define([
"jquery",
"underscore",
"mock",
"converse_api",
"test_utils",
"utils",
"transcripts"
], factory
);
} (this, function ($, _, mock, test_utils, utils, transcripts) {
var Strophe = converse_api.env.Strophe;
} (this, function ($, _, mock, converse, test_utils, utils, transcripts) {
var Strophe = converse.env.Strophe;
var IGNORED_TAGS = [
'stream:features',
'auth',
......@@ -54,7 +55,7 @@
});
it("can be used to replay conversations", function () {
spyOn(converse, 'areDesktopNotificationsEnabled').andReturn(true);
spyOn(_converse, 'areDesktopNotificationsEnabled').andReturn(true);
_.each(transcripts, function (transcript) {
var text = transcript();
var xml = Strophe.xmlHtmlNode(text);
......@@ -67,7 +68,7 @@
return;
}
var _stanza = traverseElement(el);
converse.connection._dataRecv(test_utils.createRequest(_stanza));
_converse.connection._dataRecv(test_utils.createRequest(_stanza));
});
});
});
......
(function (root, factory) {
define(["converse-api"], factory);
} (this, function (converse_api) {
var utils = converse_api.env.utils,
_ = converse_api.env._;
} (this, function (converse) {
var utils = converse.env.utils,
_ = converse.env._;
return describe("Converse.js Utilities", function() {
......
(function (root, factory) {
define(["mock", "converse-api", "test_utils"], factory);
} (this, function (mock, converse_api, test_utils) {
var $ = converse_api.env.jQuery;
} (this, function (mock, converse, test_utils) {
var $ = converse.env.jQuery;
return describe("The XMPPStatus model", function() {
it("won't send <show>online when setting a custom status message", mock.initConverse(function (converse) {
converse.xmppstatus.save({'status': 'online'});
spyOn(converse.xmppstatus, 'setStatusMessage').andCallThrough();
spyOn(converse.connection, 'send');
converse.xmppstatus.setStatusMessage("I'm also happy!");
it("won't send <show>online when setting a custom status message", mock.initConverse(function (_converse) {
_converse.xmppstatus.save({'status': 'online'});
spyOn(_converse.xmppstatus, 'setStatusMessage').andCallThrough();
spyOn(_converse.connection, 'send');
_converse.xmppstatus.setStatusMessage("I'm also happy!");
runs (function () {
expect(converse.connection.send).toHaveBeenCalled();
var $stanza = $(converse.connection.send.argsForCall[0][0].tree());
expect(_converse.connection.send).toHaveBeenCalled();
var $stanza = $(_converse.connection.send.argsForCall[0][0].tree());
expect($stanza.children().length).toBe(1);
expect($stanza.children('show').length).toBe(0);
});
......
......@@ -15,82 +15,82 @@
"converse-core"
],
factory);
}(this, function ($, _, moment, strophe, utils, converse) {
}(this, function ($, _, moment, strophe, utils, _converse) {
var Strophe = strophe.Strophe;
// API methods only available to plugins
converse.api = {
_converse.api = {
'connection': {
'connected': function () {
return converse.connection && converse.connection.connected || false;
return _converse.connection && _converse.connection.connected || false;
},
'disconnect': function () {
converse.connection.disconnect();
_converse.connection.disconnect();
},
},
'user': {
'jid': function () {
return converse.connection.jid;
return _converse.connection.jid;
},
'login': function (credentials) {
converse.initConnection();
converse.logIn(credentials);
_converse.initConnection();
_converse.logIn(credentials);
},
'logout': function () {
converse.logOut();
_converse.logOut();
},
'status': {
'get': function () {
return converse.xmppstatus.get('status');
return _converse.xmppstatus.get('status');
},
'set': function (value, message) {
var data = {'status': value};
if (!_.contains(_.keys(converse.STATUS_WEIGHTS), value)) {
if (!_.contains(_.keys(_converse.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") {
data.status_message = message;
}
converse.xmppstatus.sendPresence(value);
converse.xmppstatus.save(data);
_converse.xmppstatus.sendPresence(value);
_converse.xmppstatus.save(data);
},
'message': {
'get': function () {
return converse.xmppstatus.get('status_message');
return _converse.xmppstatus.get('status_message');
},
'set': function (stat) {
converse.xmppstatus.save({'status_message': stat});
_converse.xmppstatus.save({'status_message': stat});
}
}
},
},
'settings': {
'get': function (key) {
if (_.contains(Object.keys(converse.default_settings), key)) {
return converse[key];
if (_.contains(Object.keys(_converse.default_settings), key)) {
return _converse[key];
}
},
'set': function (key, val) {
var o = {};
if (typeof key === "object") {
_.extend(converse, _.pick(key, Object.keys(converse.default_settings)));
_.extend(_converse, _.pick(key, Object.keys(_converse.default_settings)));
} else if (typeof key === "string") {
o[key] = val;
_.extend(converse, _.pick(o, Object.keys(converse.default_settings)));
_.extend(_converse, _.pick(o, Object.keys(_converse.default_settings)));
}
}
},
'contacts': {
'get': function (jids) {
var _transform = function (jid) {
var contact = converse.roster.get(Strophe.getBareJidFromJid(jid));
var contact = _converse.roster.get(Strophe.getBareJidFromJid(jid));
if (contact) {
return contact.attributes;
}
return null;
};
if (typeof jids === "undefined") {
jids = converse.roster.pluck('jid');
jids = _converse.roster.pluck('jid');
} else if (typeof jids === "string") {
return _transform(jids);
}
......@@ -100,24 +100,24 @@
if (typeof jid !== "string" || jid.indexOf('@') < 0) {
throw new TypeError('contacts.add: invalid jid');
}
converse.roster.addAndSubscribe(jid, _.isEmpty(name)? jid: name);
_converse.roster.addAndSubscribe(jid, _.isEmpty(name)? jid: name);
}
},
'chats': {
'open': function (jids) {
var chatbox;
if (typeof jids === "undefined") {
converse.log("chats.open: You need to provide at least one JID", "error");
_converse.log("chats.open: You need to provide at least one JID", "error");
return null;
} else if (typeof jids === "string") {
chatbox = converse.wrappedChatBox(
converse.chatboxes.getChatBox(jids, true).trigger('show')
chatbox = _converse.wrappedChatBox(
_converse.chatboxes.getChatBox(jids, true).trigger('show')
);
return chatbox;
}
return _.map(jids, function (jid) {
chatbox = converse.wrappedChatBox(
converse.chatboxes.getChatBox(jid, true).trigger('show')
chatbox = _converse.wrappedChatBox(
_converse.chatboxes.getChatBox(jid, true).trigger('show')
);
return chatbox;
});
......@@ -125,21 +125,21 @@
'get': function (jids) {
if (typeof jids === "undefined") {
var result = [];
converse.chatboxes.each(function (chatbox) {
_converse.chatboxes.each(function (chatbox) {
// FIXME: Leaky abstraction from MUC. We need to add a
// base type for chat boxes, and check for that.
if (chatbox.get('type') !== 'chatroom') {
result.push(converse.wrappedChatBox(chatbox));
result.push(_converse.wrappedChatBox(chatbox));
}
});
return result;
} else if (typeof jids === "string") {
return converse.wrappedChatBox(converse.chatboxes.getChatBox(jids));
return _converse.wrappedChatBox(_converse.chatboxes.getChatBox(jids));
}
return _.map(jids,
_.partial(
_.compose(
converse.wrappedChatBox.bind(converse), converse.chatboxes.getChatBox.bind(converse.chatboxes)
_converse.wrappedChatBox.bind(_converse), _converse.chatboxes.getChatBox.bind(_converse.chatboxes)
), _, true
)
);
......@@ -147,20 +147,20 @@
},
'tokens': {
'get': function (id) {
if (!converse.expose_rid_and_sid || typeof converse.connection === "undefined") {
if (!_converse.expose_rid_and_sid || typeof _converse.connection === "undefined") {
return null;
}
if (id.toLowerCase() === 'rid') {
return converse.connection.rid || converse.connection._proto.rid;
return _converse.connection.rid || _converse.connection._proto.rid;
} else if (id.toLowerCase() === 'sid') {
return converse.connection.sid || converse.connection._proto.sid;
return _converse.connection.sid || _converse.connection._proto.sid;
}
}
},
'listen': {
'once': converse.once,
'on': converse.on,
'not': converse.off,
'once': _converse.once,
'on': _converse.on,
'not': _converse.off,
'stanza': function (name, options, handler) {
if (typeof options === 'function') {
handler = options;
......@@ -168,7 +168,7 @@
} else {
options = options || {};
}
converse.connection.addHandler(
_converse.connection.addHandler(
handler,
options.ns,
name,
......@@ -180,22 +180,22 @@
},
},
'send': function (stanza) {
converse.connection.send(stanza);
_converse.connection.send(stanza);
},
};
// The public API
return {
'initialize': function (settings, callback) {
return converse.initialize(settings, callback);
return _converse.initialize(settings, callback);
},
'plugins': {
'add': function (name, plugin) {
plugin.__name__ = name;
converse.pluggable.plugins[name] = plugin;
_converse.pluggable.plugins[name] = plugin;
},
'remove': function (name) {
delete converse.pluggable.plugins[name];
delete _converse.pluggable.plugins[name];
},
},
'env': {
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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