Skip to content

Commit 7df6022

Browse files
committed
Fix #20: Enable support for file://
1 parent a15c706 commit 7df6022

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

lib/client.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -264,15 +264,19 @@
264264
var client = this;
265265

266266
this._listener = function(message) {
267-
var i, error, response;
267+
var i, origin, error, response;
268268

269-
// Ignore invalid messages, those not from the correct hub, or when
270-
// the client has closed
271-
if (client._closed || !message.data || typeof message.data !== 'string' ||
272-
message.origin !== client._origin) {
269+
// Ignore invalid messages or those after the client has closed
270+
if (client._closed || !message.data || typeof message.data !== 'string') {
273271
return;
274272
}
275273

274+
// postMessage returns the string "null" as the origin for "file://"
275+
origin = (message.origin === 'null') ? 'file://' : message.origin;
276+
277+
// Ignore messages not from the correct origin
278+
if (origin !== client._origin) return;
279+
276280
// LocalStorage isn't available in the hub
277281
if (message.data === 'cross-storage:unavailable') {
278282
if (!client._closed) client.close();
@@ -327,14 +331,18 @@
327331
* establish a connected state.
328332
*/
329333
CrossStorageClient.prototype._poll = function() {
330-
var client, interval;
334+
var client, interval, targetOrigin;
331335

332336
client = this;
337+
338+
// postMessage requires that the target origin be set to "*" for "file://"
339+
targetOrigin = (client._origin === 'file://') ? '*' : client._origin;
340+
333341
interval = setInterval(function() {
334342
if (client._connected) return clearInterval(interval);
335343
if (!client._hub) return;
336344

337-
client._hub.postMessage('cross-storage:poll', client._origin);
345+
client._hub.postMessage('cross-storage:poll', targetOrigin);
338346
}, 1000);
339347
};
340348

@@ -395,7 +403,7 @@
395403
};
396404

397405
return new this._promise(function(resolve, reject) {
398-
var timeout, originalToJSON;
406+
var timeout, originalToJSON, targetOrigin;
399407

400408
// Timeout if a response isn't received after 4s
401409
timeout = setTimeout(function() {
@@ -419,8 +427,11 @@
419427
Array.prototype.toJSON = null;
420428
}
421429

430+
// postMessage requires that the target origin be set to "*" for "file://"
431+
targetOrigin = (client._origin === 'file://') ? '*' : client._origin;
432+
422433
// Send serialized message
423-
client._hub.postMessage(JSON.stringify(req), client._origin);
434+
client._hub.postMessage(JSON.stringify(req), targetOrigin);
424435

425436
// Restore original toJSON
426437
if (originalToJSON) {

lib/hub.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,10 @@
6666
* @param {MessageEvent} message A message to be processed
6767
*/
6868
CrossStorageHub._listener = function(message) {
69-
var uri, available, request, method, error, result, response;
69+
var origin, targetOrigin, request, method, error, result, response;
70+
71+
// postMessage returns the string "null" as the origin for "file://"
72+
origin = (message.origin === 'null') ? 'file://' : message.origin;
7073

7174
// Handle polling for a ready message
7275
if (message.data === 'cross-storage:poll') {
@@ -81,7 +84,7 @@
8184

8285
if (!method) {
8386
return;
84-
} else if (!CrossStorageHub._permitted(message.origin, method)) {
87+
} else if (!CrossStorageHub._permitted(origin, method)) {
8588
error = 'Invalid permissions for ' + method;
8689
} else {
8790
try {
@@ -97,7 +100,10 @@
97100
result: result
98101
});
99102

100-
window.parent.postMessage(response, message.origin);
103+
// postMessage requires that the target origin be set to "*" for "file://"
104+
targetOrigin = (origin === 'file://') ? '*' : origin;
105+
106+
window.parent.postMessage(response, targetOrigin);
101107
};
102108

103109
/**

0 commit comments

Comments
 (0)