|
15 | 15 | pzpr.on("load", function boot() { |
16 | 16 | var pzl; |
17 | 17 | // Get URL search hash and check localStorage to see if a board state is saved |
18 | | - if (!localStorageAvailable()) { |
| 18 | + if (!pzpr.env.localStorageAvailable) { |
19 | 19 | pzl = importData(); |
20 | 20 | } else { |
21 | 21 | var key = "pzpr_" + getPuzzleString(); |
22 | | - var puzzleStr = localStorage.getItem(key); |
23 | | - if (!puzzleStr) { |
| 22 | + var valStr = localStorage.getItem(key); |
| 23 | + if (!valStr) { |
24 | 24 | pzl = importData(); |
25 | 25 | } else { |
26 | | - pzl = importData(puzzleStr); // Local storage was available and key was found |
| 26 | + var valObject = JSON.parse(valStr) |
| 27 | + pzl = importData(valObject.pzl); // Local storage was available and key was found |
27 | 28 | } |
28 | 29 | } |
29 | 30 | if (!pzl) { |
|
145 | 146 | // Functionality to support browser caching |
146 | 147 | //--------------------------------------------------------------------------- |
147 | 148 |
|
148 | | - //Taken directly from stackoverflow. Apparently this is the most broadly compatible version. https://stackoverflow.com/questions/16427636/check-if-localstorage-is-available |
149 | | - function localStorageAvailable() { |
150 | | - var test = "test"; |
151 | | - try { |
152 | | - localStorage.setItem(test, test); |
153 | | - localStorage.removeItem(test); |
154 | | - return true; |
155 | | - } catch (e) { |
156 | | - return false; |
157 | | - } |
158 | | - } |
159 | | - |
160 | 149 | //Save board state. Creates an entry in localStorage whose key is a 'pzpr_' identifier plus the current board state puzzle string. |
161 | 150 | //Board state puzzle string is the same thing you get from duplicating the board state |
162 | 151 | function saveBoardState() { |
|
170 | 159 | while (url.match(/^(\w+)\=(\w+)\&(.*)/)) { |
171 | 160 | url = RegExp.$3; |
172 | 161 | } |
| 162 | + //Add a time signifier so that we can sort and delete oldest if setting fails |
| 163 | + var valObject = { |
| 164 | + t: Date.now(), |
| 165 | + pzl: url |
| 166 | + // bufferToForceStorageLimitErrors: "0".repeat(1700000) //Include for testing to force out-of-storage errors |
| 167 | + } |
173 | 168 | try { |
174 | | - localStorage.setItem(key, url); |
| 169 | + localStorage.setItem(key, JSON.stringify(valObject)); |
175 | 170 | } catch (e) { |
176 | | - console.log(e); |
| 171 | + if (e.name === "QuotaExceededError") { |
| 172 | + //If storage was full: load all of the puzzles in localStorage, sort by least recent, and delete until saving is successful |
| 173 | + var saveSuccess = false |
| 174 | + var pairs = [] |
| 175 | + for (var i = 0; i < localStorage.length; i++) { |
| 176 | + var lsKey = localStorage.key(i) |
| 177 | + var lsValue = localStorage.getItem(lsKey) |
| 178 | + pairs.push({key: lsKey, value: lsValue}) |
| 179 | + } |
| 180 | + pairs = pairs.filter(function(item) { |
| 181 | + return item.key.indexOf("pzpr_") === 0 |
| 182 | + }) |
| 183 | + pairs = pairs.sort(function(a,b) { |
| 184 | + var ta = JSON.parse(a.value).t |
| 185 | + var tb = JSON.parse(b.value).t |
| 186 | + return ta > tb |
| 187 | + }) |
| 188 | + while (!saveSuccess && pairs.length > 0) { |
| 189 | + console.log(pairs) |
| 190 | + try { |
| 191 | + localStorage.setItem(key, JSON.stringify(valObject)); |
| 192 | + saveSuccess = true |
| 193 | + } catch (e) { |
| 194 | + localStorage.removeItem(pairs[0].key) |
| 195 | + pairs = pairs.slice(1) |
| 196 | + } |
| 197 | + } |
| 198 | + } |
177 | 199 | } |
178 | 200 | } |
179 | 201 |
|
|
0 commit comments