Skip to content

Commit

Permalink
Merge pull request #253 from sokki/make-storeReady-portName-aware
Browse files Browse the repository at this point in the history
Add portName to 'storeReady' message
  • Loading branch information
tshaddix authored Jun 18, 2020
2 parents 536e126 + 36cc809 commit 9c61f3f
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 3 deletions.
2 changes: 1 addition & 1 deletion src/store/Store.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/wrap-store/wrapStore.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
64 changes: 63 additions & 1 deletion test/Store.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 () {
Expand Down

0 comments on commit 9c61f3f

Please sign in to comment.