Skip to content

Commit 990556b

Browse files
committed
attempt to fix single file proxy
1 parent b1617d4 commit 990556b

File tree

1 file changed

+61
-11
lines changed

1 file changed

+61
-11
lines changed

sysend.js

Lines changed: 61 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,23 @@
5959
// -------------------------------------------------------------------------
6060
var sysend = {
6161
id: target_id,
62-
broadcast: function(event, data) {
62+
// args is argument used internaly when sendig message inside iframe
63+
broadcast: function(event, data, args) {
6364
if (channel) {
64-
channel.postMessage({name: event, data: serialize(data)});
65+
args = Object.assign(args || {}, {
66+
domains: domains
67+
});
68+
channel.postMessage({name: event, args: args, data: serialize(data)});
6569
} else {
6670
set(event, to_json(data));
6771
// clean up localstorage
6872
setTimeout(function() {
6973
remove(event);
7074
}, 0);
7175
}
76+
if (!is_iframe) {
77+
send_to_iframes(event, data);
78+
}
7279
},
7380
emit: function(event, data) {
7481
sysend.broadcast(event, data);
@@ -83,9 +90,9 @@
8390
serializer.from = from;
8491
},
8592
proxy: function(url) {
93+
domains = domains || [];
94+
domains.push(origin(url));
8695
if (typeof url === 'string' && host(url) !== window.location.host) {
87-
domains = domains || [];
88-
domains.push(origin(url));
8996
var iframe = document.createElement('iframe');
9097
iframe.style.width = iframe.style.height = 0;
9198
iframe.style.border = 'none';
@@ -109,7 +116,11 @@
109116
} catch(e) {
110117
win = iframe.contentWindow;
111118
}
112-
iframes.push({window: win, node: iframe});
119+
iframes.push({
120+
window: win,
121+
node: iframe,
122+
origin: origin(iframe.src)
123+
});
113124
iframe.removeEventListener('load', handler);
114125
});
115126
document.body.appendChild(iframe);
@@ -364,6 +375,21 @@
364375
}
365376
})();
366377
// -------------------------------------------------------------------------
378+
function send_to_iframes(key, data) {
379+
// propagate events to iframes
380+
iframes.forEach(function(iframe) {
381+
var payload = {
382+
name: uniq_prefix,
383+
key: key,
384+
domains: domains,
385+
data: data
386+
};
387+
if (is_valid_origin(origin(iframe.node.src))) {
388+
iframe.window.postMessage(JSON.stringify(payload), "*");
389+
}
390+
});
391+
}
392+
// -------------------------------------------------------------------------
367393
function to_json(input) {
368394
// save random_value in storage to fix issue in IE that storage event
369395
// is fired on same page where setItem was called
@@ -438,19 +464,33 @@
438464
channel = new window.BroadcastChannel(uniq_prefix);
439465
channel.addEventListener('message', function(event) {
440466
if (event.target.name === uniq_prefix) {
467+
var data = unserialize(event.data.data);
441468
if (is_iframe) {
442469
var payload = {
443470
name: uniq_prefix,
444471
data: event.data,
445472
iframe_id: target_id
446473
};
447474
var referrer = origin(document.referrer);
448-
if (is_valid_origin(referrer)) {
475+
var has_domain;
476+
if (event.data.args && event.data.args.domains) {
477+
has_domain = !!event.data.args.domains.find(function(origin) {
478+
return referrer === origin;
479+
});
480+
if (!has_domain) {
481+
482+
}
483+
484+
}
485+
var has_iframe = !!iframes.find(function(iframe) {
486+
return iframe.origin === referrer;
487+
});
488+
if (is_valid_origin(referrer) && has_iframe) {
449489
window.parent.postMessage(JSON.stringify(payload), "*");
450490
}
451491
} else {
452492
var key = event.data && event.data.name;
453-
invoke(key, unserialize(event.data.data));
493+
invoke(key, data);
454494
}
455495
}
456496
});
@@ -486,17 +526,26 @@
486526
}
487527

488528
window.addEventListener('message', function(event) {
529+
console.log({from_frame: event, is_iframe});
489530
if (is_sysend_post_message(event) && is_valid_origin(event.origin)) {
490531
try {
491532
var payload = JSON.parse(event.data);
492533
if (payload && payload.name === uniq_prefix) {
493534
var data = unserialize(payload.data);
494535
if (is_iframe) {
495-
sysend.broadcast(payload.key, data);
536+
console.log({payload});
537+
sysend.broadcast(payload.key, data, payload.domains);
496538
} else {
539+
console.log({payload, data, event});
497540
if (!data.data.target) {
498-
var key = data && data.name;
499-
invoke(key, data.data);
541+
var has_iframe = !!iframes.find(function(iframe) {
542+
return iframe.origin === event.origin;
543+
});
544+
console.log({iframes, has_iframe, valid: is_valid_origin(event.origin), event});
545+
if (!has_iframe || is_valid_origin(event.origin)) {
546+
var key = data && data.name;
547+
invoke(key, data.data);
548+
}
500549
}
501550
}
502551
}
@@ -506,6 +555,7 @@
506555
}
507556
}
508557
});
558+
return;
509559
if (!is_iframe) {
510560
init_visiblity();
511561

@@ -578,7 +628,7 @@
578628
addEventListener('beforeunload', function() {
579629
sysend.emit('__close__', { id: target_id, wasPrimary: primary });
580630
}, { capture: true });
581-
631+
582632
on_load().then(function() {
583633
sysend.list().then(function(list) {
584634
target_count = list.length;

0 commit comments

Comments
 (0)