nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

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:
Msrc/lib/leaflet.control.coordinates/index.js | 14+++++---------
Msrc/lib/leaflet.control.layers.configure/index.js | 25++++++++++---------------
Msrc/lib/leaflet.control.track-list/track-list.localstorage.js | 29++++++++++++-----------------
Msrc/lib/leaflet.layer.nordeskart/index.js | 13+++++--------
Asrc/lib/safe-localstorage/index.js | 43+++++++++++++++++++++++++++++++++++++++++++
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