|
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', |
| 134 | + 'listen', 'unlisten']; |
| 135 | + |
134 | 136 | if (!CrossStorageHub._inArray(method, available)) { |
135 | 137 | return false; |
136 | 138 | } |
|
187 | 189 | }; |
188 | 190 |
|
189 | 191 | /** |
190 | | - * Adds an event listener to `storage` events which sends all events to the client with the given eventKey |
| 192 | + * Listens to storage events, sending them to the client. |
191 | 193 | * |
192 | | - * @param {object} params An object with an eventKey |
| 194 | + * @param {object} params An object with a listener id |
193 | 195 | */ |
194 | 196 | CrossStorageHub._listen = function(params) { |
195 | | - if (params.eventKey in CrossStorageHub._eventListeners) { |
196 | | - throw new Error("Can't reuse eventKeys") |
| 197 | + if (params.listenerId in CrossStorageHub._storageListeners) { |
| 198 | + return; |
197 | 199 | } |
| 200 | + |
198 | 201 | var handler = function(event) { |
199 | | - if (event.storageArea != window.localStorage) return; |
| 202 | + if (event.storageArea !== window.localStorage) return; |
| 203 | + |
200 | 204 | var data = { |
201 | | - type: 'event', |
202 | | - eventKey: params.eventKey, |
203 | | - eventData: { |
| 205 | + listenerId: params.listenerId, |
| 206 | + event: { |
204 | 207 | key: event.key, |
205 | 208 | newValue: event.newValue, |
206 | 209 | oldValue: event.oldValue, |
207 | 210 | url: event.url |
208 | | - // storageArea, ignored because we only use localStorage |
209 | 211 | } |
210 | 212 | }; |
| 213 | + |
211 | 214 | window.parent.postMessage(JSON.stringify(data), '*'); |
212 | 215 | }; |
213 | 216 |
|
214 | | - // Support IE8 with attachEvent |
| 217 | + CrossStorageHub._storageListeners[params.listenerId] = handler; |
| 218 | + |
215 | 219 | if (window.addEventListener) { |
216 | 220 | window.addEventListener('storage', handler, false); |
217 | 221 | } else { |
218 | 222 | window.attachEvent('onstorage', handler); |
219 | 223 | } |
220 | | - CrossStorageHub._eventListeners[params.eventKey] = handler |
221 | 224 | }; |
222 | 225 |
|
223 | 226 | /** |
224 | | - * Removes an event listener with the given eventKey |
| 227 | + * Removes an event listener with the given id |
225 | 228 | * |
226 | | - * @param {object} params An object with an eventKey |
| 229 | + * @param {object} params An object with an id |
227 | 230 | */ |
228 | 231 | CrossStorageHub._unlisten = function(params) { |
229 | | - var handler = CrossStorageHub._eventListeners[params.eventKey]; |
| 232 | + var handler = CrossStorageHub._storageListeners[params.listenerId]; |
| 233 | + CrossStorageHub._storageListeners[params.listenerId] = null; |
230 | 234 |
|
231 | | - // Support IE8 with attachEvent |
232 | 235 | if (window.removeEventListener) { |
233 | 236 | window.removeEventListener('storage', handler, false); |
234 | 237 | } else { |
235 | 238 | window.detachEvent('onstorage', handler); |
236 | 239 | } |
237 | | - CrossStorageHub._eventListeners[params.eventKey] = null |
238 | 240 | }; |
239 | 241 |
|
240 | 242 | /** |
|
0 commit comments