]> _ Git - fluidbook-html5.git/commitdiff
Add storage polyfill
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 3 Jun 2015 09:32:15 +0000 (09:32 +0000)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Wed, 3 Jun 2015 09:32:15 +0000 (09:32 +0000)
js/libs/storage.js [new file with mode: 0644]

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