From 36cc80936feb10e34e2dd82be8a8c27ff518ffac Mon Sep 17 00:00:00 2001 From: "till.schmidt" Date: Thu, 18 Jun 2020 12:30:23 +0200 Subject: [PATCH] Add portName to 'storeReady' message --- src/store/Store.js | 2 +- src/wrap-store/wrapStore.js | 2 +- test/Store.test.js | 64 ++++++++++++++++++++++++++++++++++++- 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/store/Store.js b/src/store/Store.js index 3f071a29..6d33427b 100644 --- a/src/store/Store.js +++ b/src/store/Store.js @@ -171,7 +171,7 @@ class Store { } safetyHandler(message){ - if (message.action === 'storeReady'){ + if (message.action === 'storeReady' && message.portName === this.portName){ // Remove Saftey Listener this.browserAPI.runtime.onMessage.removeListener(this.safetyHandler); diff --git a/src/wrap-store/wrapStore.js b/src/wrap-store/wrapStore.js index 01eb7c76..7405b7be 100644 --- a/src/wrap-store/wrapStore.js +++ b/src/wrap-store/wrapStore.js @@ -165,7 +165,7 @@ export default (store, { */ browserAPI.tabs.query({}, tabs => { for(const tab of tabs){ - browserAPI.tabs.sendMessage(tab.id, {action: 'storeReady'}, () => { + browserAPI.tabs.sendMessage(tab.id, {action: 'storeReady', portName}, () => { if (chrome.runtime.lastError) { // do nothing - errors can be present // if no content script exists on reciever diff --git a/test/Store.test.js b/test/Store.test.js index 6fe53fce..f6b6d760 100644 --- a/test/Store.test.js +++ b/test/Store.test.js @@ -183,12 +183,74 @@ describe('Store', function () { store.readyResolve = sinon.spy(); // send message - l({action: 'storeReady'}); + l({action: 'storeReady', portName}); safetyListeners.length.should.equal(0); store.readyResolved.should.eql(true); store.readyResolve.calledOnce.should.equal(true); }); + + it('should setup a safety listener per portName', function () { + // mock onMessage listeners array + const safetyListeners = []; + + // override mock chrome API for this test + self.chrome.runtime = { + connect: () => { + return { + onMessage: { + addListener: () => {} + } + }; + }, + onMessage: { + addListener: (listener) => { + safetyListeners.push(listener); + }, + removeListener: (listener) => { + const index = safetyListeners.indexOf(listener); + + if (index > -1) { + safetyListeners.splice(index, 1); + } + } + }, + }; + + const store = new Store({portName}); + const portName2 = 'test2' + const store2 = new Store({portName: portName2}); + + + // verify one listener was added on port connect + safetyListeners.length.should.equal(2); + + const [ l1, l2 ] = safetyListeners; + + // make readyResolve() a spy function + store.readyResolve = sinon.spy(); + store2.readyResolve = sinon.spy(); + + // send message for port 1 + l1({action: 'storeReady', portName}); + l2({action: 'storeReady', portName}); + + safetyListeners.length.should.equal(1); + store.readyResolved.should.eql(true); + store.readyResolve.calledOnce.should.equal(true); + store2.readyResolved.should.eql(false); + store2.readyResolve.calledOnce.should.equal(false); + + + // send message for port 2 + l1({action: 'storeReady', portName: portName2}); + l2({action: 'storeReady', portName: portName2}); + safetyListeners.length.should.equal(0); + store.readyResolved.should.eql(true); + store.readyResolve.calledOnce.should.equal(true); + store2.readyResolved.should.eql(true); + store2.readyResolve.calledOnce.should.equal(true); + }); }); describe('#ready()', function () {