blacklist as an util

jh-changes
Shin'ya Ueoka 6 years ago
parent 327144a3aa
commit cf0dcf2522
  1. 31
      src/content/components/common/index.js
  2. 13
      src/shared/blacklists.js
  3. 42
      test/shared/blacklists.test.js

@ -5,6 +5,7 @@ import * as settingActions from 'content/actions/setting';
import messages from 'shared/messages';
import * as addonActions from '../../actions/addon';
import * as re from 'shared/utils/re';
import * as blacklists from 'shared/blacklists';
export default class Common {
constructor(win, store) {
@ -46,27 +47,15 @@ export default class Common {
});
}
let blacklist = JSON.stringify(this.store.getState().setting.blacklist);
if (blacklist !== this.prevBlacklist) {
this.prevBlacklist = blacklist;
this.disableIfBlack(this.store.getState().setting.blacklist);
}
}
disableIfBlack(blacklist) {
let loc = this.win.location;
let partial = loc.host + loc.pathname;
let matched = blacklist
.map((item) => {
let pattern = item.includes('/') ? item : item + '/*';
return re.fromWildcard(pattern);
})
.some(regex => regex.test(partial));
if (matched) {
this.store.dispatch(addonActions.disable());
} else {
this.store.dispatch(addonActions.enable());
let blacklist = this.store.getState().setting.blacklist;
let str = JSON.stringify(blacklist)
if (blacklist !== str) {
this.prevBlacklist = str;
if (blacklists.includes(blacklist, this.win.location)) {
this.store.dispatch(addonActions.disable());
} else {
this.store.dispatch(addonActions.enable());
}
}
}

@ -0,0 +1,13 @@
import * as re from 'shared/utils/re';
const includes = (blacklist, url) => {
let u = new URL(url)
return blacklist.some((item) => {
if (!item.includes('/')) {
return re.fromWildcard(item).test(u.hostname);
}
return re.fromWildcard(item).test(u.hostname + u.pathname);
});
}
export { includes };

@ -0,0 +1,42 @@
import { includes } from 'shared/blacklists';
describe("shared/blacklist", () => {
it('matches by *', () => {
let blacklist = ['*'];
expect(includes(blacklist, 'https://github.com/abc')).to.be.true;
})
it('matches by hostname', () => {
let blacklist = ['github.com'];
expect(includes(blacklist, 'https://github.com')).to.be.true;
expect(includes(blacklist, 'https://gist.github.com')).to.be.false;
expect(includes(blacklist, 'https://github.com/ueokande')).to.be.true;
expect(includes(blacklist, 'https://github.org')).to.be.false;
expect(includes(blacklist, 'https://google.com/search?q=github.org')).to.be.false;
})
it('matches by hostname with wildcard', () => {
let blacklist = ['*.github.com'];
expect(includes(blacklist, 'https://github.com')).to.be.false;
expect(includes(blacklist, 'https://gist.github.com')).to.be.true;
})
it('matches by path', () => {
let blacklist = ['github.com/abc'];
expect(includes(blacklist, 'https://github.com/abc')).to.be.true;
expect(includes(blacklist, 'https://github.com/abcdef')).to.be.false;
expect(includes(blacklist, 'https://gist.github.com/abc')).to.be.false;
})
it('matches by path with wildcard', () => {
let blacklist = ['github.com/abc*'];
expect(includes(blacklist, 'https://github.com/abc')).to.be.true;
expect(includes(blacklist, 'https://github.com/abcdef')).to.be.true;
expect(includes(blacklist, 'https://gist.github.com/abc')).to.be.false;
})
});