From: Vincent Vanwaelscappel Date: Wed, 3 Jun 2015 09:32:15 +0000 (+0000) Subject: Add storage polyfill X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=5fd2d22827363f6b4c0c3f01254262673f45e2a9;p=fluidbook-html5.git Add storage polyfill --- diff --git a/js/libs/storage.js b/js/libs/storage.js new file mode 100644 index 00000000..50f6b0f2 --- /dev/null +++ b/js/libs/storage.js @@ -0,0 +1,125 @@ +/** + * Created by Vincent on 03/06/2015. + */ +try { + // Test webstorage existence. + if (!window.localStorage || !window.sessionStorage) throw "exception"; + // Test webstorage accessibility - Needed for Safari private browsing. + localStorage.setItem('storage_test', 1); + localStorage.removeItem('storage_test'); +} catch (e) { + (function () { + var Storage = function (type) { + function createCookie(name, value, days) { + var date, expires; + + if (days) { + date = new Date(); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); + expires = "; expires=" + date.toGMTString(); + } else { + expires = ""; + } + document.cookie = name + "=" + value + expires + "; path=/"; + } + + function readCookie(name) { + var nameEQ = name + "=", + ca = document.cookie.split(';'), + i, c; + + for (i = 0; i < ca.length; i++) { + c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1, c.length); + 2480 + } + + if (c.indexOf(nameEQ) == 0) { + return c.substring(nameEQ.length, c.length); + } + } + return null; + } + + function setData(data) { + // Convert data into JSON and encode to accommodate for special characters. + data = encodeURIComponent(JSON.stringify(data)); + // Create cookie. + if (type == 'session') { + createCookie(getSessionName(), data, 365); + } else { + createCookie('localStorage', data, 365); + } + } + + function clearData() { + if (type == 'session') { + createCookie(getSessionName(), '', 365); + } else { + createCookie('localStorage', '', 365); + } + } + + function getData() { + // Get cookie data. + var data = type == 'session' ? readCookie(getSessionName()) : readCookie('localStorage'); + // If we have some data decode, parse and return it. + return data ? JSON.parse(decodeURIComponent(data)) : {}; + } + + function getSessionName() { + // If there is no name for this window, set one. + // To ensure it's unquie use the current timestamp. + if (!window.name) { + window.name = new Date().getTime(); + } + return 'sessionStorage' + window.name; + } + + // Initialise if there's already data. + var data = getData(); + + return { + length: 0, + clear: function () { + data = {}; + this.length = 0; + clearData(); + }, + getItem: function (key) { + return data[key] === undefined ? null : data[key]; + }, + key: function (i) { + // not perfect, but works + var ctr = 0; + for (var k in data) { + if (ctr == i) return k; + else ctr++; + } + return null; + }, + removeItem: function (key) { + delete data[key]; + this.length--; + setData(data); + }, + setItem: function (key, value) { + data[key] = value + ''; // forces the value to a string + this.length++; + setData(data); + } + }; + }; + + // Replace window.localStorage and window.sessionStorage with out custom + // implementation. + var localStorage = new Storage('local'); + var sessionStorage = new Storage('session'); + window.localStorage = localStorage; + window.sessionStorage = sessionStorage; + // For Safari private browsing need to also set the proto value. + window.localStorage.__proto__ = localStorage; + window.sessionStorage.__proto__ = sessionStorage; + })(); +}