Browse Source

Create a new store, `_converse.config` to store `trusted`

The `_converse.session` store gets cleared after logout, but we want the
`trusted` flag to persist after logout.

Also update the documentation no that the `storage` config option has
been removed in favor of `trusted`.
JC Brand 6 years ago
parent
commit
9f8d30dde3

+ 1 - 0
CHANGES.md

@@ -53,6 +53,7 @@
 
 ## Configuration changes 
 
+- Removed the `storage` configuration setting, use [trusted](https://conversejs.org/docs/html/configurations.html#trusted) instead.
 - Removed the `use_vcards` configuration setting, instead VCards are always used.
 - Removed the `xhr_custom_status` and `xhr_custom_status_url` configuration
   settings. If you relied on these settings, you can instead listen for the

+ 53 - 27
dist/converse.js

@@ -68288,7 +68288,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           this.on('remove', this.markRoomAsUnbookmarked, this);
           this.on('remove', this.sendBookmarkStanza, this);
 
-          const storage = _converse.session.get('storage'),
+          const storage = _converse.config.get('storage'),
                 cache_key = `converse.room-bookmarks${_converse.bare_jid}`;
 
           this.fetched_flag = b64_sha1(cache_key + 'fetched');
@@ -68500,7 +68500,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
           _converse.chatboxes.on('remove', this.renderBookmarkListElement, this);
 
-          const storage = _converse.session.get('storage'),
+          const storage = _converse.config.get('storage'),
                 id = b64_sha1(`converse.room-bookmarks${_converse.bare_jid}-list-model`);
 
           this.list_model = new _converse.BookmarksList({
@@ -69040,7 +69040,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
           this.messages = new _converse.Messages();
 
-          const storage = _converse.session.get('storage');
+          const storage = _converse.config.get('storage');
 
           this.messages.browserStorage = new Backbone.BrowserStorage[storage](b64_sha1(`converse.messages${this.get('jid')}${_converse.bare_jid}`));
           this.messages.chatbox = this;
@@ -70003,10 +70003,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           'current_category': 'people',
           'current_skintone': '',
           'scroll_position': 0
-        },
-
-        initialize() {}
-
+        }
       });
       _converse.EmojiPickerView = Backbone.VDOMView.extend({
         className: 'emoji-picker-container',
@@ -70962,7 +70959,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
         createEmojiPicker() {
           if (_.isUndefined(_converse.emojipicker)) {
-            const storage = _converse.session.get('storage'),
+            const storage = _converse.config.get('storage'),
                   id = `converse.emoji-${_converse.bare_jid}`;
 
             _converse.emojipicker = new _converse.EmojiPicker({
@@ -71737,7 +71734,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
           const form_data = new FormData(ev.target);
 
-          _converse.session.save({
+          _converse.config.save({
             'trusted': form_data.get('trusted') && true || false,
             'storage': form_data.get('trusted') ? 'local' : 'session'
           });
@@ -71868,7 +71865,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
       });
 
       _converse.on('clearSession', () => {
-        if (_converse.session.get('trusted')) {
+        if (_converse.config.get('trusted')) {
           const chatboxes = _.get(_converse, 'chatboxes', null);
 
           if (!_.isNil(chatboxes)) {
@@ -72231,11 +72228,15 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
       _converse.connection.reset();
 
-      _converse.off();
-
       _converse.stopListening();
 
       _converse.tearDown();
+
+      delete _converse.config;
+
+      _converse.initClientConfig();
+
+      _converse.off();
     }
 
     if ('onpagehide' in window) {
@@ -72593,13 +72594,30 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
       }
     };
 
-    this.initSession = function () {
-      const id = b64_sha1('converse.bosh-session');
-      _converse.session = new Backbone.Model({
+    this.initClientConfig = function () {
+      /* The client config refers to configuration of the client which is
+       * independent of any particular user.
+       * What this means is that config values need to persist across
+       * user sessions.
+       */
+      const id = b64_sha1('converse.client-config');
+      _converse.config = new Backbone.Model({
         'id': id,
         'trusted': _converse.trusted && true || false,
         'storage': _converse.trusted ? 'local' : 'session'
       });
+      _converse.config.browserStorage = new Backbone.BrowserStorage.session(id);
+
+      _converse.config.fetch();
+
+      _converse.emit('clientConfigInitialized');
+    };
+
+    this.initSession = function () {
+      const id = b64_sha1('converse.bosh-session');
+      _converse.session = new Backbone.Model({
+        'id': id
+      });
       _converse.session.browserStorage = new Backbone.BrowserStorage.session(id);
 
       _converse.session.fetch();
@@ -72608,7 +72626,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
     };
 
     this.clearSession = function () {
-      if (!_converse.session.get('trusted')) {
+      if (!_converse.config.get('trusted')) {
         window.localStorage.clear();
         window.sessionStorage.clear();
       } else if (!_.isUndefined(this.session) && this.session.browserStorage) {
@@ -72765,6 +72783,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
 
       _converse.setUserJID();
 
+      _converse.initSession();
+
       _converse.enableCarbons();
 
       _converse.initStatus(reconnecting);
@@ -73136,7 +73156,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
     function finishInitialization() {
       _converse.initPlugins();
 
-      _converse.initSession();
+      _converse.initClientConfig();
 
       _converse.initConnection();
 
@@ -73658,7 +73678,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
         }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
       }
 
-      _converse.api.listen.on('setUserJID', initStreamFeatures);
+      _converse.api.listen.on('sessionInitialized', initStreamFeatures);
 
       _converse.api.listen.on('reconnected', initializeDisco);
 
@@ -75976,7 +75996,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
         },
 
         initToggle() {
-          const storage = _converse.session.get('storage'),
+          const storage = _converse.config.get('storage'),
                 id = b64_sha1(`converse.minchatstoggle${_converse.bare_jid}`);
 
           this.toggleview = new _converse.MinimizedChatsToggleView({
@@ -75984,7 +76004,13 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
               'id': id
             })
           });
-          this.toggleview.model.browserStorage = new Backbone.BrowserStorage[storage](id);
+
+          try {
+            this.toggleview.model.browserStorage = new Backbone.BrowserStorage[storage](id);
+          } catch (e) {
+            debugger;
+          }
+
           this.toggleview.model.fetch();
         },
 
@@ -76325,7 +76351,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
             'model': new (_converse.RoomsPanelModel.extend({
               'id': b64_sha1(`converse.roomspanel${_converse.bare_jid}`),
               // Required by sessionStorage
-              'browserStorage': new Backbone.BrowserStorage[_converse.session.get('storage')](b64_sha1(`converse.roomspanel${_converse.bare_jid}`))
+              'browserStorage': new Backbone.BrowserStorage[_converse.config.get('storage')](b64_sha1(`converse.roomspanel${_converse.bare_jid}`))
             }))()
           });
           this.roomspanel.model.fetch();
@@ -81839,7 +81865,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
           this.model.on('add', this.showOrHide, this);
           this.model.on('remove', this.showOrHide, this);
 
-          const storage = _converse.session.get('storage'),
+          const storage = _converse.config.get('storage'),
                 id = b64_sha1(`converse.roomslist${_converse.bare_jid}`);
 
           this.list_model = new _converse.RoomsList({
@@ -81950,7 +81976,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
       });
 
       const initRoomsListView = function initRoomsListView() {
-        const storage = _converse.session.get('storage'),
+        const storage = _converse.config.get('storage'),
               id = b64_sha1(`converse.open-rooms-{_converse.bare_jid}`),
               model = new _converse.OpenRooms();
 
@@ -82055,7 +82081,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
         /* Initialize the Bakcbone collections that represent the contats
          * roster and the roster groups.
          */
-        const storage = _converse.session.get('storage');
+        const storage = _converse.config.get('storage');
 
         _converse.roster = new _converse.RosterContacts();
         _converse.roster.browserStorage = new Backbone.BrowserStorage[storage](b64_sha1(`converse.contacts-${_converse.bare_jid}`));
@@ -84406,12 +84432,12 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
       _converse.initVCardCollection = function () {
         _converse.vcards = new _converse.VCards();
         const id = b64_sha1(`converse.vcards`);
-        _converse.vcards.browserStorage = new Backbone.BrowserStorage[_converse.session.get('storage')](id);
+        _converse.vcards.browserStorage = new Backbone.BrowserStorage[_converse.config.get('storage')](id);
 
         _converse.vcards.fetch();
       };
 
-      _converse.api.listen.on('setUserJID', _converse.initVCardCollection);
+      _converse.api.listen.on('sessionInitialized', _converse.initVCardCollection);
 
       _converse.on('addClientFeatures', () => {
         _converse.api.disco.own.features.add(Strophe.NS.VCARD);
@@ -86438,7 +86464,7 @@ __e(o.__('password')) +
 '">\n                </div>\n                ';
  } ;
 __p += '\n                <div class="form-group form-check">\n                    <input id="converse-login-trusted" type="checkbox" class="form-check-input" name="trusted" ';
- if (o._converse.session.get('trusted')) { ;
+ if (o._converse.config.get('trusted')) { ;
 __p += ' checked="checked" ';
  } ;
 __p += '>\n                    <label for="converse-login-trusted" class="form-check-label">' +

+ 52 - 80
docs/source/configuration.rst

@@ -33,7 +33,7 @@ authentication
 * Default:  ``login``
 * Allowed values: `login`_, `external`, `anonymous`_, `prebind`_
 
-This option states the way converse.js will authenticate.
+This option states the way Converse will authenticate.
 
 login
 ~~~~~
@@ -91,13 +91,13 @@ They are :ref:`keepalive` and `prebind_url`_.
 ``keepalive`` can be used keep the session alive without having to pass in
 new RID and SID tokens to ``converse.initialize`` every time you reload the page.
 This removes the need to set up a new BOSH session every time a page loads.
-You do however still need to supply the user's JID so that converse.js can be
+You do however still need to supply the user's JID so that Converse can be
 sure that the session it's resuming is for the right user.
 
-`prebind_url`_ lets you specify a URL which converse.js will call whenever a
+`prebind_url`_ lets you specify a URL which Converse will call whenever a
 new BOSH session needs to be set up.
 
-Here's an example of converse.js being initialized with these three options:
+Here's an example of Converse being initialized with these three options:
 
 .. code-block:: javascript
 
@@ -264,7 +264,7 @@ auto_login
 
 * Default:  ``false``
 
-This option can be used to let converse.js automatically log the user in as
+This option can be used to let Converse automatically log the user in as
 soon as the page loads.
 
 It should be used either with ``authentication`` set to ``anonymous`` or to ``login``.
@@ -274,7 +274,7 @@ valid ``jid`` and ``password`` values, either manually by passing them in, or
 by the `credentials_url`_ setting. Setting a ``credentials_url`` is preferable
 to manually passing in ``jid`` and ``password`` values, because it allows
 better reconnection with ``auto_reconnect``. When the connection drops,
-converse.js will automatically fetch new login credentials from the
+Converse will automatically fetch new login credentials from the
 ``credentials_url`` and reconnect.
 
 If ``authentication`` is set to ``anonymous``, then you will also need to provide the
@@ -283,7 +283,7 @@ server's domain via the `jid`_ setting.
 This is a useful setting if you'd like to create a custom login form in your
 website. You'll need to write some JavaScript to accept that custom form's
 login credentials, then you can pass those credentials (``jid`` and
-``password``) to ``converse.initialize`` to start converse.js and log the user
+``password``) to ``converse.initialize`` to start Converse and log the user
 into their XMPP account.
 
 auto_away
@@ -317,15 +317,15 @@ Automatically reconnect to the XMPP server if the connection drops
 unexpectedly.
 
 This option works best when you have `authentication` set to `prebind` and have
-also specified a `prebind_url` URL, from where converse.js can fetch the BOSH
-tokens. In this case, converse.js will automaticallly reconnect when the
+also specified a `prebind_url` URL, from where Converse can fetch the BOSH
+tokens. In this case, Converse will automaticallly reconnect when the
 connection drops but also reestablish earlier lost connections (due to
 network outages, closing your laptop etc.).
 
 When `authentication` is set to `login`, then this option will only work when
 the page hasn't been reloaded yet, because then the user's password has been
 wiped from memory. This configuration can however still be useful when using
-converse.js in desktop apps, for example those based on `CEF <https://bitbucket.org/chromiumembedded/cef>`_
+Converse in desktop apps, for example those based on `CEF <https://bitbucket.org/chromiumembedded/cef>`_
 or `electron <http://electron.atom.io/>`_.
 
 auto_subscribe
@@ -529,11 +529,11 @@ credentials_url
 
 This setting should be used in conjunction with ``authentication`` set to ``login`` and :ref:`keepalive` set to ``true``.
 
-It allows you to specify a URL which converse.js will call when it needs to get
-the username and password (or authentication token) which converse.js will use
+It allows you to specify a URL which Converse will call when it needs to get
+the username and password (or authentication token) which Converse will use
 to automatically log the user in.
 
-If ``auto_reconnect`` is also set to true, then converse.js will automatically
+If ``auto_reconnect`` is also set to true, then Converse will automatically
 fetch new credentials from the ``credentials_url`` whenever the connection or
 session drops, and then attempt to reconnect and establish a new session.
 
@@ -552,7 +552,7 @@ csi_waiting_time
 
 This option adds support for `XEP-0352 Client State Indication <http://xmpp.org/extensions/xep-0352.html>_`
 
-If converse.js is idle for the configured amount of seconds, a chat state
+If Converse is idle for the configured amount of seconds, a chat state
 indication of ``inactive`` will be sent out to the XMPP server (if the server
 supports CSI).
 
@@ -597,7 +597,7 @@ default_state
 * Default: ``'online'``
 
 The default chat status that the user wil have. If you for example set this to
-``'chat'``, then converse.js will send out a presence stanza with ``"show"``
+``'chat'``, then Converse will send out a presence stanza with ``"show"``
 set to ``'chat'`` as soon as you've been logged in.
 
 domain_placeholder
@@ -634,7 +634,7 @@ filter_by_resource
 
 * Default:  ``false``
 
-Before version 1.0.3 converse.js would ignore received messages if they were
+Before version 1.0.3 Converse would ignore received messages if they were
 intended for a different resource then the current user had. It was decided to
 drop this restriction but leave it configurable.
 
@@ -649,7 +649,7 @@ bare JID (their Jabber ID independent of any chat clients aka resources).
 This means that sent messages are visible from all the user's chat clients,
 and not just the one from which it was actually sent.
 
-This is especially important for web chat, such as converse.js, where each
+This is especially important for web chat, such as Converse, where each
 browser tab functions as a separate chat client, with its own resource.
 
 This feature uses Stanza forwarding, see also `XEP 0297: Stanza Forwarding <http://www.xmpp.org/extensions/xep-0297.html>`_
@@ -874,7 +874,7 @@ Support for `XEP-0280: Message Carbons <https://xmpp.org/extensions/xep-0280.htm
 In order to keep all IM clients for a user engaged in a conversation,
 outbound messages are carbon-copied to all interested resources.
 
-This is especially important in webchat, like converse.js, where each browser
+This is especially important in webchat, like Converse, where each browser
 tab serves as a separate IM client.
 
 Both message_carbons and `forward_messages`_ try to solve the same problem
@@ -897,7 +897,7 @@ muc_domain
 
 * Default:  ``undefined``
 
-The MUC (multi-user chat) domain that should be used. By default converse.js
+The MUC (multi-user chat) domain that should be used. By default Converse
 will attempt to get the MUC domain from the XMPP host of the currently logged in
 user.
 
@@ -1060,9 +1060,9 @@ See also: :ref:`session-support`
 
 This setting should be used in conjunction with ``authentication`` set to `prebind` and :ref:`keepalive` set to ``true``.
 
-It allows you to specify a URL which converse.js will call when it needs to get
+It allows you to specify a URL which Converse will call when it needs to get
 the RID and SID (Request ID and Session ID) tokens of a BOSH connection, which
-converse.js will then attach to.
+Converse will then attach to.
 
 The server behind ``prebind_url`` should return a JSON encoded object with the
 three tokens::
@@ -1139,7 +1139,7 @@ root
 
 * Default: ``window.document``
 
-When using converse.js inside a web component's shadow DOM, you will need to set this settings'
+When using Converse inside a web component's shadow DOM, you will need to set this settings'
 value to the shadow-root of the shadow DOM.
 
 For example:
@@ -1169,11 +1169,11 @@ roster_groups
 
 * Default:  ``false``
 
-If set to ``true``, converse.js will show any roster groups you might have
+If set to ``true``, Converse will show any roster groups you might have
 configured.
 
 .. note::
-    It's currently not possible to use converse.js to assign contacts to groups.
+    It's currently not possible to use Converse to assign contacts to groups.
     Converse can only show users and groups that were previously configured
     elsewhere.
 
@@ -1256,50 +1256,6 @@ themselves).
 In order to support all browsers we need both an MP3 and an Ogg file. Make sure
 to name your files ``msg_received.ogg`` and ``msg_received.mp3``.
 
-storage
--------
-
-* Default: ``session``
-
-Valid options: ``session``, ``local``.
-
-This option determines the type of `browser storage <https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage>`_
-(``localStorage`` or ``sessionStorage``) used by converse.js to cache user data.
-
-Originally converse.js used only `localStorage`, however `sessionStorage` is from a
-privacy perspective a better choice.
-
-The main difference between the two is that `sessionStorage` only persists while
-the current tab or window containing a converse.js instance is open. As soon as
-it's closed, the data is cleared (as long as there aren't any other tabs with
-the same domain open).
-
-Data in `localStorage` on the other hand is kept indefinitely.
-
-The data that is cached includes your sent and received messages, which chats you had
-open, what features the XMPP server supports and what your online status was.
-
-See also `trusted`_.
-
-.. note::
-    When the user checks the checkbox labeled "This is a trusted device", then
-    the storage setting will automatically be set to localStorage.
-
-
-.. note::
-    Between versions 0.8.0 and 1.0.7, setting the value of this option to "local"
-    is not recommended. The statuses (online, away, busy etc.) of your roster
-    contacts are cached in the browser storage. If you use local storage, these
-    values are stored for multiple sessions, and they will likely become out of
-    sync with your contacts' actual statuses. The session storage doesn't have
-    this problem, because roster contact statuses will not become out of sync in
-    a single session, only across more than one session.
-
-    Since version 1.0.7, the "storage" option doesn't apply anymore to how roster
-    contacts and their statuses are stored (they're now always stored in session
-    storage), to address the above issue.
-
-
 
 sticky_controlbox
 -----------------
@@ -1311,7 +1267,7 @@ contacts and rooms tabs) will not be closeable. It won't have a close button at
 all.
 
 The idea behind this setting is to provide a better experience on mobile
-devices when the intent is to use converse.js as a web app. In this case
+devices when the intent is to use Converse as a web app. In this case
 it doesn't make sense to close the control box, as there's often then nothing
 "behind" it that's relevant to the user.
 
@@ -1350,28 +1306,44 @@ synchronize_availability
 Valid options: ``true``, ``false``, ``a resource name``.
 
 This option lets you synchronize your chat status (`online`, `busy`, `away`) with other chat clients. In other words,
-if you change your status to `busy` in a different chat client, your status will change to `busy` in converse.js as well.
+if you change your status to `busy` in a different chat client, your status will change to `busy` in Converse as well.
 
-If set to ``true``, converse.js will synchronize with all other clients you are logged in with.
+If set to ``true``, Converse will synchronize with all other clients you are logged in with.
 
 If set to ``false``, this feature is disabled.
 
-If set to ``a resource name``, converse.js will synchronize only with a client that has that particular resource assigned to it.
+If set to ``a resource name``, Converse will synchronize only with a client that has that particular resource assigned to it.
 
 trusted
 -------
 
 * Default: ``true``
 
-This setting determines whether the default value of the "This is a trusted device" checkbox in the login form.
+This setting determines whether the default value of the "This is a trusted device"
+checkbox in the login form.
+
+When the current device is not trusted, then the cache will be cleared when
+the user logs out.
+
+Additionally, it determines the type of `browser storage <https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Storage>`_
+(``localStorage`` or ``sessionStorage``) used by Converse to cache user data.
 
-When the current device is not trusted, then localStorage and sessionStorage
-will be cleared when the user logs out, thereby removing all cached data.
+If ``trusted`` is set to ``false``, then ``sessionStorage`` is used instead of
+``localStorage``.
+
+The main difference between the two is that ``sessionStorage`` only persists while
+the current tab or window containing a Converse instance is open. As soon as
+it's closed, the data is cleared (as long as there aren't any other tabs with
+the same domain open).
+
+Data in ``localStorage`` on the other hand is kept indefinitely.
+
+The data that is cached includes your sent and received messages, which chats you had
+open, what features the XMPP server supports and what your online status was.
 
-Clearing the cache in this way makes Converse much slower when the user logs
+Clearing the cache makes Converse much slower when the user logs
 in again, because all data needs to be fetch anew.
 
-See also `storage`_.
 
 time_format
 -----------
@@ -1432,7 +1404,7 @@ websocket_url
 
 This option is used to specify a
 `websocket <https://developer.mozilla.org/en/docs/WebSockets>`_ URI to which
-converse.js can connect to.
+Converse can connect to.
 
 Websockets provide a more modern and effective two-way communication protocol
 between the browser and a server, effectively emulating TCP at the application
@@ -1458,7 +1430,7 @@ view_mode
 * Default: ``overlayed``
 * Allowed values: ``overlayed``, ``fullscreen``, ``mobile``, ``embedded``
 
-The ``view_mode`` setting configures converse.js's mode and resulting behavior.
+The ``view_mode`` setting configures Converse's mode and resulting behavior.
 
 Before the introduction of this setting (in version 3.3.0), there were there
 different builds, each for the different modes.
@@ -1600,7 +1572,7 @@ The query string will be included in the request with ``q`` as its key.
 The data returned must be a JSON encoded list of user JIDs.
 
 .. note::
-    converse.js will construct the XHR get URL by simply appending
+    Converse will construct the XHR get URL by simply appending
     ``q=<query string entered>`` to the URL given by ``xhr_user_search_url``.
     It is therefore important that the necessary question mark (``?``) preceding the
     URL's query component or necessary delimiters (``&``) are included. See valid

+ 6 - 6
spec/login.js

@@ -29,15 +29,15 @@
                 spyOn(cbview.loginpanel, 'connect');
                 cbview.delegateEvents();
 
-                expect(_converse.session.get('storage')).toBe('local');
+                expect(_converse.config.get('storage')).toBe('local');
                 cbview.el.querySelector('input[type="submit"]').click();
-                expect(_converse.session.get('storage')).toBe('local');
+                expect(_converse.config.get('storage')).toBe('local');
                 expect(cbview.loginpanel.connect).toHaveBeenCalled();
 
 
                 checkbox.click();
                 cbview.el.querySelector('input[type="submit"]').click();
-                expect(_converse.session.get('storage')).toBe('session');
+                expect(_converse.config.get('storage')).toBe('session');
                 done();
             });
         }));
@@ -67,14 +67,14 @@
 
                 spyOn(cbview.loginpanel, 'connect');
 
-                expect(_converse.session.get('storage')).toBe('session');
+                expect(_converse.config.get('storage')).toBe('session');
                 cbview.el.querySelector('input[type="submit"]').click();
-                expect(_converse.session.get('storage')).toBe('session');
+                expect(_converse.config.get('storage')).toBe('session');
                 expect(cbview.loginpanel.connect).toHaveBeenCalled();
 
                 checkbox.click();
                 cbview.el.querySelector('input[type="submit"]').click();
-                expect(_converse.session.get('storage')).toBe('local');
+                expect(_converse.config.get('storage')).toBe('local');
                 done();
             });
         }));

+ 2 - 2
src/converse-bookmarks.js

@@ -250,7 +250,7 @@
                     this.on('remove', this.markRoomAsUnbookmarked, this);
                     this.on('remove', this.sendBookmarkStanza, this);
 
-                    const storage = _converse.session.get('storage'),
+                    const storage = _converse.config.get('storage'),
                           cache_key = `converse.room-bookmarks${_converse.bare_jid}`;
                     this.fetched_flag = b64_sha1(cache_key+'fetched');
                     this.browserStorage = new Backbone.BrowserStorage[storage](b64_sha1(cache_key));
@@ -444,7 +444,7 @@
                     _converse.chatboxes.on('add', this.renderBookmarkListElement, this);
                     _converse.chatboxes.on('remove', this.renderBookmarkListElement, this);
 
-                    const storage = _converse.session.get('storage'),
+                    const storage = _converse.config.get('storage'),
                           id = b64_sha1(`converse.room-bookmarks${_converse.bare_jid}-list-model`);
                     this.list_model = new _converse.BookmarksList({'id': id});
                     this.list_model.browserStorage = new Backbone.BrowserStorage[storage](id);

+ 1 - 1
src/converse-chatboxes.js

@@ -258,7 +258,7 @@
                         this.addRelatedContact(_converse.roster.findWhere({'jid': this.get('jid')}));
                     });
                     this.messages = new _converse.Messages();
-                    const storage = _converse.session.get('storage');
+                    const storage = _converse.config.get('storage');
                     this.messages.browserStorage = new Backbone.BrowserStorage[storage](
                         b64_sha1(`converse.messages${this.get('jid')}${_converse.bare_jid}`));
                     this.messages.chatbox = this;

+ 1 - 3
src/converse-chatview.js

@@ -121,8 +121,6 @@
                     'current_category': 'people',
                     'current_skintone': '',
                     'scroll_position': 0
-                },
-                initialize () {
                 }
             });
 
@@ -1056,7 +1054,7 @@
 
                 createEmojiPicker () {
                     if (_.isUndefined(_converse.emojipicker)) {
-                        const storage = _converse.session.get('storage'),
+                        const storage = _converse.config.get('storage'),
                               id = `converse.emoji-${_converse.bare_jid}`;
                         _converse.emojipicker = new _converse.EmojiPicker({'id': id});
                         _converse.emojipicker.browserStorage = new Backbone.BrowserStorage[storage](id);

+ 2 - 2
src/converse-controlbox.js

@@ -466,7 +466,7 @@
                     if (!this.validate()) { return; }
 
                     const form_data = new FormData(ev.target);
-                    _converse.session.save({
+                    _converse.config.save({
                         'trusted': form_data.get('trusted') && true || false,
                         'storage': form_data.get('trusted') ? 'local' : 'session'
                     });
@@ -585,7 +585,7 @@
             });
 
             _converse.on('clearSession', () => {
-                if (_converse.session.get('trusted')) {
+                if (_converse.config.get('trusted')) {
                     const chatboxes = _.get(_converse, 'chatboxes', null);
                     if (!_.isNil(chatboxes)) {
                         const controlbox = chatboxes.get('controlbox');

+ 22 - 6
src/converse-core.js

@@ -341,9 +341,11 @@
             delete _converse.controlboxtoggle;
             delete _converse.chatboxviews;
             _converse.connection.reset();
-            _converse.off();
             _converse.stopListening();
             _converse.tearDown();
+            delete _converse.config;
+            _converse.initClientConfig();
+            _converse.off();
         }
 
         if ('onpagehide' in window) {
@@ -658,20 +660,33 @@
             }
         }
 
-        this.initSession = function () {
-            const id = b64_sha1('converse.bosh-session');
-            _converse.session = new Backbone.Model({
+        this.initClientConfig = function () {
+            /* The client config refers to configuration of the client which is
+             * independent of any particular user.
+             * What this means is that config values need to persist across
+             * user sessions.
+             */
+            const id = b64_sha1('converse.client-config');
+            _converse.config = new Backbone.Model({
                 'id': id,
                 'trusted': _converse.trusted && true || false,
                 'storage': _converse.trusted ? 'local' : 'session'
             });
+            _converse.config.browserStorage = new Backbone.BrowserStorage.session(id);
+            _converse.config.fetch();
+            _converse.emit('clientConfigInitialized');
+        };
+
+        this.initSession = function () {
+            const id = b64_sha1('converse.bosh-session');
+            _converse.session = new Backbone.Model({'id': id});
             _converse.session.browserStorage = new Backbone.BrowserStorage.session(id);
             _converse.session.fetch();
             _converse.emit('sessionInitialized');
         };
 
         this.clearSession = function () {
-            if (!_converse.session.get('trusted')) {
+            if (!_converse.config.get('trusted')) {
                 window.localStorage.clear();
                 window.sessionStorage.clear();
             } else if (!_.isUndefined(this.session) && this.session.browserStorage) {
@@ -805,6 +820,7 @@
              */
             _converse.connection.flush(); // Solves problem of returned PubSub BOSH response not received by browser
             _converse.setUserJID();
+            _converse.initSession();
             _converse.enableCarbons();
             _converse.initStatus(reconnecting)
         };
@@ -1169,7 +1185,7 @@
 
         function finishInitialization () {
             _converse.initPlugins();
-            _converse.initSession();
+            _converse.initClientConfig();
             _converse.initConnection();
             _converse.setUpXMLLogging();
             _converse.logIn();

+ 1 - 1
src/converse-disco.js

@@ -268,7 +268,7 @@
                 }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
             }
 
-            _converse.api.listen.on('setUserJID', initStreamFeatures);
+            _converse.api.listen.on('sessionInitialized', initStreamFeatures);
             _converse.api.listen.on('reconnected', initializeDisco);
             _converse.api.listen.on('connected', initializeDisco);
 

+ 6 - 2
src/converse-minimize.js

@@ -423,12 +423,16 @@
                 },
 
                 initToggle () {
-                    const storage = _converse.session.get('storage'),
+                    const storage = _converse.config.get('storage'),
                           id = b64_sha1(`converse.minchatstoggle${_converse.bare_jid}`);
                     this.toggleview = new _converse.MinimizedChatsToggleView({
                         'model': new _converse.MinimizedChatsToggle({'id': id})
                     });
-                    this.toggleview.model.browserStorage = new Backbone.BrowserStorage[storage](id);
+                    try {
+                        this.toggleview.model.browserStorage = new Backbone.BrowserStorage[storage](id);
+                    } catch (e) {
+                        debugger;
+                    }
                     this.toggleview.model.fetch();
                 },
 

+ 1 - 1
src/converse-muc-views.js

@@ -102,7 +102,7 @@
                     this.roomspanel = new _converse.RoomsPanel({
                         'model': new (_converse.RoomsPanelModel.extend({
                             'id': b64_sha1(`converse.roomspanel${_converse.bare_jid}`), // Required by sessionStorage
-                            'browserStorage': new Backbone.BrowserStorage[_converse.session.get('storage')](
+                            'browserStorage': new Backbone.BrowserStorage[_converse.config.get('storage')](
                                 b64_sha1(`converse.roomspanel${_converse.bare_jid}`))
                         }))()
                     });

+ 2 - 2
src/converse-roomslist.js

@@ -168,7 +168,7 @@
                     this.model.on('add', this.showOrHide, this);
                     this.model.on('remove', this.showOrHide, this);
 
-                    const storage = _converse.session.get('storage'),
+                    const storage = _converse.config.get('storage'),
                           id = b64_sha1(`converse.roomslist${_converse.bare_jid}`);
 
                     this.list_model = new _converse.RoomsList({'id': id});
@@ -262,7 +262,7 @@
             });
 
             const initRoomsListView = function () {
-                const storage = _converse.session.get('storage'),
+                const storage = _converse.config.get('storage'),
                       id = b64_sha1(`converse.open-rooms-{_converse.bare_jid}`),
                       model = new _converse.OpenRooms();
 

+ 1 - 1
src/converse-roster.js

@@ -51,7 +51,7 @@
                 /* Initialize the Bakcbone collections that represent the contats
                  * roster and the roster groups.
                  */
-                const storage = _converse.session.get('storage');
+                const storage = _converse.config.get('storage');
                 _converse.roster = new _converse.RosterContacts();
                 _converse.roster.browserStorage = new Backbone.BrowserStorage[storage](
                     b64_sha1(`converse.contacts-${_converse.bare_jid}`));

+ 2 - 2
src/converse-vcard.js

@@ -132,10 +132,10 @@
             _converse.initVCardCollection = function () {
                 _converse.vcards = new _converse.VCards();
                 const id = b64_sha1(`converse.vcards`);
-                _converse.vcards.browserStorage = new Backbone.BrowserStorage[_converse.session.get('storage')](id);
+                _converse.vcards.browserStorage = new Backbone.BrowserStorage[_converse.config.get('storage')](id);
                 _converse.vcards.fetch();
             }
-            _converse.api.listen.on('setUserJID', _converse.initVCardCollection);
+            _converse.api.listen.on('sessionInitialized', _converse.initVCardCollection);
 
 
             _converse.on('addClientFeatures', () => {

+ 1 - 1
src/templates/login_panel.html

@@ -19,7 +19,7 @@
                 </div>
                 {[ } ]}
                 <div class="form-group form-check">
-                    <input id="converse-login-trusted" type="checkbox" class="form-check-input" name="trusted" {[ if (o._converse.session.get('trusted')) { ]} checked="checked" {[ } ]}>
+                    <input id="converse-login-trusted" type="checkbox" class="form-check-input" name="trusted" {[ if (o._converse.config.get('trusted')) { ]} checked="checked" {[ } ]}>
                     <label for="converse-login-trusted" class="form-check-label">{{{o.__('This is a trusted device')}}}</label>
                     <i class="fa fa-info-circle" data-toggle="popover"
                        data-title="Trusted device?"