Listen for new room bookmarks pushed from the user's PEP service

This commit is contained in:
JC Brand 2018-02-07 21:59:45 +01:00
parent 5f3761dc7f
commit fbef370b65
3 changed files with 75 additions and 49 deletions

View File

@ -7,6 +7,7 @@
### New features
- XEP-0382 Spoiler Messages (currently only for private chats)
- Listen for new room bookmarks pushed from the user's PEP service.
### API changes
- New API method `_converse.disco.getIdentity` to check whether a JID has a given identity.

View File

@ -12,6 +12,7 @@
} (this, function (jasmine, $, converse, utils, mock, test_utils) {
"use strict";
var $iq = converse.env.$iq,
$msg = converse.env.$msg,
Backbone = converse.env.Backbone,
Strophe = converse.env.Strophe,
_ = converse.env._,
@ -278,51 +279,58 @@
describe("Bookmarks", function () {
xit("can be pushed from the XMPP server", mock.initConverse(function (_converse) {
// TODO
/* The stored data is automatically pushed to all of the user's
* connected resources.
*
* Publisher receives event notification
* -------------------------------------
* <message from='juliet@capulet.lit'
* to='juliet@capulet.lit/balcony'
* type='headline'
* id='rnfoo1'>
* <event xmlns='http://jabber.org/protocol/pubsub#event'>
* <items node='storage:bookmarks'>
* <item id='current'>
* <storage xmlns='storage:bookmarks'>
* <conference name='The Play&apos;s the Thing'
* autojoin='true'
* jid='theplay@conference.shakespeare.lit'>
* <nick>JC</nick>
* </conference>
* </storage>
* </item>
* </items>
* </event>
* </message>
it("can be pushed from the XMPP server", mock.initConverseWithPromises(
['send'], ['rosterGroupsFetched', 'connected'], {},
function (done, _converse) {
* <message from='juliet@capulet.lit'
* to='juliet@capulet.lit/chamber'
* type='headline'
* id='rnfoo2'>
* <event xmlns='http://jabber.org/protocol/pubsub#event'>
* <items node='storage:bookmarks'>
* <item id='current'>
* <storage xmlns='storage:bookmarks'>
* <conference name='The Play&apos;s the Thing'
* autojoin='true'
* jid='theplay@conference.shakespeare.lit'>
* <nick>JC</nick>
* </conference>
* </storage>
* </item>
* </items>
* </event>
* </message>
*/
test_utils.openControlBox().openRoomsPanel(_converse);
test_utils.waitUntil(function () {
return _converse.bookmarks;
}, 300).then(function () {
/* The stored data is automatically pushed to all of the user's
* connected resources.
*
* Publisher receives event notification
* -------------------------------------
* <message from='juliet@capulet.lit'
* to='juliet@capulet.lit/balcony'
* type='headline'
* id='rnfoo1'>
* <event xmlns='http://jabber.org/protocol/pubsub#event'>
* <items node='storage:bookmarks'>
* <item id='current'>
* <storage xmlns='storage:bookmarks'>
* <conference name='The Play&apos;s the Thing'
* autojoin='true'
* jid='theplay@conference.shakespeare.lit'>
* <nick>JC</nick>
* </conference>
* </storage>
* </item>
* </items>
* </event>
* </message>
*/
var stanza = $msg({
'from': 'dummy@localhost',
'to': 'dummy@localhost/resource',
'type': 'headline',
'id': 'rnfoo1'
}).c('event', {'xmlns': 'http://jabber.org/protocol/pubsub#event'})
.c('items', {'node': 'storage:bookmarks'})
.c('item', {'id': 'current'})
.c('storage', {'xmlns': 'storage:bookmarks'})
.c('conference', {'name': 'The Play&apos;s the Thing',
'autojoin': 'true',
'jid':'theplay@conference.shakespeare.lit'})
.c('nick').t('JC');
_converse.connection._dataRecv(test_utils.createRequest(stanza));
expect(_converse.bookmarks.length).toBe(1);
expect(_converse.chatboxviews.get('theplay@conference.shakespeare.lit')).not.toBeUndefined();
done();
});
}));
it("can be retrieved from the XMPP server", mock.initConverseWithPromises(

View File

@ -370,10 +370,13 @@
}
},
onBookmarksReceived (deferred, iq) {
createBookmarksFromStanza (stanza) {
const bookmarks = sizzle(
'items[node="storage:bookmarks"] item[id="current"] storage conference',
iq
'items[node="storage:bookmarks"] '+
'item#current '+
'storage[xmlns="storage:bookmarks"] '+
'conference',
stanza
)
_.forEach(bookmarks, (bookmark) => {
this.create({
@ -383,6 +386,10 @@
'nick': bookmark.querySelector('nick').textContent
});
});
},
onBookmarksReceived (deferred, iq) {
this.createBookmarksFromStanza(iq);
if (!_.isUndefined(deferred)) {
return deferred.resolve();
}
@ -557,6 +564,16 @@
]).then(initBookmarks)
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
_converse.on('connected', () => {
// Add a handler for bookmarks pushed from other connected clients
// (from the same user obviously)
_converse.connection.addHandler((message) => {
if (message.querySelector('event[xmlns="'+Strophe.NS.PUBSUB+'#event"]')) {
_converse.bookmarks.createBookmarksFromStanza(message);
}
}, null, 'message', 'headline', null, _converse.bare_jid);
});
const afterReconnection = function () {
if (!_converse.allow_bookmarks) {
return;