Commit 66386d5b authored by JC Brand's avatar JC Brand

Rely on "pagehide" first if it's available.

This is because "pagehide" is fired in more situations and because unload
is not supported on mobile Safari.
parent c47c8bd7
...@@ -675,11 +675,18 @@ ...@@ -675,11 +675,18 @@
}; };
this.initSession = function () { this.initSession = function () {
this.session = new this.Session(); this.session = new this.BOSHSession();
var id = b64_sha1('converse.bosh-session'); var id = b64_sha1('converse.bosh-session');
this.session.id = id; // Appears to be necessary for backbone.browserStorage this.session.id = id; // Appears to be necessary for backbone.browserStorage
this.session.browserStorage = new Backbone.BrowserStorage[converse.storage](id); this.session.browserStorage = new Backbone.BrowserStorage[converse.storage](id);
this.session.fetch(); this.session.fetch();
$(window).on(unloadevent, $.proxy(function () {
if (converse.connection.authenticated) {
this.setSession();
} else {
this.clearSession();
}
}, this));
}; };
this.clearSession = function () { this.clearSession = function () {
...@@ -692,6 +699,16 @@ ...@@ -692,6 +699,16 @@
} }
}; };
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 () { this.logOut = function () {
converse.chatboxviews.closeAllChatBoxes(false); converse.chatboxviews.closeAllChatBoxes(false);
converse.clearSession(); converse.clearSession();
...@@ -834,6 +851,7 @@ ...@@ -834,6 +851,7 @@
// know whether these boxes are of the same account or not, so we // know whether these boxes are of the same account or not, so we
// close them now. // close them now.
this.chatboxviews.closeAllChatBoxes(); this.chatboxviews.closeAllChatBoxes();
this.setSession();
this.jid = this.connection.jid; this.jid = this.connection.jid;
this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid); this.bare_jid = Strophe.getBareJidFromJid(this.connection.jid);
this.domain = Strophe.getDomainFromJid(this.connection.jid); this.domain = Strophe.getDomainFromJid(this.connection.jid);
...@@ -4997,7 +5015,7 @@ ...@@ -4997,7 +5015,7 @@
} }
}); });
this.Session = Backbone.Model; // General session settings to be saved to sessionStorage. this.BOSHSession = Backbone.Model;
this.Feature = Backbone.Model; this.Feature = Backbone.Model;
this.Features = Backbone.Collection.extend({ this.Features = Backbone.Collection.extend({
/* Service Discovery /* Service Discovery
...@@ -5666,6 +5684,7 @@ ...@@ -5666,6 +5684,7 @@
url: this.prebind_url, url: this.prebind_url,
type: 'GET', type: 'GET',
success: function (response) { success: function (response) {
this.session.save({rid: response.rid});
this.connection.attach( this.connection.attach(
response.jid, response.jid,
response.sid, response.sid,
...@@ -5683,14 +5702,14 @@ ...@@ -5683,14 +5702,14 @@
this.attemptPreboundSession = function (tokens) { this.attemptPreboundSession = function (tokens) {
/* Handle session resumption or initialization when prebind is being used. /* 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.keepalive) {
if (!this.jid) { if (!this.jid) {
throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user."); throw new Error("initConnection: when using 'keepalive' with 'prebind, you must supply the JID of the current user.");
} }
try { if (rid && sid && jid && Strophe.getBareJidFromJid(jid) === Strophe.getBareJidFromJid(this.jid)) {
return this.connection.restore(this.jid, this.onConnectStatusChanged); this.session.save({rid: rid}); // The RID needs to be increased with each request.
} catch (e) { return this.connection.attach(jid, sid, rid, this.onConnectStatusChanged);
converse.log("Could not restore session for jid: "+this.jid+" Error message: "+e.message);
} }
} else { // Not keepalive } else { // Not keepalive
if (this.jid && this.sid && this.rid) { if (this.jid && this.sid && this.rid) {
...@@ -5711,19 +5730,17 @@ ...@@ -5711,19 +5730,17 @@
} }
}; };
this.attemptNonPreboundSession = function () { this.attemptNonPreboundSession = function (tokens) {
/* Handle session resumption or initialization when prebind is not being used. /* Handle session resumption or initialization when prebind is not being used.
* *
* Two potential options exist and are handled in this method: * Two potential options exist and are handled in this method:
* 1. keepalive * 1. keepalive
* 2. auto_login * 2. auto_login
*/ */
if (this.keepalive) { var rid = tokens.rid, jid = tokens.jid, sid = tokens.sid;
try { if (this.keepalive && rid && sid && jid) {
return this.connection.restore(null, this.onConnectStatusChanged); this.session.save({rid: rid}); // The RID needs to be increased with each request.
} catch (e) { this.connection.attach(jid, sid, rid, this.onConnectStatusChanged);
converse.log("Could not restore sessions. Error message: "+e.message);
}
} else if (this.auto_login) { } else if (this.auto_login) {
if (!this.jid) { if (!this.jid) {
throw new Error("initConnection: If you use auto_login, you also need to provide a jid value"); throw new Error("initConnection: If you use auto_login, you also need to provide a jid value");
...@@ -5741,6 +5758,7 @@ ...@@ -5741,6 +5758,7 @@
}; };
this.initConnection = function () { this.initConnection = function () {
var tokens = {};
if (this.connection && this.connection.connected) { if (this.connection && this.connection.connected) {
this.setUpXMLLogging(); this.setUpXMLLogging();
this.onConnected(); this.onConnected();
...@@ -5749,19 +5767,24 @@ ...@@ -5749,19 +5767,24 @@
throw new Error("initConnection: you must supply a value for either the bosh_service_url or websocket_url or both."); 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) { if (('WebSocket' in window || 'MozWebSocket' in window) && this.websocket_url) {
this.connection = new Strophe.Connection(this.websocket_url, {'keepalive': this.keepalive}); this.connection = new Strophe.Connection(this.websocket_url);
} else if (this.bosh_service_url) { } else if (this.bosh_service_url) {
this.connection = new Strophe.Connection(this.bosh_service_url, {'keepalive': this.keepalive}); this.connection = new Strophe.Connection(this.bosh_service_url);
} else { } else {
throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified."); throw new Error("initConnection: this browser does not support websockets and bosh_service_url wasn't specified.");
} }
this.setUpXMLLogging(); 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. // We now try to resume or automatically set up a new session.
// Otherwise the user will be shown a login form. // Otherwise the user will be shown a login form.
if (this.authentication === PREBIND) { if (this.authentication === PREBIND) {
this.attemptPreboundSession(); this.attemptPreboundSession(tokens);
} else { } else {
this.attemptNonPreboundSession(); this.attemptNonPreboundSession(tokens);
} }
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment