|
38 | 38 | } |
39 | 39 |
|
40 | 40 | CrossStorageHub._permissions = permissions || []; |
41 | | - CrossStorageHub._eventListeners = {}; |
| 41 | + CrossStorageHub._storageListeners = {}; |
42 | 42 | CrossStorageHub._installListener(); |
43 | 43 | window.parent.postMessage('cross-storage:ready', '*'); |
44 | 44 | }; |
|
121 | 121 | /** |
122 | 122 | * Returns a boolean indicating whether or not the requested method is |
123 | 123 | * permitted for the given origin. The argument passed to method is expected |
124 | | - * to be one of 'get', 'set', 'del', 'clear', 'listen' or 'getKeys'. |
| 124 | + * to be one of 'get', 'set', 'del', 'clear', 'getKeys', 'listen', or |
| 125 | + * 'unlisten'. |
125 | 126 | * |
126 | 127 | * @param {string} origin The origin for which to determine permissions |
127 | 128 | * @param {string} method Requested action |
128 | 129 | * @returns {bool} Whether or not the request is permitted |
129 | 130 | */ |
130 | 131 | CrossStorageHub._permitted = function(origin, method) { |
131 | 132 | var available, i, entry, match; |
132 | | - if (method==='unlisten') method = 'listen'; |
133 | | - available = ['get', 'set', 'listen', 'del', 'clear', 'getKeys']; |
| 133 | + available = ['get', 'set', 'listen', 'del', 'clear', 'getKeys', 'listen']; |
| 134 | + |
| 135 | + if (method === 'unlisten') { |
| 136 | + method = 'listen'; |
| 137 | + } |
| 138 | + |
134 | 139 | if (!CrossStorageHub._inArray(method, available)) { |
135 | 140 | return false; |
136 | 141 | } |
|
187 | 192 | }; |
188 | 193 |
|
189 | 194 | /** |
190 | | - * Adds an event listener to `storage` events which sends all events to the client with the given eventKey |
| 195 | + * Listens to storage events, sending them to the client. |
191 | 196 | * |
192 | | - * @param {object} params An object with an eventKey |
| 197 | + * @param {object} params An object with a listener id |
193 | 198 | */ |
194 | 199 | CrossStorageHub._listen = function(params) { |
195 | | - if (params.eventKey in CrossStorageHub._eventListeners) { |
196 | | - throw new Error("Can't reuse eventKeys") |
| 200 | + if (params.listenerId in CrossStorageHub._storageListeners) { |
| 201 | + return; |
197 | 202 | } |
| 203 | + |
198 | 204 | var handler = function(event) { |
199 | | - if (event.storageArea != window.localStorage) return; |
| 205 | + if (event.storageArea !== window.localStorage) return; |
| 206 | + |
200 | 207 | var data = { |
201 | | - type: 'event', |
202 | | - eventKey: params.eventKey, |
203 | | - eventData: { |
| 208 | + listenerId: params.listenerId, |
| 209 | + event: { |
204 | 210 | key: event.key, |
205 | 211 | newValue: event.newValue, |
206 | 212 | oldValue: event.oldValue, |
207 | 213 | url: event.url |
208 | | - // storageArea, ignored because we only use localStorage |
209 | 214 | } |
210 | 215 | }; |
| 216 | + |
211 | 217 | window.parent.postMessage(JSON.stringify(data), '*'); |
212 | 218 | }; |
213 | 219 |
|
214 | | - // Support IE8 with attachEvent |
| 220 | + CrossStorageHub._storageListeners[params.listenerId] = handler; |
| 221 | + |
215 | 222 | if (window.addEventListener) { |
216 | 223 | window.addEventListener('storage', handler, false); |
217 | 224 | } else { |
218 | 225 | window.attachEvent('onstorage', handler); |
219 | 226 | } |
220 | | - CrossStorageHub._eventListeners[params.eventKey] = handler |
221 | 227 | }; |
222 | 228 |
|
223 | 229 | /** |
224 | | - * Removes an event listener with the given eventKey |
| 230 | + * Removes an event listener with the given id |
225 | 231 | * |
226 | | - * @param {object} params An object with an eventKey |
| 232 | + * @param {object} params An object with an id |
227 | 233 | */ |
228 | 234 | CrossStorageHub._unlisten = function(params) { |
229 | | - var handler = CrossStorageHub._eventListeners[params.eventKey]; |
| 235 | + var handler = CrossStorageHub._storageListeners[params.listenerId]; |
| 236 | + CrossStorageHub._storageListeners[params.listenerId] = null; |
230 | 237 |
|
231 | | - // Support IE8 with attachEvent |
232 | 238 | if (window.removeEventListener) { |
233 | 239 | window.removeEventListener('storage', handler, false); |
234 | 240 | } else { |
235 | 241 | window.detachEvent('onstorage', handler); |
236 | 242 | } |
237 | | - CrossStorageHub._eventListeners[params.eventKey] = null |
238 | 243 | }; |
239 | 244 |
|
240 | 245 | /** |
|
0 commit comments