瀏覽代碼

Set flag to indicate user session is active

We then use this flag to determine whether we should use the values from
sessionStorage.

This appears to fix the problem I originally tried to fix in 607d7986651461eb912ef14081e247c9915d91f7.

When "cloning" a tab (e.g. via middle-click), the `active` flag will be
set and we'll create a new empty user session, otherwise it'll be false
and we can re-use the user session.
JC Brand 6 年之前
父節點
當前提交
119966d902
共有 1 個文件被更改,包括 14 次插入4 次删除
  1. 14 4
      src/headless/converse-core.js

+ 14 - 4
src/headless/converse-core.js

@@ -506,12 +506,15 @@ _converse.initConnection = function () {
 
 
 async function initUserSession (jid) {
-    const bare_jid = Strophe.getBareJidFromJid(jid);
+    const bare_jid = Strophe.getBareJidFromJid(jid).toLowerCase();
     const id = `converse.session-${bare_jid}`;
     if (!_converse.session || _converse.session.get('id') !== id) {
         _converse.session = new Backbone.Model({id});
         _converse.session.browserStorage = new BrowserStorage.session(id);
         await new Promise(r => _converse.session.fetch({'success': r, 'error': r}));
+        if (_converse.session.get('active')) {
+            _converse.session.clear();
+        }
         /**
          * Triggered once the user's session has been initialized. The session is a
          * cache which stores information about the user's current session.
@@ -523,7 +526,9 @@ async function initUserSession (jid) {
 }
 
 async function setUserJID (jid) {
-    jid = jid.toLowerCase();
+    await initUserSession(jid);
+    jid = _converse.session.get('jid') || jid;
+
     if (!Strophe.getResourceFromJid(jid)) {
         jid = jid.toLowerCase() + _converse.generateResource();
         // Set JID on the connection object so that when we call
@@ -531,7 +536,6 @@ async function setUserJID (jid) {
         // and sent to the XMPP server.
         _converse.connection.jid = jid;
     }
-    await initUserSession(jid);
     _converse.jid = jid;
     _converse.bare_jid = Strophe.getBareJidFromJid(jid);
     _converse.resource = Strophe.getResourceFromJid(jid);
@@ -540,7 +544,8 @@ async function setUserJID (jid) {
        'jid': jid,
        'bare_jid': _converse.bare_jid,
        'resource': _converse.resource,
-       'domain': _converse.domain
+       'domain': _converse.domain,
+       'active': true
     });
     /**
      * Triggered whenever the user's JID has been updated
@@ -822,6 +827,11 @@ _converse.initialize = async function (settings, callback) {
         window.addEventListener('mousemove', _converse.onUserActivity);
         const options = {'once': true, 'passive': true};
         window.addEventListener(_converse.unloadevent, _converse.onUserActivity, options);
+        window.addEventListener(_converse.unloadevent, () => {
+            if (_converse.session) {
+                _converse.session.save('active', false);
+            }
+        });
         _converse.everySecondTrigger = window.setInterval(_converse.onEverySecond, 1000);
     };