| Index: test/filterClasses.js |
| =================================================================== |
| --- a/test/filterClasses.js |
| +++ b/test/filterClasses.js |
| @@ -12,16 +12,17 @@ |
| * 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"; |
| +const assert = require("assert"); |
| const {createSandbox} = require("./_common"); |
| let Filter = null; |
| let InvalidFilter = null; |
| let CommentFilter = null; |
| let ActiveFilter = null; |
| let RegExpFilter = null; |
| let BlockingFilter = null; |
| @@ -31,614 +32,588 @@ |
| let ElemHideFilter = null; |
| let ElemHideException = null; |
| let ElemHideEmulationFilter = null; |
| let SnippetFilter = null; |
| let t = null; |
| let defaultTypes = null; |
| -exports.setUp = function(callback) |
| -{ |
| - let sandboxedRequire = createSandbox(); |
| - ( |
| - {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter, |
| - BlockingFilter, WhitelistFilter, ContentFilter, ElemHideBase, |
| - ElemHideFilter, ElemHideException, ElemHideEmulationFilter, |
| - SnippetFilter} = sandboxedRequire("../lib/filterClasses") |
| - ); |
| - t = RegExpFilter.typeMap; |
| - defaultTypes = 0x7FFFFFFF & ~(t.CSP | t.ELEMHIDE | t.DOCUMENT | t.POPUP | |
| - t.GENERICHIDE | t.GENERICBLOCK); |
| - |
| - callback(); |
| -}; |
| - |
| -function serializeFilter(filter) |
| +describe("Filters Classes", () => |
| { |
| - // Filter serialization only writes out essential properties, need to do a full serialization here |
| - let result = []; |
| - result.push("text=" + filter.text); |
| - if (filter instanceof InvalidFilter) |
| + beforeEach(() => |
| { |
| - result.push("type=invalid"); |
| - result.push("reason=" + filter.reason); |
| - } |
| - else if (filter instanceof CommentFilter) |
| - result.push("type=comment"); |
| - else if (filter instanceof ActiveFilter) |
| + let sandboxedRequire = createSandbox(); |
| + ( |
| + {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter, |
| + BlockingFilter, WhitelistFilter, ContentFilter, ElemHideBase, |
| + ElemHideFilter, ElemHideException, ElemHideEmulationFilter, |
| + SnippetFilter} = sandboxedRequire("../lib/filterClasses") |
| + ); |
| + t = RegExpFilter.typeMap; |
| + defaultTypes = 0x7FFFFFFF & ~(t.CSP | t.ELEMHIDE | t.DOCUMENT | t.POPUP | |
| + t.GENERICHIDE | t.GENERICBLOCK); |
| + }); |
| + |
| + function serializeFilter(filter) |
| { |
| - result.push("disabled=" + filter.disabled); |
| - result.push("lastHit=" + filter.lastHit); |
| - result.push("hitCount=" + filter.hitCount); |
| + // Filter serialization only writes out essential properties, need to do a full serialization here |
| + let result = []; |
| + result.push("text=" + filter.text); |
| + if (filter instanceof InvalidFilter) |
| + { |
| + result.push("type=invalid"); |
| + result.push("reason=" + filter.reason); |
| + } |
| + else if (filter instanceof CommentFilter) |
| + result.push("type=comment"); |
| + else if (filter instanceof ActiveFilter) |
| + { |
| + result.push("disabled=" + filter.disabled); |
| + result.push("lastHit=" + filter.lastHit); |
| + result.push("hitCount=" + filter.hitCount); |
| + |
| + let domains = []; |
| + if (filter.domains) |
| + { |
| + for (let [domain, isIncluded] of filter.domains) |
| + { |
| + if (domain != "") |
| + domains.push(isIncluded ? domain : "~" + domain); |
| + } |
| + } |
| + result.push("domains=" + domains.sort().join("|")); |
| + |
| + if (filter instanceof RegExpFilter) |
| + { |
| + result.push("regexp=" + (filter.regexp ? filter.regexp.source : null)); |
| + result.push("contentType=" + filter.contentType); |
| + result.push("matchCase=" + filter.matchCase); |
| - let domains = []; |
| - if (filter.domains) |
| - { |
| - for (let [domain, isIncluded] of filter.domains) |
| + let sitekeys = filter.sitekeys || []; |
| + result.push("sitekeys=" + sitekeys.slice().sort().join("|")); |
| + |
| + result.push("thirdParty=" + filter.thirdParty); |
| + if (filter instanceof BlockingFilter) |
| + { |
| + result.push("type=filterlist"); |
| + result.push("collapse=" + filter.collapse); |
| + result.push("csp=" + filter.csp); |
| + result.push("rewrite=" + filter.rewrite); |
| + } |
| + else if (filter instanceof WhitelistFilter) |
| + result.push("type=whitelist"); |
| + } |
| + else if (filter instanceof ElemHideBase) |
| { |
| - if (domain != "") |
| - domains.push(isIncluded ? domain : "~" + domain); |
| + if (filter instanceof ElemHideFilter) |
| + result.push("type=elemhide"); |
| + else if (filter instanceof ElemHideException) |
| + result.push("type=elemhideexception"); |
| + else if (filter instanceof ElemHideEmulationFilter) |
| + result.push("type=elemhideemulation"); |
| + |
| + result.push("selectorDomains=" + |
| + [...filter.domains || []] |
| + .filter(([domain, isIncluded]) => isIncluded) |
| + .map(([domain]) => domain.toLowerCase())); |
| + result.push("selector=" + filter.selector); |
| + } |
| + else if (filter instanceof SnippetFilter) |
| + { |
| + result.push("type=snippet"); |
| + result.push("scriptDomains=" + |
| + [...filter.domains || []] |
| + .filter(([domain, isIncluded]) => isIncluded) |
| + .map(([domain]) => domain.toLowerCase())); |
| + result.push("script=" + filter.script); |
| } |
| } |
| - result.push("domains=" + domains.sort().join("|")); |
| - |
| - if (filter instanceof RegExpFilter) |
| - { |
| - result.push("regexp=" + (filter.regexp ? filter.regexp.source : null)); |
| - result.push("contentType=" + filter.contentType); |
| - result.push("matchCase=" + filter.matchCase); |
| - |
| - let sitekeys = filter.sitekeys || []; |
| - result.push("sitekeys=" + sitekeys.slice().sort().join("|")); |
| + return result; |
| + } |
| - result.push("thirdParty=" + filter.thirdParty); |
| - if (filter instanceof BlockingFilter) |
| - { |
| - result.push("type=filterlist"); |
| - result.push("collapse=" + filter.collapse); |
| - result.push("csp=" + filter.csp); |
| - result.push("rewrite=" + filter.rewrite); |
| - } |
| - else if (filter instanceof WhitelistFilter) |
| - result.push("type=whitelist"); |
| + function addDefaults(expected) |
| + { |
| + let type = null; |
| + let hasProperty = {}; |
| + for (let entry of expected) |
| + { |
| + if (/^type=(.*)/.test(entry)) |
| + type = RegExp.$1; |
| + else if (/^(\w+)/.test(entry)) |
| + hasProperty[RegExp.$1] = true; |
| + } |
| + |
| + function addProperty(prop, value) |
| + { |
| + if (!(prop in hasProperty)) |
| + expected.push(prop + "=" + value); |
| } |
| - else if (filter instanceof ElemHideBase) |
| + |
| + if (type == "whitelist" || type == "filterlist" || type == "elemhide" || |
| + type == "elemhideexception" || type == "elemhideemulation" || |
| + type == "snippet") |
| + { |
| + addProperty("disabled", "false"); |
| + addProperty("lastHit", "0"); |
| + addProperty("hitCount", "0"); |
| + } |
| + if (type == "whitelist" || type == "filterlist") |
| { |
| - if (filter instanceof ElemHideFilter) |
| - result.push("type=elemhide"); |
| - else if (filter instanceof ElemHideException) |
| - result.push("type=elemhideexception"); |
| - else if (filter instanceof ElemHideEmulationFilter) |
| - result.push("type=elemhideemulation"); |
| - |
| - result.push("selectorDomains=" + |
| - [...filter.domains || []] |
| - .filter(([domain, isIncluded]) => isIncluded) |
| - .map(([domain]) => domain.toLowerCase())); |
| - result.push("selector=" + filter.selector); |
| + addProperty("contentType", 0x7FFFFFFF & ~( |
| + t.CSP | t.DOCUMENT | t.ELEMHIDE | t.POPUP | t.GENERICHIDE | t.GENERICBLOCK |
| + )); |
| + addProperty("regexp", "null"); |
| + addProperty("matchCase", "false"); |
| + addProperty("thirdParty", "null"); |
| + addProperty("domains", ""); |
| + addProperty("sitekeys", ""); |
| } |
| - else if (filter instanceof SnippetFilter) |
| + if (type == "filterlist") |
| { |
| - result.push("type=snippet"); |
| - result.push("scriptDomains=" + |
| - [...filter.domains || []] |
| - .filter(([domain, isIncluded]) => isIncluded) |
| - .map(([domain]) => domain.toLowerCase())); |
| - result.push("script=" + filter.script); |
| + addProperty("collapse", "null"); |
| + addProperty("csp", "null"); |
| + addProperty("rewrite", "null"); |
| + } |
| + if (type == "elemhide" || type == "elemhideexception" || |
| + type == "elemhideemulation") |
| + { |
| + addProperty("selectorDomains", ""); |
| + addProperty("domains", ""); |
| + } |
| + if (type == "snippet") |
| + { |
| + addProperty("scriptDomains", ""); |
| + addProperty("domains", ""); |
| } |
| } |
| - return result; |
| -} |
| -function addDefaults(expected) |
| -{ |
| - let type = null; |
| - let hasProperty = {}; |
| - for (let entry of expected) |
| + function compareFilter(text, expected, postInit) |
| { |
| - if (/^type=(.*)/.test(entry)) |
| - type = RegExp.$1; |
| - else if (/^(\w+)/.test(entry)) |
| - hasProperty[RegExp.$1] = true; |
| - } |
| + addDefaults(expected); |
| + |
| + let filter = Filter.fromText(text); |
| + if (postInit) |
| + postInit(filter); |
| + let result = serializeFilter(filter); |
| + assert.equal(result.sort().join("\n"), expected.sort().join("\n"), text); |
| - function addProperty(prop, value) |
| - { |
| - if (!(prop in hasProperty)) |
| - expected.push(prop + "=" + value); |
| + // Test round-trip |
| + let filter2; |
| + let buffer = [...filter.serialize()]; |
| + if (buffer.length) |
| + { |
| + let map = Object.create(null); |
| + for (let line of buffer.slice(1)) |
| + { |
| + if (/(.*?)=(.*)/.test(line)) |
| + map[RegExp.$1] = RegExp.$2; |
| + } |
| + filter2 = Filter.fromObject(map); |
| + } |
| + else |
| + filter2 = Filter.fromText(filter.text); |
| + |
| + assert.equal(serializeFilter(filter).join("\n"), serializeFilter(filter2).join("\n"), text + " deserialization"); |
| } |
| - if (type == "whitelist" || type == "filterlist" || type == "elemhide" || |
| - type == "elemhideexception" || type == "elemhideemulation" || |
| - type == "snippet") |
| - { |
| - addProperty("disabled", "false"); |
| - addProperty("lastHit", "0"); |
| - addProperty("hitCount", "0"); |
| - } |
| - if (type == "whitelist" || type == "filterlist") |
| + it("Definitions", () => |
| { |
| - addProperty("contentType", 0x7FFFFFFF & ~( |
| - t.CSP | t.DOCUMENT | t.ELEMHIDE | t.POPUP | t.GENERICHIDE | t.GENERICBLOCK |
| - )); |
| - addProperty("regexp", "null"); |
| - addProperty("matchCase", "false"); |
| - addProperty("thirdParty", "null"); |
| - addProperty("domains", ""); |
| - addProperty("sitekeys", ""); |
| - } |
| - if (type == "filterlist") |
| - { |
| - addProperty("collapse", "null"); |
| - addProperty("csp", "null"); |
| - addProperty("rewrite", "null"); |
| - } |
| - if (type == "elemhide" || type == "elemhideexception" || |
| - type == "elemhideemulation") |
| + assert.equal(typeof Filter, "function", "typeof Filter"); |
| + assert.equal(typeof InvalidFilter, "function", "typeof InvalidFilter"); |
| + assert.equal(typeof CommentFilter, "function", "typeof CommentFilter"); |
| + assert.equal(typeof ActiveFilter, "function", "typeof ActiveFilter"); |
| + assert.equal(typeof RegExpFilter, "function", "typeof RegExpFilter"); |
| + assert.equal(typeof BlockingFilter, "function", "typeof BlockingFilter"); |
| + assert.equal(typeof ContentFilter, "function", "typeof ContentFilter"); |
| + assert.equal(typeof WhitelistFilter, "function", "typeof WhitelistFilter"); |
| + assert.equal(typeof ElemHideBase, "function", "typeof ElemHideBase"); |
| + assert.equal(typeof ElemHideFilter, "function", "typeof ElemHideFilter"); |
| + assert.equal(typeof ElemHideException, |
| + "function", "typeof ElemHideException"); |
| + assert.equal(typeof ElemHideEmulationFilter, "function", |
| + "typeof ElemHideEmulationFilter"); |
| + assert.equal(typeof SnippetFilter, "function", "typeof SnippetFilter"); |
| + }); |
| + |
| + it("Comments", () => |
| { |
| - addProperty("selectorDomains", ""); |
| - addProperty("domains", ""); |
| - } |
| - if (type == "snippet") |
| + compareFilter("!asdf", ["type=comment", "text=!asdf"]); |
| + compareFilter("!foo#bar", ["type=comment", "text=!foo#bar"]); |
| + compareFilter("!foo##bar", ["type=comment", "text=!foo##bar"]); |
| + }); |
| + |
| + it("Invalid Filters", () => |
| { |
| - addProperty("scriptDomains", ""); |
| - addProperty("domains", ""); |
| - } |
| -} |
| - |
| -function compareFilter(test, text, expected, postInit) |
| -{ |
| - addDefaults(expected); |
| + compareFilter("/??/", ["type=invalid", "text=/??/", "reason=filter_invalid_regexp"]); |
| + compareFilter("asd$foobar", ["type=invalid", "text=asd$foobar", "reason=filter_unknown_option"]); |
| - let filter = Filter.fromText(text); |
| - if (postInit) |
| - postInit(filter); |
| - let result = serializeFilter(filter); |
| - test.equal(result.sort().join("\n"), expected.sort().join("\n"), text); |
| + // No $domain or $~third-party |
| + compareFilter("||example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=||example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| + compareFilter("*example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=*example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| + compareFilter("example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| + // Patterns not starting with || or * |
| + compareFilter("example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com", "reason=filter_invalid_rewrite"]); |
| + compareFilter("example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "reason=filter_invalid_rewrite"]); |
| + // $~third-party requires || |
| + compareFilter("*example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=invalid", "text=*example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "reason=filter_invalid_rewrite"]); |
| - // Test round-trip |
| - let filter2; |
| - let buffer = [...filter.serialize()]; |
| - if (buffer.length) |
| - { |
| - let map = Object.create(null); |
| - for (let line of buffer.slice(1)) |
| + function checkElemHideEmulationFilterInvalid(domains) |
| { |
| - if (/(.*?)=(.*)/.test(line)) |
| - map[RegExp.$1] = RegExp.$2; |
| + let filterText = domains + "#?#:-abp-properties(abc)"; |
| + compareFilter( |
| + filterText, [ |
| + "type=invalid", "text=" + filterText, |
| + "reason=filter_elemhideemulation_nodomain" |
| + ] |
| + ); |
| } |
| - filter2 = Filter.fromObject(map); |
| - } |
| - else |
| - filter2 = Filter.fromText(filter.text); |
| + checkElemHideEmulationFilterInvalid(""); |
| + checkElemHideEmulationFilterInvalid("~foo.com"); |
| + checkElemHideEmulationFilterInvalid("~foo.com,~bar.com"); |
| + checkElemHideEmulationFilterInvalid("foo"); |
| + checkElemHideEmulationFilterInvalid("~foo.com,bar"); |
| + }); |
| - test.equal(serializeFilter(filter).join("\n"), serializeFilter(filter2).join("\n"), text + " deserialization"); |
| -} |
| + it("Filters with State", () => |
| + { |
| + compareFilter("blabla", ["type=filterlist", "text=blabla"]); |
| + compareFilter( |
| + "blabla_default", ["type=filterlist", "text=blabla_default"], |
| + filter => |
| + { |
| + filter.disabled = false; |
| + filter.hitCount = 0; |
| + filter.lastHit = 0; |
| + } |
| + ); |
| + compareFilter( |
| + "blabla_non_default", |
| + ["type=filterlist", "text=blabla_non_default", "disabled=true", "hitCount=12", "lastHit=20"], |
| + filter => |
| + { |
| + filter.disabled = true; |
| + filter.hitCount = 12; |
| + filter.lastHit = 20; |
| + } |
| + ); |
| + }); |
| + |
| + it("Special Characters", () => |
| + { |
| + compareFilter("/ddd|f?a[s]d/", ["type=filterlist", "text=/ddd|f?a[s]d/", "regexp=ddd|f?a[s]d"]); |
| + compareFilter("*asdf*d**dd*", ["type=filterlist", "text=*asdf*d**dd*", "regexp=asdf.*d.*dd"]); |
| + compareFilter("|*asd|f*d**dd*|", ["type=filterlist", "text=|*asd|f*d**dd*|", "regexp=^.*asd\\|f.*d.*dd.*$"]); |
| + compareFilter("dd[]{}$%<>&()*d", ["type=filterlist", "text=dd[]{}$%<>&()*d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\).*d"]); |
| + |
| + // Leading and trailing wildcards should be left in for rewrite filters (#6868). |
| + compareFilter("*asdf*d**dd*$rewrite=", ["type=filterlist", "text=*asdf*d**dd*$rewrite=", "regexp=.*asdf.*d.*dd.*", "rewrite=", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.SUBDOCUMENT | t.OBJECT | t.OBJECT_SUBREQUEST))]); |
| -exports.testFilterClassDefinitions = function(test) |
| -{ |
| - test.equal(typeof Filter, "function", "typeof Filter"); |
| - test.equal(typeof InvalidFilter, "function", "typeof InvalidFilter"); |
| - test.equal(typeof CommentFilter, "function", "typeof CommentFilter"); |
| - test.equal(typeof ActiveFilter, "function", "typeof ActiveFilter"); |
| - test.equal(typeof RegExpFilter, "function", "typeof RegExpFilter"); |
| - test.equal(typeof BlockingFilter, "function", "typeof BlockingFilter"); |
| - test.equal(typeof ContentFilter, "function", "typeof ContentFilter"); |
| - test.equal(typeof WhitelistFilter, "function", "typeof WhitelistFilter"); |
| - test.equal(typeof ElemHideBase, "function", "typeof ElemHideBase"); |
| - test.equal(typeof ElemHideFilter, "function", "typeof ElemHideFilter"); |
| - test.equal(typeof ElemHideException, "function", "typeof ElemHideException"); |
| - test.equal(typeof ElemHideEmulationFilter, "function", |
| - "typeof ElemHideEmulationFilter"); |
| - test.equal(typeof SnippetFilter, "function", "typeof SnippetFilter"); |
| + compareFilter("@@/ddd|f?a[s]d/", ["type=whitelist", "text=@@/ddd|f?a[s]d/", "regexp=ddd|f?a[s]d", "contentType=" + defaultTypes]); |
| + compareFilter("@@*asdf*d**dd*", ["type=whitelist", "text=@@*asdf*d**dd*", "regexp=asdf.*d.*dd", "contentType=" + defaultTypes]); |
| + compareFilter("@@|*asd|f*d**dd*|", ["type=whitelist", "text=@@|*asd|f*d**dd*|", "regexp=^.*asd\\|f.*d.*dd.*$", "contentType=" + defaultTypes]); |
| + compareFilter("@@dd[]{}$%<>&()*d", ["type=whitelist", "text=@@dd[]{}$%<>&()*d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\).*d", "contentType=" + defaultTypes]); |
| + }); |
| + |
| + it("Filter Options", () => |
| + { |
| + compareFilter("bla$match-case,csp=first csp,script,other,third-party,domain=FOO.cOm,sitekey=foo", ["type=filterlist", "text=bla$match-case,csp=first csp,script,other,third-party,domain=FOO.cOm,sitekey=foo", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=foo.com", "sitekeys=FOO", "csp=first csp"]); |
| + compareFilter("bla$~match-case,~csp=csp,~script,~other,~third-party,domain=~bAr.coM", ["type=filterlist", "text=bla$~match-case,~csp=csp,~script,~other,~third-party,domain=~bAr.coM", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER)), "thirdParty=false", "domains=~bar.com"]); |
| + compareFilter("@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bAR.foO.Com|~Foo.Bar.com,csp=c s p,sitekey=foo|bar", ["type=whitelist", "text=@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bAR.foO.Com|~Foo.Bar.com,csp=c s p,sitekey=foo|bar", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=bar.com|foo.com|~bar.foo.com|~foo.bar.com", "sitekeys=BAR|FOO"]); |
| + compareFilter("@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.bar.com,sitekey=foo|bar", ["type=whitelist", "text=@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.bar.com,sitekey=foo|bar", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER), "thirdParty=true", "domains=bar.com|foo.com|~bar.foo.com|~foo.bar.com", "sitekeys=BAR|FOO"]); |
| + compareFilter("||content.server.com/files/*.php$rewrite=$1", ["type=filterlist", "text=||content.server.com/files/*.php$rewrite=$1", "regexp=^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?content\\.server\\.com\\/files\\/.*\\.php", "matchCase=false", "rewrite=$1", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.SUBDOCUMENT | t.OBJECT | t.OBJECT_SUBREQUEST))]); |
| + |
| + compareFilter("||example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", ["type=filterlist", "text=||example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "contentType=" + (defaultTypes), "domains=bar.com|foo.com"]); |
| + compareFilter("*example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", ["type=filterlist", "text=*example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "contentType=" + (defaultTypes), "domains=bar.com|foo.com"]); |
| + compareFilter("||example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=filterlist", "text=||example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "thirdParty=false", "contentType=" + (defaultTypes)]); |
| - test.done(); |
| -}; |
| + // background and image should be the same for backwards compatibility |
| + compareFilter("bla$image", ["type=filterlist", "text=bla$image", "contentType=" + (t.IMAGE)]); |
| + compareFilter("bla$background", ["type=filterlist", "text=bla$background", "contentType=" + (t.IMAGE)]); |
| + compareFilter("bla$~image", ["type=filterlist", "text=bla$~image", "contentType=" + (defaultTypes & ~t.IMAGE)]); |
| + compareFilter("bla$~background", ["type=filterlist", "text=bla$~background", "contentType=" + (defaultTypes & ~t.IMAGE)]); |
| + |
| + compareFilter("@@bla$~script,~other", ["type=whitelist", "text=@@bla$~script,~other", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| + compareFilter("@@http://bla$~script,~other", ["type=whitelist", "text=@@http://bla$~script,~other", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| + compareFilter("@@|ftp://bla$~script,~other", ["type=whitelist", "text=@@|ftp://bla$~script,~other", "regexp=^ftp\\:\\/\\/bla", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| + compareFilter("@@bla$~script,~other,document", ["type=whitelist", "text=@@bla$~script,~other,document", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER) | t.DOCUMENT)]); |
| + compareFilter("@@bla$~script,~other,~document", ["type=whitelist", "text=@@bla$~script,~other,~document", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| + compareFilter("@@bla$document", ["type=whitelist", "text=@@bla$document", "contentType=" + t.DOCUMENT]); |
| + compareFilter("@@bla$~script,~other,elemhide", ["type=whitelist", "text=@@bla$~script,~other,elemhide", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER) | t.ELEMHIDE)]); |
| + compareFilter("@@bla$~script,~other,~elemhide", ["type=whitelist", "text=@@bla$~script,~other,~elemhide", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| + compareFilter("@@bla$elemhide", ["type=whitelist", "text=@@bla$elemhide", "contentType=" + t.ELEMHIDE]); |
| + |
| + compareFilter("@@bla$~script,~other,donottrack", ["type=invalid", "text=@@bla$~script,~other,donottrack", "reason=filter_unknown_option"]); |
| + compareFilter("@@bla$~script,~other,~donottrack", ["type=invalid", "text=@@bla$~script,~other,~donottrack", "reason=filter_unknown_option"]); |
| + compareFilter("@@bla$donottrack", ["type=invalid", "text=@@bla$donottrack", "reason=filter_unknown_option"]); |
| + compareFilter("@@bla$foobar", ["type=invalid", "text=@@bla$foobar", "reason=filter_unknown_option"]); |
| + compareFilter("@@bla$image,foobar", ["type=invalid", "text=@@bla$image,foobar", "reason=filter_unknown_option"]); |
| + compareFilter("@@bla$foobar,image", ["type=invalid", "text=@@bla$foobar,image", "reason=filter_unknown_option"]); |
| -exports.testComments = function(test) |
| -{ |
| - compareFilter(test, "!asdf", ["type=comment", "text=!asdf"]); |
| - compareFilter(test, "!foo#bar", ["type=comment", "text=!foo#bar"]); |
| - compareFilter(test, "!foo##bar", ["type=comment", "text=!foo##bar"]); |
| + compareFilter("bla$csp", ["type=invalid", "text=bla$csp", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=", ["type=invalid", "text=bla$csp=", "reason=filter_invalid_csp"]); |
| + |
| + // Blank CSP values are allowed for whitelist filters. |
| + compareFilter("@@bla$csp", ["type=whitelist", "text=@@bla$csp", "contentType=" + t.CSP]); |
| + compareFilter("@@bla$csp=", ["type=whitelist", "text=@@bla$csp=", "contentType=" + t.CSP]); |
| + |
| + compareFilter("bla$csp=report-uri", ["type=invalid", "text=bla$csp=report-uri", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=foo,csp=report-to", ["type=invalid", "text=bla$csp=foo,csp=report-to", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=foo,csp=referrer foo", ["type=invalid", "text=bla$csp=foo,csp=referrer foo", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=foo,csp=base-uri", ["type=invalid", "text=bla$csp=foo,csp=base-uri", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=foo,csp=upgrade-insecure-requests", ["type=invalid", "text=bla$csp=foo,csp=upgrade-insecure-requests", "reason=filter_invalid_csp"]); |
| + compareFilter("bla$csp=foo,csp=ReFeRReR", ["type=invalid", "text=bla$csp=foo,csp=ReFeRReR", "reason=filter_invalid_csp"]); |
| + }); |
| - test.done(); |
| -}; |
| + it("Element Hiding Rules", () => |
| + { |
| + compareFilter("##ddd", ["type=elemhide", "text=##ddd", "selector=ddd"]); |
| + compareFilter("##body > div:first-child", ["type=elemhide", "text=##body > div:first-child", "selector=body > div:first-child"]); |
| + compareFilter("fOO##ddd", ["type=elemhide", "text=fOO##ddd", "selectorDomains=foo", "selector=ddd", "domains=foo"]); |
| + compareFilter("Foo,bAr##ddd", ["type=elemhide", "text=Foo,bAr##ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); |
| + compareFilter("foo,~baR##ddd", ["type=elemhide", "text=foo,~baR##ddd", "selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); |
| + compareFilter("foo,~baz,bar##ddd", ["type=elemhide", "text=foo,~baz,bar##ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~baz"]); |
| + }); |
| -exports.testInvalidFilters = function(test) |
| -{ |
| - compareFilter(test, "/??/", ["type=invalid", "text=/??/", "reason=filter_invalid_regexp"]); |
| - compareFilter(test, "asd$foobar", ["type=invalid", "text=asd$foobar", "reason=filter_unknown_option"]); |
| + it("Element Hiding Exceptions", () => |
| + { |
| + compareFilter("#@#ddd", ["type=elemhideexception", "text=#@#ddd", "selector=ddd"]); |
| + compareFilter("#@#body > div:first-child", ["type=elemhideexception", "text=#@#body > div:first-child", "selector=body > div:first-child"]); |
| + compareFilter("fOO#@#ddd", ["type=elemhideexception", "text=fOO#@#ddd", "selectorDomains=foo", "selector=ddd", "domains=foo"]); |
| + compareFilter("Foo,bAr#@#ddd", ["type=elemhideexception", "text=Foo,bAr#@#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); |
| + compareFilter("foo,~baR#@#ddd", ["type=elemhideexception", "text=foo,~baR#@#ddd", "selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); |
| + compareFilter("foo,~baz,bar#@#ddd", ["type=elemhideexception", "text=foo,~baz,bar#@#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~baz"]); |
| + }); |
| - // No $domain or $~third-party |
| - compareFilter(test, "||example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=||example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| - compareFilter(test, "*example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=*example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| - compareFilter(test, "example.com/ad.js$rewrite=abp-resource:noopjs", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs", "reason=filter_invalid_rewrite"]); |
| - // Patterns not starting with || or * |
| - compareFilter(test, "example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com", "reason=filter_invalid_rewrite"]); |
| - compareFilter(test, "example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=invalid", "text=example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "reason=filter_invalid_rewrite"]); |
| - // $~third-party requires || |
| - compareFilter(test, "*example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=invalid", "text=*example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "reason=filter_invalid_rewrite"]); |
| + it("Element Hiding Emulation Filters", () => |
| + { |
| + // Check valid domain combinations |
| + compareFilter("fOO.cOm#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=fOO.cOm#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com"]); |
| + compareFilter("Foo.com,~bAr.com#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=Foo.com,~bAr.com#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com|~bar.com"]); |
| + compareFilter("foo.com,~baR#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=foo.com,~baR#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com|~bar"]); |
| + compareFilter("~foo.com,bar.com#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=~foo.com,bar.com#?#:-abp-properties(abc)", "selectorDomains=bar.com", "selector=:-abp-properties(abc)", "domains=bar.com|~foo.com"]); |
| + |
| + // Check some special cases |
| + compareFilter("#?#:-abp-properties(abc)", ["type=invalid", "text=#?#:-abp-properties(abc)", "reason=filter_elemhideemulation_nodomain"]); |
| + compareFilter("foo.com#?#abc", ["type=elemhideemulation", "text=foo.com#?#abc", "selectorDomains=foo.com", "selector=abc", "domains=foo.com"]); |
| + compareFilter("foo.com#?#:-abp-foobar(abc)", ["type=elemhideemulation", "text=foo.com#?#:-abp-foobar(abc)", "selectorDomains=foo.com", "selector=:-abp-foobar(abc)", "domains=foo.com"]); |
| + compareFilter("foo.com#?#aaa :-abp-properties(abc) bbb", ["type=elemhideemulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "selectorDomains=foo.com", "selector=aaa :-abp-properties(abc) bbb", "domains=foo.com"]); |
| + compareFilter("foo.com#?#:-abp-properties(|background-image: url(data:*))", ["type=elemhideemulation", "text=foo.com#?#:-abp-properties(|background-image: url(data:*))", "selectorDomains=foo.com", "selector=:-abp-properties(|background-image: url(data:*))", "domains=foo.com"]); |
| + |
| + // Support element hiding emulation filters for localhost (#6931). |
| + compareFilter("localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost"]); |
| + compareFilter("localhost,~www.localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=localhost,~www.localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost|~www.localhost"]); |
| + compareFilter("~www.localhost,localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=~www.localhost,localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost|~www.localhost"]); |
| + }); |
| - function checkElemHideEmulationFilterInvalid(domains) |
| + it("Empty ElemeHide domains", () => |
| { |
| - let filterText = domains + "#?#:-abp-properties(abc)"; |
| + let emptyDomainFilters = [ |
| + ",##selector", ",,,##selector", "~,foo.com##selector", "foo.com,##selector", |
| + ",foo.com##selector", "foo.com,~##selector", |
| + "foo.com,,bar.com##selector", "foo.com,~,bar.com##selector" |
| + ]; |
| + |
| + for (let filterText of emptyDomainFilters) |
| + { |
| + let filter = Filter.fromText(filterText); |
| + assert.ok(filter instanceof InvalidFilter); |
| + assert.equal(filter.reason, "filter_invalid_domain"); |
| + } |
| + }); |
| + |
| + it("ElemHide rules with braces", () => |
| + { |
| compareFilter( |
| - test, filterText, [ |
| - "type=invalid", "text=" + filterText, |
| - "reason=filter_elemhideemulation_nodomain" |
| + "###foo{color: red}", [ |
| + "type=elemhide", |
| + "text=###foo{color: red}", |
| + "selectorDomains=", |
| + "selector=#foo{color: red}", |
| + "domains=" |
| ] |
| ); |
| - } |
| - checkElemHideEmulationFilterInvalid(""); |
| - checkElemHideEmulationFilterInvalid("~foo.com"); |
| - checkElemHideEmulationFilterInvalid("~foo.com,~bar.com"); |
| - checkElemHideEmulationFilterInvalid("foo"); |
| - checkElemHideEmulationFilterInvalid("~foo.com,bar"); |
| - |
| - test.done(); |
| -}; |
| - |
| -exports.testFiltersWithState = function(test) |
| -{ |
| - compareFilter(test, "blabla", ["type=filterlist", "text=blabla"]); |
| - compareFilter( |
| - test, "blabla_default", ["type=filterlist", "text=blabla_default"], |
| - filter => |
| - { |
| - filter.disabled = false; |
| - filter.hitCount = 0; |
| - filter.lastHit = 0; |
| - } |
| - ); |
| - compareFilter( |
| - test, "blabla_non_default", |
| - ["type=filterlist", "text=blabla_non_default", "disabled=true", "hitCount=12", "lastHit=20"], |
| - filter => |
| - { |
| - filter.disabled = true; |
| - filter.hitCount = 12; |
| - filter.lastHit = 20; |
| - } |
| - ); |
| - |
| - test.done(); |
| -}; |
| + compareFilter( |
| + "foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", [ |
| + "type=elemhideemulation", |
| + "text=foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", |
| + "selectorDomains=foo.com", |
| + "selector=:-abp-properties(/margin: [3-4]{2}/)", |
| + "domains=foo.com" |
| + ] |
| + ); |
| + }); |
| -exports.testSpecialCharacters = function(test) |
| -{ |
| - compareFilter(test, "/ddd|f?a[s]d/", ["type=filterlist", "text=/ddd|f?a[s]d/", "regexp=ddd|f?a[s]d"]); |
| - compareFilter(test, "*asdf*d**dd*", ["type=filterlist", "text=*asdf*d**dd*", "regexp=asdf.*d.*dd"]); |
| - compareFilter(test, "|*asd|f*d**dd*|", ["type=filterlist", "text=|*asd|f*d**dd*|", "regexp=^.*asd\\|f.*d.*dd.*$"]); |
| - compareFilter(test, "dd[]{}$%<>&()*d", ["type=filterlist", "text=dd[]{}$%<>&()*d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\).*d"]); |
| - |
| - // Leading and trailing wildcards should be left in for rewrite filters (#6868). |
| - compareFilter(test, "*asdf*d**dd*$rewrite=", ["type=filterlist", "text=*asdf*d**dd*$rewrite=", "regexp=.*asdf.*d.*dd.*", "rewrite=", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.SUBDOCUMENT | t.OBJECT | t.OBJECT_SUBREQUEST))]); |
| - |
| - compareFilter(test, "@@/ddd|f?a[s]d/", ["type=whitelist", "text=@@/ddd|f?a[s]d/", "regexp=ddd|f?a[s]d", "contentType=" + defaultTypes]); |
| - compareFilter(test, "@@*asdf*d**dd*", ["type=whitelist", "text=@@*asdf*d**dd*", "regexp=asdf.*d.*dd", "contentType=" + defaultTypes]); |
| - compareFilter(test, "@@|*asd|f*d**dd*|", ["type=whitelist", "text=@@|*asd|f*d**dd*|", "regexp=^.*asd\\|f.*d.*dd.*$", "contentType=" + defaultTypes]); |
| - compareFilter(test, "@@dd[]{}$%<>&()*d", ["type=whitelist", "text=@@dd[]{}$%<>&()*d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\).*d", "contentType=" + defaultTypes]); |
| - |
| - test.done(); |
| -}; |
| + it("Snippet Filters", () => |
| + { |
| + compareFilter("foo.com#$#abc", ["type=snippet", "text=foo.com#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com"]); |
| + compareFilter("foo.com,~bar.com#$#abc", ["type=snippet", "text=foo.com,~bar.com#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com|~bar.com"]); |
| + compareFilter("foo.com,~bar#$#abc", ["type=snippet", "text=foo.com,~bar#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com|~bar"]); |
| + compareFilter("~foo.com,bar.com#$#abc", ["type=snippet", "text=~foo.com,bar.com#$#abc", "scriptDomains=bar.com", "script=abc", "domains=bar.com|~foo.com"]); |
| + }); |
| -exports.testFilterOptions = function(test) |
| -{ |
| - compareFilter(test, "bla$match-case,csp=first csp,script,other,third-party,domain=FOO.cOm,sitekey=foo", ["type=filterlist", "text=bla$match-case,csp=first csp,script,other,third-party,domain=FOO.cOm,sitekey=foo", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=foo.com", "sitekeys=FOO", "csp=first csp"]); |
| - compareFilter(test, "bla$~match-case,~csp=csp,~script,~other,~third-party,domain=~bAr.coM", ["type=filterlist", "text=bla$~match-case,~csp=csp,~script,~other,~third-party,domain=~bAr.coM", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER)), "thirdParty=false", "domains=~bar.com"]); |
| - compareFilter(test, "@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bAR.foO.Com|~Foo.Bar.com,csp=c s p,sitekey=foo|bar", ["type=whitelist", "text=@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bAR.foO.Com|~Foo.Bar.com,csp=c s p,sitekey=foo|bar", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=bar.com|foo.com|~bar.foo.com|~foo.bar.com", "sitekeys=BAR|FOO"]); |
| - compareFilter(test, "@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.bar.com,sitekey=foo|bar", ["type=whitelist", "text=@@bla$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.bar.com,sitekey=foo|bar", "matchCase=true", "contentType=" + (t.SCRIPT | t.OTHER), "thirdParty=true", "domains=bar.com|foo.com|~bar.foo.com|~foo.bar.com", "sitekeys=BAR|FOO"]); |
| - compareFilter(test, "||content.server.com/files/*.php$rewrite=$1", ["type=filterlist", "text=||content.server.com/files/*.php$rewrite=$1", "regexp=^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?content\\.server\\.com\\/files\\/.*\\.php", "matchCase=false", "rewrite=$1", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.SUBDOCUMENT | t.OBJECT | t.OBJECT_SUBREQUEST))]); |
| - |
| - compareFilter(test, "||example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", ["type=filterlist", "text=||example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "contentType=" + (defaultTypes), "domains=bar.com|foo.com"]); |
| - compareFilter(test, "*example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", ["type=filterlist", "text=*example.com/ad.js$rewrite=abp-resource:noopjs,domain=foo.com|bar.com", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "contentType=" + (defaultTypes), "domains=bar.com|foo.com"]); |
| - compareFilter(test, "||example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", ["type=filterlist", "text=||example.com/ad.js$rewrite=abp-resource:noopjs,~third-party", "regexp=null", "matchCase=false", "rewrite=abp-resource:noopjs", "thirdParty=false", "contentType=" + (defaultTypes)]); |
| + it("Filter normalization", () => |
| + { |
| + // Line breaks etc |
| + assert.equal(Filter.normalize("\n\t\nad\ns"), |
| + "ads"); |
| - // background and image should be the same for backwards compatibility |
| - compareFilter(test, "bla$image", ["type=filterlist", "text=bla$image", "contentType=" + (t.IMAGE)]); |
| - compareFilter(test, "bla$background", ["type=filterlist", "text=bla$background", "contentType=" + (t.IMAGE)]); |
| - compareFilter(test, "bla$~image", ["type=filterlist", "text=bla$~image", "contentType=" + (defaultTypes & ~t.IMAGE)]); |
| - compareFilter(test, "bla$~background", ["type=filterlist", "text=bla$~background", "contentType=" + (defaultTypes & ~t.IMAGE)]); |
| + // Comment filters |
| + assert.equal(Filter.normalize(" ! fo o## bar "), |
| + "! fo o## bar"); |
| - compareFilter(test, "@@bla$~script,~other", ["type=whitelist", "text=@@bla$~script,~other", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| - compareFilter(test, "@@http://bla$~script,~other", ["type=whitelist", "text=@@http://bla$~script,~other", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| - compareFilter(test, "@@|ftp://bla$~script,~other", ["type=whitelist", "text=@@|ftp://bla$~script,~other", "regexp=^ftp\\:\\/\\/bla", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| - compareFilter(test, "@@bla$~script,~other,document", ["type=whitelist", "text=@@bla$~script,~other,document", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER) | t.DOCUMENT)]); |
| - compareFilter(test, "@@bla$~script,~other,~document", ["type=whitelist", "text=@@bla$~script,~other,~document", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| - compareFilter(test, "@@bla$document", ["type=whitelist", "text=@@bla$document", "contentType=" + t.DOCUMENT]); |
| - compareFilter(test, "@@bla$~script,~other,elemhide", ["type=whitelist", "text=@@bla$~script,~other,elemhide", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER) | t.ELEMHIDE)]); |
| - compareFilter(test, "@@bla$~script,~other,~elemhide", ["type=whitelist", "text=@@bla$~script,~other,~elemhide", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHER))]); |
| - compareFilter(test, "@@bla$elemhide", ["type=whitelist", "text=@@bla$elemhide", "contentType=" + t.ELEMHIDE]); |
| + // Element hiding filters |
| + assert.equal(Filter.normalize(" domain.c om## # sele ctor "), |
| + "domain.com### sele ctor"); |
| + |
| + // Element hiding emulation filters |
| + assert.equal(Filter.normalize(" domain.c om#?# # sele ctor "), |
| + "domain.com#?## sele ctor"); |
| - compareFilter(test, "@@bla$~script,~other,donottrack", ["type=invalid", "text=@@bla$~script,~other,donottrack", "reason=filter_unknown_option"]); |
| - compareFilter(test, "@@bla$~script,~other,~donottrack", ["type=invalid", "text=@@bla$~script,~other,~donottrack", "reason=filter_unknown_option"]); |
| - compareFilter(test, "@@bla$donottrack", ["type=invalid", "text=@@bla$donottrack", "reason=filter_unknown_option"]); |
| - compareFilter(test, "@@bla$foobar", ["type=invalid", "text=@@bla$foobar", "reason=filter_unknown_option"]); |
| - compareFilter(test, "@@bla$image,foobar", ["type=invalid", "text=@@bla$image,foobar", "reason=filter_unknown_option"]); |
| - compareFilter(test, "@@bla$foobar,image", ["type=invalid", "text=@@bla$foobar,image", "reason=filter_unknown_option"]); |
| - |
| - compareFilter(test, "bla$csp", ["type=invalid", "text=bla$csp", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=", ["type=invalid", "text=bla$csp=", "reason=filter_invalid_csp"]); |
| - |
| - // Blank CSP values are allowed for whitelist filters. |
| - compareFilter(test, "@@bla$csp", ["type=whitelist", "text=@@bla$csp", "contentType=" + t.CSP]); |
| - compareFilter(test, "@@bla$csp=", ["type=whitelist", "text=@@bla$csp=", "contentType=" + t.CSP]); |
| + // Incorrect syntax: the separator "#?#" cannot contain spaces; treated as a |
| + // regular filter instead |
| + assert.equal(Filter.normalize(" domain.c om# ?#. sele ctor "), |
| + "domain.com#?#.selector"); |
| + // Incorrect syntax: the separator "#?#" cannot contain spaces; treated as an |
| + // element hiding filter instead, because the "##" following the "?" is taken |
| + // to be the separator instead |
| + assert.equal(Filter.normalize(" domain.c om# ?##sele ctor "), |
| + "domain.com#?##sele ctor"); |
| - compareFilter(test, "bla$csp=report-uri", ["type=invalid", "text=bla$csp=report-uri", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=foo,csp=report-to", ["type=invalid", "text=bla$csp=foo,csp=report-to", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=foo,csp=referrer foo", ["type=invalid", "text=bla$csp=foo,csp=referrer foo", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=foo,csp=base-uri", ["type=invalid", "text=bla$csp=foo,csp=base-uri", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=foo,csp=upgrade-insecure-requests", ["type=invalid", "text=bla$csp=foo,csp=upgrade-insecure-requests", "reason=filter_invalid_csp"]); |
| - compareFilter(test, "bla$csp=foo,csp=ReFeRReR", ["type=invalid", "text=bla$csp=foo,csp=ReFeRReR", "reason=filter_invalid_csp"]); |
| - |
| - test.done(); |
| -}; |
| + // Element hiding exception filters |
| + assert.equal(Filter.normalize(" domain.c om#@# # sele ctor "), |
| + "domain.com#@## sele ctor"); |
| -exports.testElementHidingRules = function(test) |
| -{ |
| - compareFilter(test, "##ddd", ["type=elemhide", "text=##ddd", "selector=ddd"]); |
| - compareFilter(test, "##body > div:first-child", ["type=elemhide", "text=##body > div:first-child", "selector=body > div:first-child"]); |
| - compareFilter(test, "fOO##ddd", ["type=elemhide", "text=fOO##ddd", "selectorDomains=foo", "selector=ddd", "domains=foo"]); |
| - compareFilter(test, "Foo,bAr##ddd", ["type=elemhide", "text=Foo,bAr##ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); |
| - compareFilter(test, "foo,~baR##ddd", ["type=elemhide", "text=foo,~baR##ddd", "selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); |
| - compareFilter(test, "foo,~baz,bar##ddd", ["type=elemhide", "text=foo,~baz,bar##ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~baz"]); |
| - |
| - test.done(); |
| -}; |
| + // Incorrect syntax: the separator "#@#" cannot contain spaces; treated as a |
| + // regular filter instead (not an element hiding filter either!), because |
| + // unlike the case with "# ?##" the "##" following the "@" is not considered |
| + // to be a separator |
| + assert.equal(Filter.normalize(" domain.c om# @## sele ctor "), |
| + "domain.com#@##selector"); |
| -exports.testElementHidingExceptions = function(test) |
| -{ |
| - compareFilter(test, "#@#ddd", ["type=elemhideexception", "text=#@#ddd", "selector=ddd"]); |
| - compareFilter(test, "#@#body > div:first-child", ["type=elemhideexception", "text=#@#body > div:first-child", "selector=body > div:first-child"]); |
| - compareFilter(test, "fOO#@#ddd", ["type=elemhideexception", "text=fOO#@#ddd", "selectorDomains=foo", "selector=ddd", "domains=foo"]); |
| - compareFilter(test, "Foo,bAr#@#ddd", ["type=elemhideexception", "text=Foo,bAr#@#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); |
| - compareFilter(test, "foo,~baR#@#ddd", ["type=elemhideexception", "text=foo,~baR#@#ddd", "selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); |
| - compareFilter(test, "foo,~baz,bar#@#ddd", ["type=elemhideexception", "text=foo,~baz,bar#@#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~baz"]); |
| - |
| - test.done(); |
| -}; |
| - |
| -exports.testElemHideEmulationFilters = function(test) |
| -{ |
| - // Check valid domain combinations |
| - compareFilter(test, "fOO.cOm#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=fOO.cOm#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com"]); |
| - compareFilter(test, "Foo.com,~bAr.com#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=Foo.com,~bAr.com#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com|~bar.com"]); |
| - compareFilter(test, "foo.com,~baR#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=foo.com,~baR#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector=:-abp-properties(abc)", "domains=foo.com|~bar"]); |
| - compareFilter(test, "~foo.com,bar.com#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=~foo.com,bar.com#?#:-abp-properties(abc)", "selectorDomains=bar.com", "selector=:-abp-properties(abc)", "domains=bar.com|~foo.com"]); |
| + // Snippet filters |
| + assert.equal(Filter.normalize(" domain.c om#$# sni pp et "), |
| + "domain.com#$#sni pp et"); |
| - // Check some special cases |
| - compareFilter(test, "#?#:-abp-properties(abc)", ["type=invalid", "text=#?#:-abp-properties(abc)", "reason=filter_elemhideemulation_nodomain"]); |
| - compareFilter(test, "foo.com#?#abc", ["type=elemhideemulation", "text=foo.com#?#abc", "selectorDomains=foo.com", "selector=abc", "domains=foo.com"]); |
| - compareFilter(test, "foo.com#?#:-abp-foobar(abc)", ["type=elemhideemulation", "text=foo.com#?#:-abp-foobar(abc)", "selectorDomains=foo.com", "selector=:-abp-foobar(abc)", "domains=foo.com"]); |
| - compareFilter(test, "foo.com#?#aaa :-abp-properties(abc) bbb", ["type=elemhideemulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "selectorDomains=foo.com", "selector=aaa :-abp-properties(abc) bbb", "domains=foo.com"]); |
| - compareFilter(test, "foo.com#?#:-abp-properties(|background-image: url(data:*))", ["type=elemhideemulation", "text=foo.com#?#:-abp-properties(|background-image: url(data:*))", "selectorDomains=foo.com", "selector=:-abp-properties(|background-image: url(data:*))", "domains=foo.com"]); |
| - |
| - // Support element hiding emulation filters for localhost (#6931). |
| - compareFilter(test, "localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost"]); |
| - compareFilter(test, "localhost,~www.localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=localhost,~www.localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost|~www.localhost"]); |
| - compareFilter(test, "~www.localhost,localhost#?#:-abp-properties(abc)", ["type=elemhideemulation", "text=~www.localhost,localhost#?#:-abp-properties(abc)", "selectorDomains=localhost", "selector=:-abp-properties(abc)", "domains=localhost|~www.localhost"]); |
| - |
| - test.done(); |
| -}; |
| - |
| -exports.testEmptyElemHideDomains = function(test) |
| -{ |
| - let emptyDomainFilters = [ |
| - ",##selector", ",,,##selector", "~,foo.com##selector", "foo.com,##selector", |
| - ",foo.com##selector", "foo.com,~##selector", |
| - "foo.com,,bar.com##selector", "foo.com,~,bar.com##selector" |
| - ]; |
| - |
| - for (let filterText of emptyDomainFilters) |
| - { |
| - let filter = Filter.fromText(filterText); |
| - test.ok(filter instanceof InvalidFilter); |
| - test.equal(filter.reason, "filter_invalid_domain"); |
| - } |
| - |
| - test.done(); |
| -}; |
| + // Regular filters |
| + let normalized = Filter.normalize( |
| + " b$l a$sitekey= foo ,domain= do main.com |foo .com,c sp= c s p " |
| + ); |
| + assert.equal( |
| + normalized, |
| + "b$la$sitekey=foo,domain=domain.com|foo.com,csp=c s p" |
| + ); |
| + compareFilter( |
| + normalized, [ |
| + "type=filterlist", |
| + "text=" + normalized, |
| + "csp=c s p", |
| + "domains=domain.com|foo.com", |
| + "sitekeys=FOO", |
| + "contentType=" + t.CSP |
| + ] |
| + ); |
| -exports.testElemHideRulesWithBraces = function(test) |
| -{ |
| - compareFilter( |
| - test, "###foo{color: red}", [ |
| - "type=elemhide", |
| - "text=###foo{color: red}", |
| - "selectorDomains=", |
| - "selector=#foo{color: red}", |
| - "domains=" |
| - ] |
| - ); |
| - compareFilter( |
| - test, "foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", [ |
| - "type=elemhideemulation", |
| - "text=foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", |
| - "selectorDomains=foo.com", |
| - "selector=:-abp-properties(/margin: [3-4]{2}/)", |
| - "domains=foo.com" |
| - ] |
| - ); |
| - test.done(); |
| -}; |
| - |
| -exports.testSnippetFilters = function(test) |
| -{ |
| - compareFilter(test, "foo.com#$#abc", ["type=snippet", "text=foo.com#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com"]); |
| - compareFilter(test, "foo.com,~bar.com#$#abc", ["type=snippet", "text=foo.com,~bar.com#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com|~bar.com"]); |
| - compareFilter(test, "foo.com,~bar#$#abc", ["type=snippet", "text=foo.com,~bar#$#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com|~bar"]); |
| - compareFilter(test, "~foo.com,bar.com#$#abc", ["type=snippet", "text=~foo.com,bar.com#$#abc", "scriptDomains=bar.com", "script=abc", "domains=bar.com|~foo.com"]); |
| - |
| - test.done(); |
| -}; |
| - |
| -exports.testFilterNormalization = function(test) |
| -{ |
| - // Line breaks etc |
| - test.equal(Filter.normalize("\n\t\nad\ns"), |
| - "ads"); |
| - |
| - // Comment filters |
| - test.equal(Filter.normalize(" ! fo o## bar "), |
| - "! fo o## bar"); |
| - |
| - // Element hiding filters |
| - test.equal(Filter.normalize(" domain.c om## # sele ctor "), |
| - "domain.com### sele ctor"); |
| + // Some $csp edge cases |
| + assert.equal(Filter.normalize("$csp= "), |
| + "$csp="); |
| + assert.equal(Filter.normalize("$csp= c s p"), |
| + "$csp=c s p"); |
| + assert.equal(Filter.normalize("$$csp= c s p"), |
| + "$$csp=c s p"); |
| + assert.equal(Filter.normalize("$$$csp= c s p"), |
| + "$$$csp=c s p"); |
| + assert.equal(Filter.normalize("foo?csp=b a r$csp=script-src 'self'"), |
| + "foo?csp=bar$csp=script-src 'self'"); |
| + assert.equal(Filter.normalize("foo$bar=c s p = ba z,cs p = script-src 'self'"), |
| + "foo$bar=csp=baz,csp=script-src 'self'"); |
| + assert.equal(Filter.normalize("foo$csp=c s p csp= ba z,cs p = script-src 'self'"), |
| + "foo$csp=c s p csp= ba z,csp=script-src 'self'"); |
| + assert.equal(Filter.normalize("foo$csp=bar,$c sp=c s p"), |
| + "foo$csp=bar,$csp=c s p"); |
| + assert.equal(Filter.normalize(" f o o $ bar $csp=ba r"), |
| + "foo$bar$csp=ba r"); |
| + assert.equal(Filter.normalize("f $ o $ o $ csp=f o o "), |
| + "f$o$o$csp=f o o"); |
| + assert.equal(Filter.normalize("/foo$/$ csp = script-src http://example.com/?$1=1&$2=2&$3=3"), |
| + "/foo$/$csp=script-src http://example.com/?$1=1&$2=2&$3=3"); |
| + assert.equal(Filter.normalize("||content.server.com/files/*.php$rewrite= $1"), |
| + "||content.server.com/files/*.php$rewrite=$1"); |
| + }); |
| - // Element hiding emulation filters |
| - test.equal(Filter.normalize(" domain.c om#?# # sele ctor "), |
| - "domain.com#?## sele ctor"); |
| + it("Filter rewrite option", () => |
| + { |
| + let text = "/(content\\.server\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1"; |
| - // Incorrect syntax: the separator "#?#" cannot contain spaces; treated as a |
| - // regular filter instead |
| - test.equal(Filter.normalize(" domain.c om# ?#. sele ctor "), |
| - "domain.com#?#.selector"); |
| - // Incorrect syntax: the separator "#?#" cannot contain spaces; treated as an |
| - // element hiding filter instead, because the "##" following the "?" is taken |
| - // to be the separator instead |
| - test.equal(Filter.normalize(" domain.c om# ?##sele ctor "), |
| - "domain.com#?##sele ctor"); |
| - |
| - // Element hiding exception filters |
| - test.equal(Filter.normalize(" domain.c om#@# # sele ctor "), |
| - "domain.com#@## sele ctor"); |
| + let filter = Filter.fromText(text); |
| - // Incorrect syntax: the separator "#@#" cannot contain spaces; treated as a |
| - // regular filter instead (not an element hiding filter either!), because |
| - // unlike the case with "# ?##" the "##" following the "@" is not considered |
| - // to be a separator |
| - test.equal(Filter.normalize(" domain.c om# @## sele ctor "), |
| - "domain.com#@##selector"); |
| - |
| - // Snippet filters |
| - test.equal(Filter.normalize(" domain.c om#$# sni pp et "), |
| - "domain.com#$#sni pp et"); |
| + assert.equal(filter.rewrite, "$1"); |
| + // no rewrite occured: didn't match. |
| + assert.equal(filter.rewriteUrl("foo"), "foo"); |
| + // rewrite occured: matched. |
| + assert.equal(filter.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| + "http://content.server/file/foo.txt"); |
| - // Regular filters |
| - let normalized = Filter.normalize( |
| - " b$l a$sitekey= foo ,domain= do main.com |foo .com,c sp= c s p " |
| - ); |
| - test.equal( |
| - normalized, |
| - "b$la$sitekey=foo,domain=domain.com|foo.com,csp=c s p" |
| - ); |
| - compareFilter( |
| - test, normalized, [ |
| - "type=filterlist", |
| - "text=" + normalized, |
| - "csp=c s p", |
| - "domains=domain.com|foo.com", |
| - "sitekeys=FOO", |
| - "contentType=" + t.CSP |
| - ] |
| - ); |
| + // checking for same origin. |
| + let rewriteDiffOrigin = |
| + "/content\\.server(\\/file\\/.*\\.txt)\\?.*$/$rewrite=foo.com$1"; |
| + let filterDiffOrigin = Filter.fromText(rewriteDiffOrigin); |
| + |
| + // no rewrite occured because of a different origin. |
| + assert.equal( |
| + filterDiffOrigin.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| + "http://content.server/file/foo.txt?bar" |
| + ); |
| - // Some $csp edge cases |
| - test.equal(Filter.normalize("$csp= "), |
| - "$csp="); |
| - test.equal(Filter.normalize("$csp= c s p"), |
| - "$csp=c s p"); |
| - test.equal(Filter.normalize("$$csp= c s p"), |
| - "$$csp=c s p"); |
| - test.equal(Filter.normalize("$$$csp= c s p"), |
| - "$$$csp=c s p"); |
| - test.equal(Filter.normalize("foo?csp=b a r$csp=script-src 'self'"), |
| - "foo?csp=bar$csp=script-src 'self'"); |
| - test.equal(Filter.normalize("foo$bar=c s p = ba z,cs p = script-src 'self'"), |
| - "foo$bar=csp=baz,csp=script-src 'self'"); |
| - test.equal(Filter.normalize("foo$csp=c s p csp= ba z,cs p = script-src 'self'"), |
| - "foo$csp=c s p csp= ba z,csp=script-src 'self'"); |
| - test.equal(Filter.normalize("foo$csp=bar,$c sp=c s p"), |
| - "foo$csp=bar,$csp=c s p"); |
| - test.equal(Filter.normalize(" f o o $ bar $csp=ba r"), |
| - "foo$bar$csp=ba r"); |
| - test.equal(Filter.normalize("f $ o $ o $ csp=f o o "), |
| - "f$o$o$csp=f o o"); |
| - test.equal(Filter.normalize("/foo$/$ csp = script-src http://example.com/?$1=1&$2=2&$3=3"), |
| - "/foo$/$csp=script-src http://example.com/?$1=1&$2=2&$3=3"); |
| - test.equal(Filter.normalize("||content.server.com/files/*.php$rewrite= $1"), |
| - "||content.server.com/files/*.php$rewrite=$1"); |
| - test.done(); |
| -}; |
| + // relative path. |
| + let rewriteRelative = "/(\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1/disable"; |
| + let filterRelative = Filter.fromText(rewriteRelative); |
| + |
| + assert.equal( |
| + filterRelative.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| + "http://content.server/file/foo.txt/disable" |
| + ); |
| + assert.equal( |
| + filterRelative.rewriteUrl("http://example.com/file/foo.txt?bar"), |
| + "http://example.com/file/foo.txt/disable" |
| + ); |
| -exports.testFilterRewriteOption = function(test) |
| -{ |
| - let text = "/(content\\.server\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1"; |
| - |
| - let filter = Filter.fromText(text); |
| + // Example from https://github.com/uBlockOrigin/uBlock-issues/issues/46#issuecomment-391190533 |
| + // The rewrite shouldn't happen. |
| + let rewriteEvil = "/(^https?:\\/\\/[^/])/$script,rewrite=$1.evil.com"; |
| + let filterEvil = Filter.fromText(rewriteEvil); |
| - test.equal(filter.rewrite, "$1"); |
| - // no rewrite occured: didn't match. |
| - test.equal(filter.rewriteUrl("foo"), "foo"); |
| - // rewrite occured: matched. |
| - test.equal(filter.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| - "http://content.server/file/foo.txt"); |
| + assert.equal( |
| + filterEvil.rewriteUrl("https://www.adblockplus.org/script.js"), |
| + "https://www.adblockplus.org/script.js" |
| + ); |
| - // checking for same origin. |
| - let rewriteDiffOrigin = |
| - "/content\\.server(\\/file\\/.*\\.txt)\\?.*$/$rewrite=foo.com$1"; |
| - let filterDiffOrigin = Filter.fromText(rewriteDiffOrigin); |
| - |
| - // no rewrite occured because of a different origin. |
| - test.equal( |
| - filterDiffOrigin.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| - "http://content.server/file/foo.txt?bar" |
| - ); |
| + // Strip. |
| + let rewriteStrip = "tag$rewrite="; |
| + let filterStrip = Filter.fromText(rewriteStrip); |
| - // relative path. |
| - let rewriteRelative = "/(\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1/disable"; |
| - let filterRelative = Filter.fromText(rewriteRelative); |
| - |
| - test.equal( |
| - filterRelative.rewriteUrl("http://content.server/file/foo.txt?bar"), |
| - "http://content.server/file/foo.txt/disable" |
| - ); |
| - test.equal( |
| - filterRelative.rewriteUrl("http://example.com/file/foo.txt?bar"), |
| - "http://example.com/file/foo.txt/disable" |
| - ); |
| + assert.equal(filterStrip.rewrite, ""); |
| + assert.equal( |
| + filterStrip.rewriteUrl("http://example.com/?tag"), |
| + "http://example.com/?" |
| + ); |
| + }); |
| - // Example from https://github.com/uBlockOrigin/uBlock-issues/issues/46#issuecomment-391190533 |
| - // The rewrite shouldn't happen. |
| - let rewriteEvil = "/(^https?:\\/\\/[^/])/$script,rewrite=$1.evil.com"; |
| - let filterEvil = Filter.fromText(rewriteEvil); |
| - |
| - test.equal( |
| - filterEvil.rewriteUrl("https://www.adblockplus.org/script.js"), |
| - "https://www.adblockplus.org/script.js" |
| - ); |
| - |
| - // Strip. |
| - let rewriteStrip = "tag$rewrite="; |
| - let filterStrip = Filter.fromText(rewriteStrip); |
| + it("Domain map deduplication", () => |
| + { |
| + let filter1 = Filter.fromText("foo$domain=blocking.example.com"); |
| + let filter2 = Filter.fromText("bar$domain=blocking.example.com"); |
| + let filter3 = Filter.fromText("elemhide.example.com##.foo"); |
| + let filter4 = Filter.fromText("elemhide.example.com##.bar"); |
| - test.equal(filterStrip.rewrite, ""); |
| - test.equal( |
| - filterStrip.rewriteUrl("http://example.com/?tag"), |
| - "http://example.com/?" |
| - ); |
| + // This compares the references to make sure that both refer to the same |
| + // object (#6815). |
| - test.done(); |
| -}; |
| + assert.equal(filter1.domains, filter2.domains); |
| + assert.equal(filter3.domains, filter4.domains); |
| -exports.testDomainMapDeduplication = function(test) |
| -{ |
| - let filter1 = Filter.fromText("foo$domain=blocking.example.com"); |
| - let filter2 = Filter.fromText("bar$domain=blocking.example.com"); |
| - let filter3 = Filter.fromText("elemhide.example.com##.foo"); |
| - let filter4 = Filter.fromText("elemhide.example.com##.bar"); |
| - |
| - // This compares the references to make sure that both refer to the same |
| - // object (#6815). |
| + let filter5 = Filter.fromText("bar$domain=www.example.com"); |
| + let filter6 = Filter.fromText("www.example.com##.bar"); |
| - test.equal(filter1.domains, filter2.domains); |
| - test.equal(filter3.domains, filter4.domains); |
| - |
| - let filter5 = Filter.fromText("bar$domain=www.example.com"); |
| - let filter6 = Filter.fromText("www.example.com##.bar"); |
| - |
| - test.notEqual(filter2.domains, filter5.domains); |
| - test.notEqual(filter4.domains, filter6.domains); |
| - |
| - test.done(); |
| -}; |
| + assert.notEqual(filter2.domains, filter5.domains); |
| + assert.notEqual(filter4.domains, filter6.domains); |
| + }); |
| +}); |