فهرست منبع

emoji: Lazy load the emoji JSON

Only load it once the first chat has been opened.
JC Brand 5 سال پیش
والد
کامیت
b0a9782d31

+ 1 - 3
spec/bookmarks.js

@@ -16,9 +16,7 @@
 
     describe("A chat room", function () {
 
-        it("can be bookmarked", mock.initConverse(
-                ['rosterGroupsFetched', 'emojisInitialized'], {},
-                async function (done, _converse) {
+        it("can be bookmarked", mock.initConverse(['rosterGroupsFetched'], {}, async function (done, _converse) {
 
             await test_utils.waitUntilDiscoConfirmed(
                 _converse, _converse.bare_jid,

+ 12 - 12
spec/chatbox.js

@@ -162,7 +162,7 @@
             }));
 
             it("can be trimmed to conserve space",
-                mock.initConverse(['rosterGroupsFetched', 'emojisInitialized'], {},
+                mock.initConverse(['rosterGroupsFetched'], {},
                 async function (done, _converse) {
 
                 spyOn(_converse.chatboxviews, 'trimChats');
@@ -523,7 +523,7 @@
 
                 it("does not open a new chatbox",
                     mock.initConverse(
-                        ['rosterGroupsFetched', 'emojisInitialized'], {},
+                        ['rosterGroupsFetched'], {},
                         async function (done, _converse) {
 
                     await test_utils.waitForRoster(_converse, 'current');
@@ -884,7 +884,7 @@
 
                     it("is sent if the user has stopped typing since 2 minutes",
                         mock.initConverse(
-                            ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                            ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                             async function (done, _converse) {
 
                         const sent_stanzas = _converse.connection.sent_stanzas;
@@ -1190,7 +1190,7 @@
 
             it("is incremented from zero when chatbox was closed after viewing previously received messages and the window is not focused now",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');
@@ -1271,7 +1271,7 @@
             }));
 
             it("is incremeted when message is received, chatbox is scrolled down and the window is not focused",
-                mock.initConverse(['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                mock.initConverse(['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');
@@ -1291,7 +1291,7 @@
 
             it("is incremeted when message is received, chatbox is scrolled up and the window is not focused",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1309,7 +1309,7 @@
 
             it("is cleared when ChatBoxView was scrolled down and the window become focused",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1328,7 +1328,7 @@
 
             it("is not cleared when ChatBoxView was scrolled up and the windows become focused",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1433,7 +1433,7 @@
 
             it("is cleared when unread messages are viewed which were received in scrolled-up chatbox",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.openControlBox(_converse);
@@ -1458,7 +1458,7 @@
 
             it("is not cleared after user clicks on roster view when chatbox is already opened and scrolled up",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1485,7 +1485,7 @@
 
             it("is displayed when scrolled up chatbox is minimized after receiving unread messages",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1513,7 +1513,7 @@
 
             it("is incremented when message is received and windows is not focused",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1);

+ 1 - 1
spec/controlbox.js

@@ -38,7 +38,7 @@
 
             it("can be used to add contact and it checks for case-sensivity",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 spyOn(_converse.api, "trigger").and.callThrough();

+ 1 - 3
spec/converse.js

@@ -214,9 +214,7 @@
         describe("The \"contacts\" API", function () {
 
             it("has a method 'get' which returns wrapped contacts",
-                mock.initConverse(
-                    ['emojisInitialized'], {},
-                    async function (done, _converse) {
+                    mock.initConverse([], {}, async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');
                 let contact = await _converse.api.contacts.get('non-existing@jabber.org');

+ 2 - 2
spec/emojis.js

@@ -105,7 +105,7 @@
 
             it("allows you to search for particular emojis",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 const muc_jid = 'lounge@montague.lit';
@@ -158,7 +158,7 @@
         describe("A Chat Message", function () {
             it("will display larger if it's only emojis",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {'use_system_emojis': true},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {'use_system_emojis': true},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');

+ 2 - 6
spec/http-file-upload.js

@@ -171,9 +171,7 @@
             describe("A file upload toolbar button", function () {
 
                 it("does not appear in private chats",
-                    mock.initConverse(
-                        ['emojisInitialized'], {},
-                        async function (done, _converse) {
+                        mock.initConverse([], {}, async function (done, _converse) {
 
                     await test_utils.waitForRoster(_converse, 'current', 3);
                     test_utils.openControlBox(_converse);
@@ -461,9 +459,7 @@
                     }));
 
                     it("shows an error message if the file is too large",
-                        mock.initConverse(
-                            ['emojisInitialized'], {},
-                            async function (done, _converse) {
+                            mock.initConverse([], {}, async function (done, _converse) {
 
                         const IQ_stanzas = _converse.connection.IQ_stanzas;
                         const IQ_ids =  _converse.connection.IQ_ids;

+ 9 - 9
spec/messages.js

@@ -985,7 +985,7 @@
 
         it("will render images from their URLs",
             mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                 async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current');
@@ -1033,7 +1033,7 @@
 
         it("will render the message time as configured",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current');
@@ -1059,7 +1059,7 @@
 
         it("will be correctly identified and rendered as a followup message",
             mock.initConverse(
-                ['rosterGroupsFetched', 'emojisInitialized'], {},
+                ['rosterGroupsFetched'], {},
                 async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current');
@@ -1381,7 +1381,7 @@
 
             it("will open a chatbox and be displayed inside it",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 const include_nick = false;
@@ -1427,7 +1427,7 @@
 
             it("will be trimmed of leading and trailing whitespace",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current', 1, false);
@@ -1519,7 +1519,7 @@
 
                 it("the VCard for that user is fetched and the chatbox updated with the results",
                     mock.initConverse(
-                        ['rosterGroupsFetched', 'emojisInitialized'], {'allow_non_roster_messaging': true},
+                        ['rosterGroupsFetched'], {'allow_non_roster_messaging': true},
                         async function (done, _converse) {
 
                     await test_utils.waitForRoster(_converse, 'current', 0);
@@ -1635,7 +1635,7 @@
 
                 it("will have the error message displayed after itself",
                     mock.initConverse(
-                        ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                        ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                         async function (done, _converse) {
 
                     await test_utils.waitForRoster(_converse, 'current', 1);
@@ -1847,7 +1847,7 @@
 
             it("is ignored if it's intended for a different resource and filter_by_resource is set to true",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');
@@ -2098,7 +2098,7 @@
 
         it("is not sent when a markable message is received from someone not on the roster",
             mock.initConverse(
-                ['rosterGroupsFetched', 'emojisInitialized'], {'allow_non_roster_messaging': true},
+                ['rosterGroupsFetched'], {'allow_non_roster_messaging': true},
                 async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current', 0);

+ 11 - 11
spec/muc.js

@@ -269,7 +269,7 @@
 
             it("will be created when muc_instant_rooms is set to true",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 let IQ_stanzas = _converse.connection.IQ_stanzas;
@@ -507,7 +507,7 @@
 
             it("is opened when an xmpp: URI is clicked inside another groupchat",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.waitForRoster(_converse, 'current');
@@ -535,7 +535,7 @@
 
             it("shows a notification if it's not anonymous",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 const muc_jid = 'coven@chat.shakespeare.lit';
@@ -579,7 +579,7 @@
 
             it("shows join/leave messages when users enter or exit a groupchat",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 const muc_jid = 'coven@chat.shakespeare.lit';
@@ -1648,7 +1648,7 @@
 
             it("shows users currently present in the groupchat",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.openAndEnterChatRoom(_converse, 'lounge@montague.lit', 'romeo');
@@ -2188,7 +2188,7 @@
 
             it("escapes the subject before rendering it, to avoid JS-injection attacks",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.openAndEnterChatRoom(_converse, 'jdev@conference.jabber.org', 'jc');
@@ -2711,7 +2711,7 @@
 
             it("informs users if they have been kicked out of the groupchat",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 /*  <presence
@@ -3514,7 +3514,7 @@
 
             it("takes a /kick command to kick a user",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched'], {},
                     async function (done, _converse) {
 
                 let sent_IQ, IQ_id;
@@ -3956,7 +3956,7 @@
 
             it("will show an error message if the groupchat requires a password",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 const muc_jid = 'protected';
@@ -4747,7 +4747,7 @@
 
             it("can be opened from a link in the \"Groupchats\" section of the controlbox",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                     async function (done, _converse) {
 
                 await test_utils.openControlBox(_converse);
@@ -4891,7 +4891,7 @@
 
             it("shows the number of unread mentions received",
                 mock.initConverse(
-                    ['rosterGroupsFetched', 'emojisInitialized'], {'allow_bookmarks': false},
+                    ['rosterGroupsFetched'], {'allow_bookmarks': false},
                     async function (done, _converse) {
 
                 await test_utils.openControlBox(_converse);

+ 1 - 1
spec/omemo.js

@@ -93,7 +93,7 @@
 
         it("enables encrypted messages to be sent and received",
             mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
+                ['rosterGroupsFetched', 'chatBoxesFetched'], {},
                 async function (done, _converse) {
 
             let sent_stanza;

+ 5 - 5
spec/roomslist.js

@@ -8,7 +8,7 @@
     describe("A list of open groupchats", function () {
 
         it("is shown in controlbox", mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'],
+                ['rosterGroupsFetched', 'chatBoxesFetched'],
                 { allow_bookmarks: false // Makes testing easier, otherwise we
                                          // have to mock stanza traffic.
                 }, async function (done, _converse) {
@@ -50,7 +50,7 @@
 
         it("uses bookmarks to determine groupchat names",
             mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'],
+                ['rosterGroupsFetched', 'chatBoxesFetched'],
                 {'view_mode': 'fullscreen'},
                 async function (done, _converse) {
 
@@ -110,7 +110,7 @@
     describe("A groupchat shown in the groupchats list", function () {
 
         it("is highlighted if it's currently open", mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'],
+                ['rosterGroupsFetched', 'chatBoxesFetched'],
                 { view_mode: 'fullscreen',
                 allow_bookmarks: false // Makes testing easier, otherwise we have to mock stanza traffic.
                 }, async function (done, _converse) {
@@ -139,7 +139,7 @@
         }));
 
         it("has an info icon which opens a details modal when clicked", mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'],
+                ['rosterGroupsFetched', 'chatBoxesFetched'],
                 { whitelisted_plugins: ['converse-roomslist'],
                 allow_bookmarks: false // Makes testing easier, otherwise we
                                         // have to mock stanza traffic.
@@ -244,7 +244,7 @@
         }));
 
         it("can be closed", mock.initConverse(
-                ['rosterGroupsFetched', 'emojisInitialized'],
+                ['rosterGroupsFetched'],
                 { whitelisted_plugins: ['converse-roomslist'],
                 allow_bookmarks: false // Makes testing easier, otherwise we have to mock stanza traffic.
                 },

+ 4 - 6
spec/user-details-modal.js

@@ -11,9 +11,9 @@
     return describe("The User Details Modal", function () {
 
         it("can be used to remove a contact",
-            mock.initConverse(
-                ['rosterGroupsFetched', 'chatBoxesFetched', 'emojisInitialized'], {},
-                async function (done, _converse) {
+                mock.initConverse(
+                    ['rosterGroupsFetched', 'chatBoxesFetched'], {},
+                    async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current', 1);
             _converse.api.trigger('rosterContactsFetched');
@@ -44,9 +44,7 @@
         }));
 
         it("shows an alert when an error happened while removing the contact",
-            mock.initConverse(
-                ['rosterGroupsFetched', 'emojisInitialized'], {},
-                async function (done, _converse) {
+                mock.initConverse(['rosterGroupsFetched'], {}, async function (done, _converse) {
 
             await test_utils.waitForRoster(_converse, 'current', 1);
             _converse.api.trigger('rosterContactsFetched');

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

@@ -86,9 +86,7 @@ converse.plugins.add('converse-chatboxes', {
             },
 
             onConnected (reconnecting) {
-                if (reconnecting) {
-                    return;
-                }
+                if (reconnecting) { return; }
                 this.browserStorage = _converse.createStore(`converse.chatboxes-${_converse.bare_jid}`);
                 this.fetch({
                     'add': true,

+ 44 - 137
src/headless/converse-emoji.js

@@ -14,121 +14,19 @@ const { Backbone } = converse.env;
 const u = converse.env.utils;
 
 const ASCII_LIST = {
-    '*\\0/*':'1f646',
-    '*\\O/*':'1f646',
-    '-___-':'1f611',
-    ':\'-)':'1f602',
-    '\':-)':'1f605',
-    '\':-D':'1f605',
-    '>:-)':'1f606',
-    '\':-(':'1f613',
-    '>:-(':'1f620',
-    ':\'-(':'1f622',
-    'O:-)':'1f607',
-    '0:-3':'1f607',
-    '0:-)':'1f607',
-    '0;^)':'1f607',
-    'O;-)':'1f607',
-    '0;-)':'1f607',
-    'O:-3':'1f607',
-    '-__-':'1f611',
-    ':-Þ':'1f61b',
-    '</3':'1f494',
-    ':\')':'1f602',
-    ':-D':'1f603',
-    '\':)':'1f605',
-    '\'=)':'1f605',
-    '\':D':'1f605',
-    '\'=D':'1f605',
-    '>:)':'1f606',
-    '>;)':'1f606',
-    '>=)':'1f606',
-    ';-)':'1f609',
-    '*-)':'1f609',
-    ';-]':'1f609',
-    ';^)':'1f609',
-    '\':(':'1f613',
-    '\'=(':'1f613',
-    ':-*':'1f618',
-    ':^*':'1f618',
-    '>:P':'1f61c',
-    'X-P':'1f61c',
-    '>:[':'1f61e',
-    ':-(':'1f61e',
-    ':-[':'1f61e',
-    '>:(':'1f620',
-    ':\'(':'1f622',
-    ';-(':'1f622',
-    '>.<':'1f623',
-    '#-)':'1f635',
-    '%-)':'1f635',
-    'X-)':'1f635',
-    '\\0/':'1f646',
-    '\\O/':'1f646',
-    '0:3':'1f607',
-    '0:)':'1f607',
-    'O:)':'1f607',
-    'O=)':'1f607',
-    'O:3':'1f607',
-    'B-)':'1f60e',
-    '8-)':'1f60e',
-    'B-D':'1f60e',
-    '8-D':'1f60e',
-    '-_-':'1f611',
-    '>:\\':'1f615',
-    '>:/':'1f615',
-    ':-/':'1f615',
-    ':-.':'1f615',
-    ':-P':'1f61b',
-    ':Þ':'1f61b',
-    ':-b':'1f61b',
-    ':-O':'1f62e',
-    'O_O':'1f62e',
-    '>:O':'1f62e',
-    ':-X':'1f636',
-    ':-#':'1f636',
-    ':-)':'1f642',
-    '(y)':'1f44d',
-    '<3':'2764',
-    ':D':'1f603',
-    '=D':'1f603',
-    ';)':'1f609',
-    '*)':'1f609',
-    ';]':'1f609',
-    ';D':'1f609',
-    ':*':'1f618',
-    '=*':'1f618',
-    ':(':'1f61e',
-    ':[':'1f61e',
-    '=(':'1f61e',
-    ':@':'1f620',
-    ';(':'1f622',
-    'D:':'1f628',
-    ':$':'1f633',
-    '=$':'1f633',
-    '#)':'1f635',
-    '%)':'1f635',
-    'X)':'1f635',
-    'B)':'1f60e',
-    '8)':'1f60e',
-    ':/':'1f615',
-    ':\\':'1f615',
-    '=/':'1f615',
-    '=\\':'1f615',
-    ':L':'1f615',
-    '=L':'1f615',
-    ':P':'1f61b',
-    '=P':'1f61b',
-    ':b':'1f61b',
-    ':O':'1f62e',
-    ':X':'1f636',
-    ':#':'1f636',
-    '=X':'1f636',
-    '=#':'1f636',
-    ':)':'1f642',
-    '=]':'1f642',
-    '=)':'1f642',
-    ':]':'1f642'
+    '*\\0/*':'1f646', '*\\O/*':'1f646', '-___-':'1f611', ':\'-)':'1f602', '\':-)':'1f605', '\':-D':'1f605', '>:-)':'1f606', '\':-(':'1f613',
+    '>:-(':'1f620', ':\'-(':'1f622', 'O:-)':'1f607', '0:-3':'1f607', '0:-)':'1f607', '0;^)':'1f607', 'O;-)':'1f607', '0;-)':'1f607', 'O:-3':'1f607',
+    '-__-':'1f611', ':-Þ':'1f61b', '</3':'1f494', ':\')':'1f602', ':-D':'1f603', '\':)':'1f605', '\'=)':'1f605', '\':D':'1f605', '\'=D':'1f605',
+    '>:)':'1f606', '>;)':'1f606', '>=)':'1f606', ';-)':'1f609', '*-)':'1f609', ';-]':'1f609', ';^)':'1f609', '\':(':'1f613', '\'=(':'1f613',
+    ':-*':'1f618', ':^*':'1f618', '>:P':'1f61c', 'X-P':'1f61c', '>:[':'1f61e', ':-(':'1f61e', ':-[':'1f61e', '>:(':'1f620', ':\'(':'1f622',
+    ';-(':'1f622', '>.<':'1f623', '#-)':'1f635', '%-)':'1f635', 'X-)':'1f635', '\\0/':'1f646', '\\O/':'1f646', '0:3':'1f607', '0:)':'1f607',
+    'O:)':'1f607', 'O=)':'1f607', 'O:3':'1f607', 'B-)':'1f60e', '8-)':'1f60e', 'B-D':'1f60e', '8-D':'1f60e', '-_-':'1f611', '>:\\':'1f615',
+    '>:/':'1f615', ':-/':'1f615', ':-.':'1f615', ':-P':'1f61b', ':Þ':'1f61b', ':-b':'1f61b', ':-O':'1f62e', 'O_O':'1f62e', '>:O':'1f62e',
+    ':-X':'1f636', ':-#':'1f636', ':-)':'1f642', '(y)':'1f44d', '<3':'2764', ':D':'1f603', '=D':'1f603', ';)':'1f609', '*)':'1f609',
+    ';]':'1f609', ';D':'1f609', ':*':'1f618', '=*':'1f618', ':(':'1f61e', ':[':'1f61e', '=(':'1f61e', ':@':'1f620', ';(':'1f622', 'D:':'1f628',
+    ':$':'1f633', '=$':'1f633', '#)':'1f635', '%)':'1f635', 'X)':'1f635', 'B)':'1f60e', '8)':'1f60e', ':/':'1f615', ':\\':'1f615', '=/':'1f615',
+    '=\\':'1f615', ':L':'1f615', '=L':'1f615', ':P':'1f61b', '=P':'1f61b', ':b':'1f61b', ':O':'1f62e', ':X':'1f636', ':#':'1f636', '=X':'1f636',
+    '=#':'1f636', ':)':'1f642', '=]':'1f642', '=)':'1f642', ':]':'1f642'
 };
 
 
@@ -202,6 +100,7 @@ converse.plugins.add('converse-emoji', {
             }
         });
 
+        _converse.emojis = {};
         _converse.api.promises.add('emojisInitialized', false);
         twemoji.default.base = _converse.emoji_image_path;
 
@@ -220,8 +119,6 @@ converse.plugins.add('converse-emoji', {
             }
         });
 
-        _converse.emojis = {};
-
         function getTonedEmojis () {
             if (!_converse.toned_emojis) {
                 _converse.toned_emojis = _.uniq(
@@ -366,26 +263,29 @@ converse.plugins.add('converse-emoji', {
         });
         /************************ END Utils ************************/
 
-        const { default: json } = await import(/*webpackChunkName: "emojis" */ './emojis.json');
-        _converse.emojis.json = json;
-        _converse.emojis.categories = Object.keys(_converse.emojis.json);
-        _converse.emojis_map = _converse.emojis.categories.reduce((result, cat) => Object.assign(result, _converse.emojis.json[cat]), {});
-        _converse.emojis_list = Object.values(_converse.emojis_map);
-        _converse.emojis_list.sort((a, b) => a.sn < b.sn ? -1 : (a.sn > b.sn ? 1 : 0));
-        _converse.emoji_shortnames = _converse.emojis_list.map(m => m.sn);
-
-        const getShortNames = () => _converse.emoji_shortnames.map(s => s.replace(/[+]/g, "\\$&")).join('|');
-        _converse.emojis.shortnames_regex = new RegExp("<object[^>]*>.*?<\/object>|<span[^>]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|("+getShortNames()+")", "gi");
-
-
-        _converse.emojis.toned = getTonedEmojis();
-
-        /**
-         * Triggered once the JSON file representing emoji data has been
-         * fetched and its save to start calling emoji utility methods.
-         * @event _converse#emojisInitialized
-         */
-        _converse.api.trigger('emojisInitialized');
+        async function initializeEmojis () {
+            if (_converse.emojis.json) {
+                return;
+            }
+            const { default: json } = await import(/*webpackChunkName: "emojis" */ './emojis.json');
+            _converse.emojis.json = json;
+            _converse.emojis.categories = Object.keys(_converse.emojis.json);
+            _converse.emojis_map = _converse.emojis.categories.reduce((result, cat) => Object.assign(result, _converse.emojis.json[cat]), {});
+            _converse.emojis_list = Object.values(_converse.emojis_map);
+            _converse.emojis_list.sort((a, b) => a.sn < b.sn ? -1 : (a.sn > b.sn ? 1 : 0));
+            _converse.emoji_shortnames = _converse.emojis_list.map(m => m.sn);
+
+            const getShortNames = () => _converse.emoji_shortnames.map(s => s.replace(/[+]/g, "\\$&")).join('|');
+            _converse.emojis.shortnames_regex = new RegExp("<object[^>]*>.*?<\/object>|<span[^>]*>.*?<\/span>|<(?:object|embed|svg|img|div|span|p|a)[^>]*>|("+getShortNames()+")", "gi");
+
+            _converse.emojis.toned = getTonedEmojis();
+            /**
+             * Triggered once the JSON file representing emoji data has been
+             * fetched and its save to start calling emoji utility methods.
+             * @event _converse#emojisInitialized
+             */
+            _converse.api.trigger('emojisInitialized');
+        }
 
 
         /************************ BEGIN Event Handlers ************************/
@@ -395,6 +295,13 @@ converse.plugins.add('converse-emoji', {
                 delete _converse.emojipicker
             }
         });
+
+        _converse.api.listen.on('chatBoxesInitialized', () => {
+            _converse.chatboxes.on(
+                'add',
+                chat => (chat.get('type') !== _converse.CONTROLBOX_TYPE) && initializeEmojis()
+            );
+        });
         /************************ END Event Handlers ************************/
     }
 });

+ 1 - 1
src/headless/utils/core.js

@@ -384,7 +384,7 @@ u.getResolveablePromise = function () {
         wrapper.resolve = resolve;
         wrapper.reject = reject;
     })
-    _.assign(promise, wrapper);
+    Object.assign(promise, wrapper);
     promise.then(
         function (v) {
             promise.isResolved = true;

+ 2 - 1
tests/mock.js

@@ -227,8 +227,9 @@
         db_request.onsuccess = function () {
             const db = db_request.result;
             const bare_jid = "romeo@montague.lit";
+            let store;
             try {
-                const store= db.transaction([bare_jid], "readwrite").objectStore(bare_jid);
+                store= db.transaction([bare_jid], "readwrite").objectStore(bare_jid);
             } catch (e) {
                 console.error(e);
                 return promise.resolve();