Browse Source

Use "strict" mode again and fix styling.

We "use strict" outside of the function that gives issues on Safari.
JC Brand 10 years ago
parent
commit
c47c8bd7eb
1 changed files with 45 additions and 62 deletions
  1. 45 62
      converse.js

+ 45 - 62
converse.js

@@ -140,16 +140,19 @@
     };
 
     converse.initialize = function (settings, callback) {
+        "use strict";
         var converse = this;
         var unloadevent;
-        if ('onbeforeunload' in window) {
+        if ('onpagehide' in window) {
+            // Pagehide gets thrown in more cases than unload. Specifically it
+            // gets thrown when the page is cached and not just
+            // closed/destroyed. It's the only viable event on mobile Safari.
+            // https://www.webkit.org/blog/516/webkit-page-cache-ii-the-unload-event/
+            unloadevent = 'pagehide';
+        } else if ('onbeforeunload' in window) {
             unloadevent = 'beforeunload';
         } else if ('onunload' in window) {
             unloadevent = 'unload';
-        } else if ('onpagehide' in window) {
-            // Mobile Safari (at least older versions) doesn't support unload or beforeunload.
-            // Apple recommends "pagehide" instead.
-            unloadevent = 'pagehide';
         }
 
         // Logging
@@ -240,32 +243,35 @@
         // Translation machinery
         // ---------------------
         this.isAvailableLocale = function (locale) {
-            ret = null;
             if (locales[locale]) {
-                ret = locales[locale];
-            } else{
-                sublocale=locale.split("-")[0];
-                if (sublocale!=locale && locales[sublocale]) {
-                    ret=locales[sublocale];
+                return locales[locale];
+            } else {
+                var sublocale = locale.split("-")[0];
+                if (sublocale != locale && locales[sublocale]) {
+                    return locales[sublocale];
                 }
             }
-            return ret;
+            return null;
         };
 		
         this.detectLocale = function () {
-            ret = null;
+            var ret, i;
             if (window.navigator.userLanguage) {
-                ret = this.isAvailableLocale(window.navigator.userLanguage);
-            } else if (window.navigator.languages && !ret) {
-                for (var i = 0; i < window.navigator.languages.length && !ret; i++) {
+                return this.isAvailableLocale(window.navigator.userLanguage);
+            } else if (window.navigator.languages) {
+                for (i=0; i < window.navigator.languages.length && !ret; i++) {
                     ret = this.isAvailableLocale(window.navigator.languages[i]);
                 }
+                return ret || locales.en;
+            } else if (window.navigator.browserLanguage) {
+                return this.isAvailableLocale(window.navigator.browserLanguage);
+            } else if (window.navigator.language) {
+                return this.isAvailableLocale(window.navigator.language);
+            } else if (window.navigator.systemLanguage) {
+                return this.isAvailableLocale(window.navigator.systemLanguage);
+            } else {
+                return locales.en;
             }
-            else if (window.navigator.browserLanguage && !ret) ret = this.isAvailableLocale(window.navigator.browserLanguage);
-            else if (window.navigator.language && !ret) ret = this.isAvailableLocale(window.navigator.language);
-            else if (window.navigator.systemLanguage && !ret) ret = this.isAvailableLocale(window.navigator.systemLanguage);
-            else { ret = locales.en; }
-            return ret;
         };
         this.i18n = settings.i18n ? settings.i18n : this.detectLocale();
 
@@ -669,18 +675,11 @@
         };
 
         this.initSession = function () {
-            this.session = new this.BOSHSession();
+            this.session = new this.Session();
             var id = b64_sha1('converse.bosh-session');
             this.session.id = id; // Appears to be necessary for backbone.browserStorage
             this.session.browserStorage = new Backbone.BrowserStorage[converse.storage](id);
             this.session.fetch();
-            $(window).on(unloadevent, $.proxy(function () {
-                if (converse.connection.authenticated) {
-                    this.setSession();
-                } else {
-                    this.clearSession();
-                }
-            }, this));
         };
 
         this.clearSession = function () {
@@ -693,16 +692,6 @@
             }
         };
 
-        this.setSession = function () {
-            if (this.keepalive) {
-                this.session.save({
-                    jid: this.connection.jid,
-                    rid: this.connection._proto.rid,
-                    sid: this.connection._proto.sid
-                });
-            }
-        };
-
         this.logOut = function () {
             converse.chatboxviews.closeAllChatBoxes(false);
             converse.clearSession();
@@ -791,7 +780,7 @@
                     return true;
                 }.bind(converse));
                 this.connection.addTimedHandler(1000, function () {
-                    now = new Date();
+                    var now = new Date();
                     if (!this.lastStanzaDate) {
                         this.lastStanzaDate = now;
                     }
@@ -845,7 +834,6 @@
             // know whether these boxes are of the same account or not, so we
             // close them now.
             this.chatboxviews.closeAllChatBoxes();
-            this.setSession();
             this.jid = this.connection.jid;
             this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
             this.domain = Strophe.getDomainFromJid(this.connection.jid);
@@ -5009,7 +4997,7 @@
             }
         });
 
-        this.BOSHSession = Backbone.Model;
+        this.Session = Backbone.Model; // General session settings to be saved to sessionStorage.
         this.Feature = Backbone.Model;
         this.Features = Backbone.Collection.extend({
             /* Service Discovery
@@ -5678,7 +5666,6 @@
                 url:  this.prebind_url,
                 type: 'GET',
                 success: function (response) {
-                    this.session.save({rid: response.rid});
                     this.connection.attach(
                             response.jid,
                             response.sid,
@@ -5696,14 +5683,14 @@
         this.attemptPreboundSession = function (tokens) {
             /* Handle session resumption or initialization when prebind is being used.
              */
-            var rid = tokens.rid, jid = tokens.jid, sid = tokens.sid;
             if (this.keepalive) {
                 if (!this.jid) {
                     throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");
                 }
-                if (rid && sid && jid && Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(this.jid)) {
-                    this.session.save({rid: rid}); // The RID needs to be increased with each request.
-                    return this.connection.attach(jid, sid, rid, this.onConnectStatusChanged);
+                try {
+                    return this.connection.restore(this.jid, this.onConnectStatusChanged);
+                } catch (e) {
+                    converse.log("Could not restore session for jid: "+this.jid+" Error message: "+e.message);
                 }
             } else { // Not keepalive
                 if (this.jid && this.sid && this.rid) {
@@ -5724,17 +5711,19 @@
             }
         };
 
-        this.attemptNonPreboundSession = function (tokens) {
+        this.attemptNonPreboundSession = function () {
             /* Handle session resumption or initialization when prebind is not being used.
              *
              * Two potential options exist and are handled in this method:
              *  1. keepalive
              *  2. auto_login
              */
-            var rid = tokens.rid, jid = tokens.jid, sid = tokens.sid;
-            if (this.keepalive && rid && sid && jid) {
-                this.session.save({rid: rid}); // The RID needs to be increased with each request.
-                this.connection.attach(jid, sid, rid, this.onConnectStatusChanged);
+            if (this.keepalive) {
+                try {
+                    return this.connection.restore(null, this.onConnectStatusChanged);
+                } catch (e) {
+                    converse.log("Could not restore sessions. Error message: "+e.message);
+                }
             } else if (this.auto_login) {
                 if (!this.jid) {
                     throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");
@@ -5752,7 +5741,6 @@
         };
 
         this.initConnection = function () {
-            var tokens = {};
             if (this.connection && this.connection.connected) {
                 this.setUpXMLLogging();
                 this.onConnected();
@@ -5761,24 +5749,19 @@
                     throw new Error("initConnection: you must supply a value for either the bosh_service_url or websocket_url or both.");
                 }
                 if (('WebSocket' in window || 'MozWebSocket' in window) && this.websocket_url) {
-                    this.connection = new Strophe.Connection(this.websocket_url);
+                    this.connection = new Strophe.Connection(this.websocket_url, {'keepalive': this.keepalive});
                 } else if (this.bosh_service_url) {
-                    this.connection = new Strophe.Connection(this.bosh_service_url);
+                    this.connection = new Strophe.Connection(this.bosh_service_url, {'keepalive': this.keepalive});
                 } else {
                     throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified.");
                 }
                 this.setUpXMLLogging();
-                if (this.keepalive) {
-                    tokens.rid = this.session.get('rid');
-                    tokens.sid = this.session.get('sid');
-                    tokens.jid = this.session.get('jid');
-                }
                 // We now try to resume or automatically set up a new session.
                 // Otherwise the user will be shown a login form.
                 if (this.authentication === PREBIND) {
-                    this.attemptPreboundSession(tokens);
+                    this.attemptPreboundSession();
                 } else {
-                    this.attemptNonPreboundSession(tokens);
+                    this.attemptNonPreboundSession();
                 }
             }
         };