summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Machniak <alec@alec.pl>2014-07-23 18:24:49 +0200
committerAleksander Machniak <alec@alec.pl>2014-07-23 18:24:49 +0200
commitb0b9cf00d2d7409569ed27a3388d3b05f2110196 (patch)
tree3f485a81e2c6f44ae012a07d517e13b7301a9dd7
parent83316e175dfb0aa4dde06a975600292be60dd132 (diff)
Fix errors when using localStorage in Safari's private browsing mode (#1489996)
-rw-r--r--CHANGELOG1
-rw-r--r--program/js/app.js67
-rw-r--r--skins/larry/ui.js14
3 files changed, 48 insertions, 34 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 518281b52..125d04591 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -38,6 +38,7 @@ CHANGELOG Roundcube Webmail
- Don't remove links when html signature is converted to text (#1489621)
- Fix mbox files import
- Fix some mime-type to extension mapping checks in Installer (#1489983)
+- Fix errors when using localStorage in Safari's private browsing mode (#1489996)
RELEASE 1.0.2
-------------
diff --git a/program/js/app.js b/program/js/app.js
index 1bf35e412..a48962888 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -3374,9 +3374,7 @@ function rcube_webmail()
}
// check for locally stored compose data
- if (window.localStorage) {
- this.compose_restore_dialog(0, html_mode)
- }
+ this.compose_restore_dialog(0, html_mode)
if (input_to.val() == '')
input_to.focus();
@@ -3900,15 +3898,16 @@ function rcube_webmail()
}
});
- if (window.localStorage && !empty) {
+ if (!empty) {
var index = this.local_storage_get_item('compose.index', []),
key = this.env.compose_id;
- if ($.inArray(key, index) < 0) {
- index.push(key);
- }
- this.local_storage_set_item('compose.' + key, formdata, true);
- this.local_storage_set_item('compose.index', index);
+ if ($.inArray(key, index) < 0) {
+ index.push(key);
+ }
+
+ this.local_storage_set_item('compose.' + key, formdata, true);
+ this.local_storage_set_item('compose.index', index);
}
};
@@ -3940,27 +3939,24 @@ function rcube_webmail()
// remove stored compose data from localStorage
this.remove_compose_data = function(key)
{
- if (window.localStorage) {
- var index = this.local_storage_get_item('compose.index', []);
+ var index = this.local_storage_get_item('compose.index', []);
- if ($.inArray(key, index) >= 0) {
- this.local_storage_remove_item('compose.' + key);
- this.local_storage_set_item('compose.index', $.grep(index, function(val,i) { return val != key; }));
- }
+ if ($.inArray(key, index) >= 0) {
+ this.local_storage_remove_item('compose.' + key);
+ this.local_storage_set_item('compose.index', $.grep(index, function(val,i) { return val != key; }));
}
};
// clear all stored compose data of this user
this.clear_compose_data = function()
{
- if (window.localStorage) {
- var i, index = this.local_storage_get_item('compose.index', []);
+ var i, index = this.local_storage_get_item('compose.index', []);
- for (i=0; i < index.length; i++) {
- this.local_storage_remove_item('compose.' + index[i]);
- }
- this.local_storage_remove_item('compose.index');
+ for (i=0; i < index.length; i++) {
+ this.local_storage_remove_item('compose.' + index[i]);
}
+
+ this.local_storage_remove_item('compose.index');
};
@@ -8030,22 +8026,43 @@ function rcube_webmail()
// wrapper for localStorage.getItem(key)
this.local_storage_get_item = function(key, deflt, encrypted)
{
+ var item;
+
// TODO: add encryption
- var item = localStorage.getItem(this.get_local_storage_prefix() + key);
+ try {
+ item = localStorage.getItem(this.get_local_storage_prefix() + key);
+ }
+ catch (e) { }
+
return item !== null ? JSON.parse(item) : (deflt || null);
};
// wrapper for localStorage.setItem(key, data)
this.local_storage_set_item = function(key, data, encrypted)
{
- // TODO: add encryption
- return localStorage.setItem(this.get_local_storage_prefix() + key, JSON.stringify(data));
+ // try/catch to handle no localStorage support, but also error
+ // in Safari-in-private-browsing-mode where localStorage exists
+ // but can't be used (#1489996)
+ try {
+ // TODO: add encryption
+ localStorage.setItem(this.get_local_storage_prefix() + key, JSON.stringify(data));
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
};
// wrapper for localStorage.removeItem(key)
this.local_storage_remove_item = function(key)
{
- return localStorage.removeItem(this.get_local_storage_prefix() + key);
+ try {
+ localStorage.removeItem(this.get_local_storage_prefix() + key);
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
};
} // end object rcube_webmail
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index ac2d551ae..f6c390929 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -76,7 +76,7 @@ function rcube_mail_ui()
function get_pref(key)
{
if (!prefs) {
- prefs = window.localStorage ? rcmail.local_storage_get_item('prefs.larry', {}) : {};
+ prefs = rcmail.local_storage_get_item('prefs.larry', {});
}
// fall-back to cookies
@@ -85,9 +85,8 @@ function rcube_mail_ui()
if (cookie != null) {
prefs[key] = cookie;
- // copy value to local storage and remove cookie
- if (window.localStorage) {
- rcmail.local_storage_set_item('prefs.larry', prefs);
+ // copy value to local storage and remove cookie (if localStorage is supported)
+ if (rcmail.local_storage_set_item('prefs.larry', prefs)) {
rcmail.set_cookie(key, cookie, new Date()); // expire cookie
}
}
@@ -103,11 +102,8 @@ function rcube_mail_ui()
{
prefs[key] = val;
- // write prefs to local storage
- if (window.localStorage) {
- rcmail.local_storage_set_item('prefs.larry', prefs);
- }
- else {
+ // write prefs to local storage (if supported)
+ if (!rcmail.local_storage_set_item('prefs.larry', prefs)) {
// store value in cookie
var exp = new Date();
exp.setYear(exp.getFullYear() + 1);