| Index: test/filterListener.js |
| diff --git a/test/filterListener.js b/test/filterListener.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a69f511fa114cc91f5968c720981fcae9de2e229 |
| --- /dev/null |
| +++ b/test/filterListener.js |
| @@ -0,0 +1,327 @@ |
| +/* |
| + * This file is part of Adblock Plus <https://adblockplus.org/>, |
| + * Copyright (C) 2006-2016 Eyeo GmbH |
| + * |
| + * Adblock Plus is free software: you can redistribute it and/or modify |
| + * it under the terms of the GNU General Public License version 3 as |
| + * published by the Free Software Foundation. |
| + * |
| + * Adblock Plus is distributed in the hope that it will be useful, |
| + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| + * GNU General Public License for more details. |
| + * |
| + * You should have received a copy of the GNU General Public License |
| + * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| + */ |
| + |
| +"use strict"; |
| + |
| +let {createSandbox} = require("./_common"); |
| +let sandboxedRequire = null; |
| + |
| +let FilterStorage = null; |
| +let Subscription = null; |
| +let Filter = null; |
| +let defaultMatcher = null; |
| +let SpecialSubscription = null; |
| + |
| +exports.setUp = function(callback) |
| +{ |
| + sandboxedRequire = createSandbox({ |
| + elemHide: ["filterByKey", "exceptions"], |
| + cssRules: ["filters"] |
| + }); |
| + |
| + // We need to require the filterListener module so that filter changes will be |
| + // noticed, even though we don't directly use the module here. |
| + sandboxedRequire("../lib/filterListener"); |
| + |
| + ( |
| + {FilterStorage} = sandboxedRequire("../lib/filterStorage"), |
| + {Subscription, SpecialSubscription} = sandboxedRequire("../lib/subscriptionClasses"), |
| + {Filter} = sandboxedRequire("../lib/filterClasses"), |
| + {defaultMatcher} = sandboxedRequire("../lib/matcher") |
| + ); |
| + |
| + FilterStorage.addSubscription(Subscription.fromURL("~fl~")); |
| + FilterStorage.addSubscription(Subscription.fromURL("~wl~")); |
| + FilterStorage.addSubscription(Subscription.fromURL("~eh~")); |
| + |
| + Subscription.fromURL("~fl~").defaults = ["blocking"]; |
| + Subscription.fromURL("~wl~").defaults = ["whitelist"]; |
| + Subscription.fromURL("~eh~").defaults = ["elemhide"]; |
| + |
| + callback(); |
| +}; |
| + |
| +function checkKnownFilters(test, text, expected) |
| +{ |
| + let result = {}; |
| + for (let type of ["blacklist", "whitelist"]) |
| + { |
| + let matcher = defaultMatcher[type]; |
| + let filters = []; |
| + for (let keyword in matcher.filterByKeyword) |
| + { |
| + let list = matcher.filterByKeyword[keyword]; |
| + for (let i = 0; i < list.length; i++) |
| + { |
| + let filter = list[i]; |
| + test.equal(matcher.getKeywordForFilter(filter), keyword, |
| + "Keyword of filter " + filter.text); |
| + filters.push(filter.text); |
| + } |
| + } |
| + result[type] = filters; |
| + } |
| + |
| + let elemHide = sandboxedRequire("../lib/elemHide"); |
| + result.elemhide = []; |
| + for (let key in elemHide.filterByKey) |
| + result.elemhide.push(elemHide.filterByKey[key].text); |
| + |
| + result.elemhideexception = []; |
| + for (let selector in elemHide.exceptions) |
| + { |
| + let list = elemHide.exceptions[selector]; |
| + for (let exception of list) |
| + result.elemhideexception.push(exception.text); |
| + } |
| + |
| + let cssRules = sandboxedRequire("../lib/cssRules"); |
| + result.cssrule = []; |
| + for (let filterText in cssRules.filters) |
| + result.cssrule.push(filterText); |
| + |
| + let types = ["blacklist", "whitelist", "elemhide", "elemhideexception", |
| + "cssrule"]; |
| + for (let type of types) |
| + { |
| + if (!(type in expected)) |
| + expected[type] = []; |
| + else |
| + expected[type].sort(); |
| + result[type].sort(); |
| + } |
| + |
| + test.deepEqual(result, expected, text); |
| +} |
| + |
| +exports.testAddingAndRemovingFilters = function(test) |
| +{ |
| + let filter1 = Filter.fromText("filter1"); |
| + let filter2 = Filter.fromText("@@filter2"); |
| + let filter3 = Filter.fromText("#filter3"); |
| + let filter4 = Filter.fromText("!filter4"); |
| + let filter5 = Filter.fromText("#@#filter5"); |
| + let filter6 = Filter.fromText("example.com##[-abp-properties='filter6']"); |
| + let filter7 = Filter.fromText("example.com#@#[-abp-properties='filter7']"); |
| + |
| + FilterStorage.addFilter(filter1); |
| + checkKnownFilters(test, "add filter1", {blacklist: [filter1.text]}); |
| + FilterStorage.addFilter(filter2); |
| + checkKnownFilters(test, "add @@filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + FilterStorage.addFilter(filter3); |
| + checkKnownFilters(test, "add #filter3", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text]}); |
| + FilterStorage.addFilter(filter4); |
| + checkKnownFilters(test, "add !filter4", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text]}); |
| + FilterStorage.addFilter(filter5); |
| + checkKnownFilters(test, "add #@#filter5", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text]}); |
| + FilterStorage.addFilter(filter6); |
| + checkKnownFilters(test, "add example.com##[-abp-properties='filter6']", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text], cssrule: [filter6.text]}); |
| + FilterStorage.addFilter(filter7); |
| + checkKnownFilters(test, "add example.com#@#[-abp-properties='filter7']", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + |
| + FilterStorage.removeFilter(filter1); |
| + checkKnownFilters(test, "remove filter1", {whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + filter2.disabled = true; |
| + checkKnownFilters(test, "disable filter2", {elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + FilterStorage.removeFilter(filter2); |
| + checkKnownFilters(test, "remove filter2", {elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + FilterStorage.removeFilter(filter4); |
| + checkKnownFilters(test, "remove filter4", {elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + |
| + test.done(); |
| +}; |
| + |
| +exports.testDisablingEnablingFiltersNotInTheList = function(test) |
| +{ |
| + let filter1 = Filter.fromText("filter1"); |
| + let filter2 = Filter.fromText("@@filter2"); |
| + let filter3 = Filter.fromText("#filter3"); |
| + let filter4 = Filter.fromText("#@#filter4"); |
| + let filter5 = Filter.fromText("example.com##[-abp-properties='filter5']"); |
| + let filter6 = Filter.fromText("example.com#@#[-abp-properties='filter6']"); |
| + |
| + filter1.disabled = true; |
| + checkKnownFilters(test, "disable filter1 while not in list", {}); |
| + filter1.disabled = false; |
| + checkKnownFilters(test, "enable filter1 while not in list", {}); |
| + |
| + filter2.disabled = true; |
| + checkKnownFilters(test, "disable @@filter2 while not in list", {}); |
| + filter2.disabled = false; |
| + checkKnownFilters(test, "enable @@filter2 while not in list", {}); |
| + |
| + filter3.disabled = true; |
| + checkKnownFilters(test, "disable #filter3 while not in list", {}); |
| + filter3.disabled = false; |
| + checkKnownFilters(test, "enable #filter3 while not in list", {}); |
| + |
| + filter4.disabled = true; |
| + checkKnownFilters(test, "disable #@#filter4 while not in list", {}); |
| + filter4.disabled = false; |
| + checkKnownFilters(test, "enable #@#filter4 while not in list", {}); |
| + |
| + filter5.disabled = true; |
| + checkKnownFilters(test, "disable example.com##[-abp-properties='filter5'] while not in list", {}); |
| + filter5.disabled = false; |
| + checkKnownFilters(test, "enable example.com##[-abp-properties='filter5'] while not in list", {}); |
| + |
| + filter6.disabled = true; |
| + checkKnownFilters(test, "disable example.com#@#[-abp-properties='filter6'] while not in list", {}); |
| + filter6.disabled = false; |
| + checkKnownFilters(test, "enable example.com#@#[-abp-properties='filter6'] while not in list", {}); |
| + |
| + test.done(); |
| +}; |
| + |
| +exports.testFilterSubscriptionOperations = function(test) |
| +{ |
| + let filter1 = Filter.fromText("filter1"); |
| + let filter2 = Filter.fromText("@@filter2"); |
| + filter2.disabled = true; |
| + let filter3 = Filter.fromText("#filter3"); |
| + let filter4 = Filter.fromText("!filter4"); |
| + let filter5 = Filter.fromText("#@#filter5"); |
| + let filter6 = Filter.fromText("example.com##[-abp-properties='filter6']"); |
| + let filter7 = Filter.fromText("example.com#@#[-abp-properties='filter7']"); |
| + |
| + let subscription = Subscription.fromURL("http://test1/"); |
| + subscription.filters = [filter1, filter2, filter3, filter4, filter5, filter6, filter7]; |
| + |
| + FilterStorage.addSubscription(subscription); |
| + checkKnownFilters(test, "add subscription with filter1, @@filter2, #filter3, !filter4, #@#filter5, example.com##[-abp-properties='filter6'], example.com#@#[-abp-properties='filter7']", {blacklist: [filter1.text], elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + |
| + filter2.disabled = false; |
| + checkKnownFilters(test, "enable @@filter2", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + |
| + FilterStorage.addFilter(filter1); |
| + checkKnownFilters(test, "add filter1", {blacklist: [filter1.text], whitelist: [filter2.text], elemhide: [filter3.text], elemhideexception: [filter5.text, filter7.text], cssrule: [filter6.text]}); |
| + |
| + FilterStorage.updateSubscriptionFilters(subscription, [filter4]); |
| + checkKnownFilters(test, "change subscription filters to filter4", {blacklist: [filter1.text]}); |
| + |
| + FilterStorage.removeFilter(filter1); |
| + checkKnownFilters(test, "remove filter1", {}); |
| + |
| + FilterStorage.updateSubscriptionFilters(subscription, [filter1, filter2]); |
| + checkKnownFilters(test, "change subscription filters to filter1, filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + filter1.disabled = true; |
| + checkKnownFilters(test, "disable filter1", {whitelist: [filter2.text]}); |
| + filter2.disabled = true; |
| + checkKnownFilters(test, "disable filter2", {}); |
| + filter1.disabled = false; |
| + filter2.disabled = false; |
| + checkKnownFilters(test, "enable filter1, filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.addFilter(filter1); |
| + checkKnownFilters(test, "add filter1", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + subscription.disabled = true; |
| + checkKnownFilters(test, "disable subscription", {blacklist: [filter1.text]}); |
| + |
| + FilterStorage.removeSubscription(subscription); |
| + checkKnownFilters(test, "remove subscription", {blacklist: [filter1.text]}); |
| + |
| + FilterStorage.addSubscription(subscription); |
| + checkKnownFilters(test, "add subscription", {blacklist: [filter1.text]}); |
| + |
| + subscription.disabled = false; |
| + checkKnownFilters(test, "enable subscription", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + subscription.disabled = true; |
| + checkKnownFilters(test, "disable subscription", {blacklist: [filter1.text]}); |
| + |
| + FilterStorage.addFilter(filter2); |
| + checkKnownFilters(test, "add filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.removeFilter(filter2); |
| + checkKnownFilters(test, "remove filter2", {blacklist: [filter1.text]}); |
| + |
| + subscription.disabled = false; |
| + checkKnownFilters(test, "enable subscription", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.removeSubscription(subscription); |
| + checkKnownFilters(test, "remove subscription", {blacklist: [filter1.text]}); |
| + |
| + test.done(); |
| +}; |
| + |
| +exports.testFilterGroupOperations = function(test) |
| +{ |
| + let filter1 = Filter.fromText("filter1"); |
| + let filter2 = Filter.fromText("@@filter2"); |
| + let filter3 = Filter.fromText("filter3"); |
| + let filter4 = Filter.fromText("@@filter4"); |
| + let filter5 = Filter.fromText("!filter5"); |
| + |
| + let subscription = Subscription.fromURL("http://test1/"); |
| + subscription.filters = [filter1, filter2]; |
| + |
| + FilterStorage.addSubscription(subscription); |
| + FilterStorage.addFilter(filter1); |
| + checkKnownFilters(test, "initial setup", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + let subscription2 = Subscription.fromURL("~fl~"); |
| + subscription2.disabled = true; |
| + checkKnownFilters(test, "disable blocking filters", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.removeSubscription(subscription); |
| + checkKnownFilters(test, "remove subscription", {}); |
| + |
| + subscription2.disabled = false; |
| + checkKnownFilters(test, "enable blocking filters", {blacklist: [filter1.text]}); |
| + |
| + let subscription3 = Subscription.fromURL("~wl~"); |
| + subscription3.disabled = true; |
| + checkKnownFilters(test, "disable exception rules", {blacklist: [filter1.text]}); |
| + |
| + FilterStorage.addFilter(filter2); |
| + checkKnownFilters(test, "add @@filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + test.equal(filter2.subscriptions.length, 1, "@@filter2.subscription.length"); |
| + test.ok(filter2.subscriptions[0] instanceof SpecialSubscription, "@@filter2 added to a new filter group"); |
| + test.ok(filter2.subscriptions[0] != subscription3, "@@filter2 filter group is not the disabled exceptions group"); |
| + |
| + subscription3.disabled = false; |
| + checkKnownFilters(test, "enable exception rules", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.removeFilter(filter2); |
| + FilterStorage.addFilter(filter2); |
| + checkKnownFilters(test, "re-add @@filter2", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + test.equal(filter2.subscriptions.length, 1, "@@filter2.subscription.length"); |
| + test.ok(filter2.subscriptions[0] == subscription3, "@@filter2 added to the default exceptions group"); |
| + |
| + let subscription4 = Subscription.fromURL("http://test/"); |
| + FilterStorage.updateSubscriptionFilters(subscription4, [filter3, filter4, filter5]); |
| + checkKnownFilters(test, "update subscription not in the list yet", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.addSubscription(subscription4); |
| + checkKnownFilters(test, "add subscription to the list", {blacklist: [filter1.text, filter3.text], whitelist: [filter2.text, filter4.text]}); |
| + |
| + FilterStorage.updateSubscriptionFilters(subscription4, [filter3, filter2, filter5]); |
| + checkKnownFilters(test, "update subscription while in the list", {blacklist: [filter1.text, filter3.text], whitelist: [filter2.text]}); |
| + |
| + subscription3.disabled = true; |
| + checkKnownFilters(test, "disable exception rules", {blacklist: [filter1.text, filter3.text], whitelist: [filter2.text]}); |
| + |
| + FilterStorage.removeSubscription(subscription4); |
| + checkKnownFilters(test, "remove subscription from the list", {blacklist: [filter1.text]}); |
| + |
| + subscription3.disabled = false; |
| + checkKnownFilters(test, "enable exception rules", {blacklist: [filter1.text], whitelist: [filter2.text]}); |
| + |
| + test.done(); |
| +}; |