From 47ac68c34adb6897d2bce69da17e9fb964030972 Mon Sep 17 00:00:00 2001 From: HF Date: Mon, 5 Sep 2022 11:10:22 +0200 Subject: [PATCH] broadcast messages from one popup over parent to others --- src/core/popUps.js | 10 ++++++++-- src/store/middleware/parent.js | 4 +++- src/store/middleware/popUps.js | 6 +++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/core/popUps.js b/src/core/popUps.js index 609a9f8..dec3c2c 100644 --- a/src/core/popUps.js +++ b/src/core/popUps.js @@ -24,7 +24,11 @@ class PopUps { if (~pos) this.wins.splice(pos, 1); } - dispatch(msg) { + /* + * send message to all popups + * except the ignore one + */ + dispatch(msg, ignore = null) { const { wins } = this; try { for (let i = 0; i < wins.length; i += 1) { @@ -34,7 +38,9 @@ class PopUps { i -= 1; continue; } - win.postMessage(msg, this.origin); + if (win !== ignore) { + win.postMessage(msg, this.origin); + } } } catch { return false; diff --git a/src/store/middleware/parent.js b/src/store/middleware/parent.js index 318e2bc..3b52725 100644 --- a/src/store/middleware/parent.js +++ b/src/store/middleware/parent.js @@ -17,7 +17,9 @@ window.addEventListener('beforeunload', () => { export default (store) => (next) => (action) => { if (action instanceof MessageEvent) { - if (action.origin !== origin) { + if (action.origin !== origin + || !action.data.type + ) { return null; } if (action.data.type === 't/UNLOAD') { diff --git a/src/store/middleware/popUps.js b/src/store/middleware/popUps.js index 98eab20..1f9622a 100644 --- a/src/store/middleware/popUps.js +++ b/src/store/middleware/popUps.js @@ -9,7 +9,9 @@ import popUps from '../../core/popUps'; export default (store) => (next) => (action) => { if (action instanceof MessageEvent) { - if (action.origin !== window.location.origin) { + if (action.origin !== window.location.origin + || !action.data.type + ) { return null; } if (action.data.type === 't/UNLOAD') { @@ -23,6 +25,8 @@ export default (store) => (next) => (action) => { ); popUps.add(action.source); console.log('popup added'); + } else if (action.data.type.startsWith('s/')) { + popUps.dispatch(action.data, action.source); } return next(action.data); }