commit ad9f3cc6a210828c3f36f33369427b5f2a7da166
parent dd4786b4779ef598b5ec4eb2ff3d5b98ba9114f0
Author: Sergej Orlov <wladimirych@gmail.com>
Date: Fri, 10 Mar 2017 18:02:57 +0300
new module for working with localstorage, which provides dummy sessionStorage-like object when localStorage is not available
Diffstat:
5 files changed, 75 insertions(+), 49 deletions(-)
diff --git a/src/lib/leaflet.control.coordinates/index.js b/src/lib/leaflet.control.coordinates/index.js
@@ -3,6 +3,7 @@ import './coordinates.css';
import copyToClipboard from 'lib/clipboardCopy';
import Contextmenu from 'lib/contextmenu';
import 'lib/leaflet.control.commons';
+import safeLocalStorage from 'lib/safe-localstorage';
function pad(s, n) {
var j = s.indexOf('.');
@@ -51,20 +52,15 @@ L.Control.Coordinates = L.Control.extend({
loadStateFromStorage: function() {
var active = false,
fmt = 'D';
- if (window.Storage && window.localStorage) {
- active = localStorage.leafletCoordinatesActive === '1';
- fmt = localStorage.leafletCoordinatesFmt || fmt;
- }
+ active = safeLocalStorage.leafletCoordinatesActive === '1';
+ fmt = safeLocalStorage.leafletCoordinatesFmt || fmt;
this.setEnabled(active);
this.setFormat(fmt);
},
saveStateToStorage: function() {
- if (!(window.Storage && window.localStorage)) {
- return;
- }
- localStorage.leafletCoordinatesActive = this.isEnabled() ? '1' : '0';
- localStorage.leafletCoordinatesFmt = this.fmt;
+ safeLocalStorage.leafletCoordinatesActive = this.isEnabled() ? '1' : '0';
+ safeLocalStorage.leafletCoordinatesFmt = this.fmt;
},
formatCoodinate: function(value, isLat) {
diff --git a/src/lib/leaflet.control.layers.configure/index.js b/src/lib/leaflet.control.layers.configure/index.js
@@ -4,7 +4,7 @@ import enableTopRow from 'lib/leaflet.control.layers.top-row';
import ko from 'vendored/knockout';
import {notify} from 'lib/notifications';
import logging from 'lib/logging';
-
+import safeLocalStorage from 'lib/safe-localstorage';
function enableConfig(control, layers) {
const originalOnAdd = control.onAdd;
@@ -41,16 +41,14 @@ function enableConfig(control, layers) {
_initializeLayersState: function() {
let storedLayersEnabled = {};
- if (window.localStorage) {
- const serialized = window.localStorage.getItem('layersEnabled');
- if (serialized) {
- try {
- storedLayersEnabled = JSON.parse(serialized);
- } catch (e) {
- logging.captureMessage('Failed to load enabled layers from localstorage - invalid json',{
- extra: {"localstorage.layersEnabled": serialized.slice(0, 1000)}
- })
- }
+ const serialized = safeLocalStorage.getItem('layersEnabled');
+ if (serialized) {
+ try {
+ storedLayersEnabled = JSON.parse(serialized);
+ } catch (e) {
+ logging.captureMessage('Failed to load enabled layers from localstorage - invalid json',{
+ extra: {"localstorage.layersEnabled": serialized.slice(0, 1000)}
+ })
}
}
// restore custom layers
@@ -199,9 +197,6 @@ function enableConfig(control, layers) {
},
storeEnabledLayers: function() {
- if (!window.localStorage) {
- return;
- }
const layersState = {};
for (let layer of [...this._allLayers, ...this._customLayers()]) {
if (layer.isDefault || layer.enabled || layer.isCustom) {
@@ -209,7 +204,7 @@ function enableConfig(control, layers) {
}
}
const serialized = JSON.stringify(layersState);
- localStorage.setItem('layersEnabled', serialized);
+ safeLocalStorage.setItem('layersEnabled', serialized);
},
unserializeState: function(values) {
diff --git a/src/lib/leaflet.control.track-list/track-list.localstorage.js b/src/lib/leaflet.control.track-list/track-list.localstorage.js
@@ -1,21 +1,19 @@
import './track-list'
import L from 'leaflet';
import {parseGeoFile} from './lib/geo_file_formats';
+import safeLocalStorage from 'lib/safe-localstorage';
L.Control.TrackList.include({
maxLocalStorageSessions: 5,
saveTracksToStorage: function() {
- if (!(window.localStorage)) {
- return;
- }
var tracks = this.tracks(),
serialized = [],
maxKey = -1,
i, track, s, key, m, keys = [];
- for (i = 0; i < localStorage.length; i++) {
- key = localStorage.key(i);
+ for (i = 0; i < safeLocalStorage.length; i++) {
+ key = safeLocalStorage.key(i);
m = key.match(/^trackList_(\d+)$/);
if (m && m[1] !== undefined) {
if (+m[1] > maxKey) {
@@ -26,7 +24,7 @@ L.Control.TrackList.include({
key = 'trackList_' + (maxKey + 1);
if (tracks.length === 0) {
- localStorage.setItem(key, '');
+ safeLocalStorage.setItem(key, '');
return;
}
for (i = 0; i < tracks.length; i++) {
@@ -39,11 +37,11 @@ L.Control.TrackList.include({
}
s = '#nktk=' + serialized.join('/');
- localStorage.setItem(key, s);
+ safeLocalStorage.setItem(key, s);
//cleanup stale records
- for (i = 0; i < localStorage.length; i++) {
- key = localStorage.key(i);
+ for (i = 0; i < safeLocalStorage.length; i++) {
+ key = safeLocalStorage.key(i);
m = key.match(/^trackList_(\d+)$/);
if (m && m[1] !== undefined) {
keys.push(+m[1]);
@@ -56,21 +54,18 @@ L.Control.TrackList.include({
);
for (i = 0; i < keys.length - this.maxLocalStorageSessions; i++) {
key = 'trackList_' + keys[i];
- localStorage.removeItem(key);
+ safeLocalStorage.removeItem(key);
}
}
},
loadTracksFromStorage: function() {
- if (!(window.localStorage)) {
- return;
- }
var i, key, m, s,
geodata,
maxKey = -1;
- for (i = 0; i < localStorage.length; i++) {
- key = localStorage.key(i);
+ for (i = 0; i < safeLocalStorage.length; i++) {
+ key = safeLocalStorage.key(i);
m = key.match(/^trackList_(\d+)$/);
if (m && m[1] !== undefined) {
if (+m[1] > maxKey) {
@@ -80,8 +75,8 @@ L.Control.TrackList.include({
}
if (maxKey > -1) {
key = 'trackList_' + maxKey;
- s = localStorage.getItem(key);
- localStorage.removeItem(key);
+ s = safeLocalStorage.getItem(key);
+ safeLocalStorage.removeItem(key);
if (s) {
geodata = parseGeoFile('', s);
this.addTracksFromGeodataArray(geodata);
diff --git a/src/lib/leaflet.layer.nordeskart/index.js b/src/lib/leaflet.layer.nordeskart/index.js
@@ -2,6 +2,7 @@ import L from 'leaflet';
import {fetch} from 'lib/xhr-promise';
import {notify} from 'lib/notifications';
import logging from 'lib/logging';
+import safeLocalStorage from 'lib/safe-localstorage';
function parseResponse(s) {
let data;
@@ -43,17 +44,13 @@ L.TileLayer.Nordeskart = L.TileLayer.extend({
baatTokenUpToDate: function() {
let nextUpdate = 0;
- if (window.localStorage) {
- nextUpdate = parseInt(localStorage.getItem('baatTokenNextUpdate'), 10) || 0;
- }
- return Date.now() < nextUpdate && localStorage.getItem('baatToken');
+ nextUpdate = parseInt(safeLocalStorage.getItem('baatTokenNextUpdate'), 10) || 0;
+ return Date.now() < nextUpdate && safeLocalStorage.getItem('baatToken');
},
storeBaatToken: function(token) {
- if (window.localStorage) {
- localStorage.setItem('baatToken', token);
- localStorage.setItem('baatTokenNextUpdate', Date.now().toString() + this.options.tokenUpdateInterval);
- }
+ safeLocalStorage.setItem('baatToken', token);
+ safeLocalStorage.setItem('baatTokenNextUpdate', Date.now().toString() + this.options.tokenUpdateInterval);
},
periodicTokenUpdate: function() {
diff --git a/src/lib/safe-localstorage/index.js b/src/lib/safe-localstorage/index.js
@@ -0,0 +1,42 @@
+function localStorageWorks() {
+ try {
+ window.localStorage.setItem('_testDummy', 'TEST');
+ return window.localStorage.getItem('_testDummy') === 'TEST';
+ } catch (e) {
+ return false;
+ }
+}
+
+
+let storage;
+
+if (localStorageWorks()) {
+ storage = window.localStorage;
+} else {
+ let _storage = {};
+ storage = {
+ length: 0,
+
+ key: function(n) {
+ return Object.keys(_storage)[n];
+ },
+
+ removeItem: function(key) {
+ delete _storage[key];
+ },
+
+ getItem: function(key) {
+ return storage[key];
+ },
+
+ setItem: function(key, value) {
+ storage[key] = value;
+ },
+
+ clear: function() {
+ _storage = {};
+ }
+ }
+}
+
+export default storage;
+\ No newline at end of file