More fixes to properly tear down session after logout.

Fixed problem with Strophe handlers zombies.
Remove zombie handlers for minimized chats (caused duplicate minimized chats).
This commit is contained in:
JC Brand 2014-09-20 15:07:55 +02:00
parent 50f84ada39
commit 0babac2b17
2 changed files with 34 additions and 11 deletions

View File

@ -494,9 +494,10 @@
} else if (status === Strophe.Status.DISCONNECTING) { } else if (status === Strophe.Status.DISCONNECTING) {
if (!converse.connection.connected) { if (!converse.connection.connected) {
converse.renderLoginPanel(); converse.renderLoginPanel();
} } else {
converse.giveFeedback(__('Disconnecting'), 'error'); converse.giveFeedback(__('Disconnecting'), 'error');
} }
}
}; };
this.applyHeightResistance = function (height) { this.applyHeightResistance = function (height) {
@ -582,6 +583,7 @@
converse.chatboxviews.closeAllChatBoxes(false); converse.chatboxviews.closeAllChatBoxes(false);
converse.clearSession(); converse.clearSession();
converse.connection.disconnect(); converse.connection.disconnect();
converse.connection.reset();
}; };
this.registerGlobalEventHandlers = function () { this.registerGlobalEventHandlers = function () {
@ -669,6 +671,7 @@
// close them now. // close them now.
this.chatboxviews.closeAllChatBoxes(); this.chatboxviews.closeAllChatBoxes();
this.setSession(); this.setSession();
this.jid = this.connection.jid;
this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid); this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
this.domain = Strophe.getDomainFromJid(this.connection.jid); this.domain = Strophe.getDomainFromJid(this.connection.jid);
this.minimized_chats = new converse.MinimizedChats({model: this.chatboxes}); this.minimized_chats = new converse.MinimizedChats({model: this.chatboxes});
@ -1940,13 +1943,13 @@
*/ */
converse.roster = new converse.RosterContacts(); converse.roster = new converse.RosterContacts();
converse.roster.browserStorage = new Backbone.BrowserStorage[converse.storage]( converse.roster.browserStorage = new Backbone.BrowserStorage[converse.storage](
b64_sha1('converse.contacts-'+converse.jid)); b64_sha1('converse.contacts-'+converse.bare_jid));
var rostergroups = new converse.RosterGroups(); var rostergroups = new converse.RosterGroups();
rostergroups.browserStorage = new Backbone.BrowserStorage[converse.storage]( rostergroups.browserStorage = new Backbone.BrowserStorage[converse.storage](
b64_sha1('converse.roster.groups'+converse.jid)); b64_sha1('converse.roster.groups'+converse.bare_jid));
converse.rosterview = new converse.RosterView({model: rostergroups}); converse.rosterview = new converse.RosterView({model: rostergroups});
converse.rosterview.render().fetch().update();
this.contactspanel.$el.append(converse.rosterview.$el); this.contactspanel.$el.append(converse.rosterview.$el);
converse.rosterview.render().fetch().update();
converse.connection.roster.get(function () {}); converse.connection.roster.get(function () {});
}, },
@ -2000,6 +2003,9 @@
show: function () { show: function () {
converse.controlboxtoggle.hide($.proxy(function () { converse.controlboxtoggle.hide($.proxy(function () {
this.$el.show('fast', function () { this.$el.show('fast', function () {
if (converse.rosterview) {
converse.rosterview.update();
}
converse.refreshWebkit(); converse.refreshWebkit();
}.bind(this)); }.bind(this));
converse.emit('controlBoxOpened', this); converse.emit('controlBoxOpened', this);
@ -3083,6 +3089,14 @@
this.model.on('change:num_unread', this.updateUnreadMessagesCounter, this); this.model.on('change:num_unread', this.updateUnreadMessagesCounter, this);
}, },
tearDown: function () {
this.model.off("add", this.onChanged);
this.model.off("destroy", this.removeChat);
this.model.off("change:minimized", this.onChanged);
this.model.off('change:num_unread', this.updateUnreadMessagesCounter);
return this;
},
initToggle: function () { initToggle: function () {
this.toggleview = new converse.MinimizedChatsToggleView({ this.toggleview = new converse.MinimizedChatsToggleView({
model: new converse.MinimizedChatsToggle() model: new converse.MinimizedChatsToggle()
@ -3827,7 +3841,6 @@
}, },
update: function () { update: function () {
// XXX: Is this still being used/valid?
var $count = $('#online-count'); var $count = $('#online-count');
$count.text('('+converse.roster.getNumOnlineContacts()+')'); $count.text('('+converse.roster.getNumOnlineContacts()+')');
if (!$count.is(':visible')) { if (!$count.is(':visible')) {
@ -3908,6 +3921,9 @@
}, },
showHideFilter: function () { showHideFilter: function () {
if (!this.$el.is(':visible')) {
return;
}
var $filter = this.$('.roster-filter'); var $filter = this.$('.roster-filter');
var $type = this.$('.filter-type'); var $type = this.$('.filter-type');
var visible = $filter.is(':visible'); var visible = $filter.is(':visible');
@ -4541,13 +4557,20 @@
/* Remove those views which are only allowed with a valid /* Remove those views which are only allowed with a valid
* connection. * connection.
*/ */
converse.roster.remove(); // Removes roster contacts this.initial_presence_sent = false;
converse.initial_presence_sent = false; this.roster.off().reset(); // Removes roster contacts
this.connection.roster._callbacks = []; // Remove all Roster handlers (e.g. rosterHandler)
this.rosterview.model.off().reset(); // Removes roster groups
this.rosterview.undelegateEvents().remove();
this.chatboxes.remove(); // Don't call off(), events won't get re-registered upon reconnect.
if (this.features) { if (this.features) {
this.features.off().remove(); this.features.reset();
} }
if (this.minimized_chats) { if (this.minimized_chats) {
this.minimized_chats.off().remove(); this.minimized_chats.undelegateEvents().model.reset();
this.minimized_chats.removeAll(); // Remove sub-views
this.minimized_chats.tearDown().remove(); // Remove overview
delete this.minimized_chats;
} }
return this; return this;
}; };

View File

@ -3,4 +3,4 @@
<option value="contacts">{{label_contacts}}</option> <option value="contacts">{{label_contacts}}</option>
<option value="groups">{{label_groups}}</option> <option value="groups">{{label_groups}}</option>
</select> </select>
<dl class="roster-contacts" style="display: block;"> <dl class="roster-contacts"><dl/>