telepathyClient: Make sure to filter messages at all times

When timestamps or presence or alias changes were appended before,
the _history could grow unbounded, leaving behind an unfruitful chat
log of:

  Jasper has gone offline.
  Jasper has gone online.
  Jasper has gone offline.
  Jasper has gone online.

ad nausem.

https://bugzilla.gnome.org/show_bug.cgi?id=651086
This commit is contained in:
Jasper St. Pierre 2011-05-25 13:18:56 -04:00
parent 8e661c3780
commit 8c2a290d09

View File

@ -428,13 +428,35 @@ Notification.prototype = {
this._append(messageBody, styles, message.timestamp, noTimestamp); this._append(messageBody, styles, message.timestamp, noTimestamp);
}, },
_filterMessages: function() {
if (this._history.length < 1)
return;
let lastMessageTime = this._history[0].time;
let currentTime = (Date.now() / 1000);
// Keep the scrollback from growing too long. If the most
// recent message (before the one we just added) is within
// SCROLLBACK_RECENT_TIME, we will keep
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
if (filteredHistory.length > maxLength) {
let lastMessageToKeep = filteredHistory[maxLength];
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
for (let i = 0; i < expired.length; i++)
expired[i].actor.destroy();
}
},
_append: function(text, styles, timestamp, noTimestamp) { _append: function(text, styles, timestamp, noTimestamp) {
let currentTime = (Date.now() / 1000); let currentTime = (Date.now() / 1000);
if (!timestamp) if (!timestamp)
timestamp = currentTime; timestamp = currentTime;
let lastMessageTime = -1;
if (this._history.length > 0)
lastMessageTime = this._history[0].time;
// Reset the old message timeout // Reset the old message timeout
if (this._timestampTimeoutId) if (this._timestampTimeoutId)
@ -457,23 +479,7 @@ Notification.prototype = {
Lang.bind(this, this.appendTimestamp)); Lang.bind(this, this.appendTimestamp));
} }
if (this._history.length > 1) { this._filterMessages();
// Keep the scrollback from growing too long. If the most
// recent message (before the one we just added) is within
// SCROLLBACK_RECENT_TIME, we will keep
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
if (filteredHistory.length > maxLength) {
let lastMessageToKeep = filteredHistory[maxLength];
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
for (let i = 0; i < expired.length; i++)
expired[i].actor.destroy();
}
}
}, },
_formatTimestamp: function(date) { _formatTimestamp: function(date) {
@ -515,6 +521,9 @@ Notification.prototype = {
this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false }); this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false });
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
this._filterMessages();
return false; return false;
}, },
@ -526,6 +535,8 @@ Notification.prototype = {
let label = this.addBody(text, true); let label = this.addBody(text, true);
label.add_style_class_name('chat-meta-message'); label.add_style_class_name('chat-meta-message');
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false}); this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
this._filterMessages();
}, },
appendAliasChange: function(oldAlias, newAlias) { appendAliasChange: function(oldAlias, newAlias) {
@ -539,6 +550,8 @@ Notification.prototype = {
label.add_style_class_name('chat-meta-message'); label.add_style_class_name('chat-meta-message');
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false }); this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false });
this.update(newAlias, null, { customContent: true }); this.update(newAlias, null, { customContent: true });
this._filterMessages();
}, },
_onEntryActivated: function() { _onEntryActivated: function() {