Selaa lähdekoodia

MUC: Refresh room features when re-entering a cached room

Only fetch messages after we have the latest room features
Otherwise we run into race conditions where MAM messages are fetched
before we know whether (updated) the room supports MAM or not.
JC Brand 6 vuotta sitten
vanhempi
commit
40469a9787

+ 5 - 2
spec/muc.js

@@ -2120,11 +2120,14 @@
                         <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
                     </error>
                     </iq>`);
-                _converse.connection.sent_stanzas = [];
                 sent_stanzas = _converse.connection.sent_stanzas;
+                const index = sent_stanzas.length -1;
+
                 _converse.connection._dataRecv(test_utils.createRequest(result));
+                await test_utils.getRoomFeatures(_converse, 'coven', 'chat.shakespeare.lit');
+
                 const pres = await test_utils.waitUntil(
-                    () => sent_stanzas.filter(s => s.nodeName === 'presence').pop());
+                    () => sent_stanzas.slice(index).filter(s => s.nodeName === 'presence').pop());
                 expect(Strophe.serialize(pres)).toBe(
                     `<presence from="${_converse.jid}" to="coven@chat.shakespeare.lit/romeo" xmlns="jabber:client">`+
                         `<x xmlns="http://jabber.org/protocol/muc"><history maxstanzas="0"/></x>`+

+ 1 - 1
src/headless/converse-chatboxes.js

@@ -307,6 +307,7 @@ converse.plugins.add('converse-chatboxes', {
                 }
                 this.on('change:chat_state', this.sendChatState, this);
                 this.initMessages();
+                this.fetchMessages();
             },
 
             initMessages () {
@@ -320,7 +321,6 @@ converse.plugins.add('converse-chatboxes', {
                         _converse.api.send(this.createMessageStanza(message));
                     }
                 });
-                this.fetchMessages();
             },
 
             afterMessagesFetched () {

+ 1 - 1
src/headless/converse-disco.js

@@ -211,7 +211,7 @@ converse.plugins.add('converse-disco', {
                 });
 
                 // XEP-0128 Service Discovery Extensions
-                _.forEach(sizzle('x[type="result"][xmlns="jabber:x:data"] field', stanza), field => {
+                sizzle('x[type="result"][xmlns="jabber:x:data"] field', stanza).forEach(field => {
                     this.fields.create({
                         'var': field.getAttribute('var'),
                         'value': _.get(field.querySelector('value'), 'textContent'),

+ 13 - 13
src/headless/converse-muc.js

@@ -300,16 +300,18 @@ converse.plugins.add('converse-muc', {
                 if (conn_status !==  converse.ROOMSTATUS.ENTERED) {
                     // We're not restoring a room from cache, so let's clear
                     // the cache (which might be stale).
-                    this.clearMessages();
                     this.clearOccupants();
-
-                    await this.getRoomFeatures();
+                    await this.refreshRoomFeatures();
+                    this.clearMessages(); // XXX: This should be conditional
+                    this.fetchMessages();
                     if (!u.isPersistableModel(this)) {
                         // XXX: Happens during tests, nothing to do if this
                         // is a hanging chatbox (i.e. not in the collection anymore).
                         return;
                     }
                     this.join();
+                } else {
+                    this.features.fetch();
                 }
             },
 
@@ -350,7 +352,6 @@ converse.plugins.add('converse-muc', {
                     _.assign({id}, _.zipObject(converse.ROOM_FEATURES, _.map(converse.ROOM_FEATURES, _.stubFalse)))
                 );
                 this.features.browserStorage = new BrowserStorage.session(id);
-                this.features.fetch();
             },
 
             initOccupants () {
@@ -1188,15 +1189,14 @@ converse.plugins.add('converse-muc', {
             },
 
             fetchFeaturesIfConfigurationChanged (stanza) {
-                const configuration_changed = stanza.querySelector("status[code='104']"),
-                      logging_enabled = stanza.querySelector("status[code='170']"),
-                      logging_disabled = stanza.querySelector("status[code='171']"),
-                      room_no_longer_anon = stanza.querySelector("status[code='172']"),
-                      room_now_semi_anon = stanza.querySelector("status[code='173']"),
-                      room_now_fully_anon = stanza.querySelector("status[code='173']");
-
-                if (configuration_changed || logging_enabled || logging_disabled ||
-                        room_no_longer_anon || room_now_semi_anon || room_now_fully_anon) {
+                // 104: configuration change
+                // 170: logging enabled
+                // 171: logging disabled
+                // 172: room no longer anonymous
+                // 173: room now semi-anonymous
+                // 174: room now fully anonymous
+                const codes = ['104', '170', '171', '172', '173', '174'];
+                if (sizzle('status', stanza).filter(e => codes.includes(e.getAttribute('status'))).length) {
                     this.refreshRoomFeatures();
                 }
             },

+ 2 - 1
tests/utils.js

@@ -123,8 +123,9 @@
     utils.getRoomFeatures = async function (_converse, room, server, features=[]) {
         const room_jid = `${room}@${server}`.toLowerCase();
         const stanzas = _converse.connection.IQ_stanzas;
+        const index = stanzas.length-1;
         const stanza = await utils.waitUntil(() => _.filter(
-            stanzas,
+            stanzas.slice(index),
             iq => iq.querySelector(
                 `iq[to="${room_jid}"] query[xmlns="http://jabber.org/protocol/disco#info"]`
             )).pop());