|
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