| LEFT | RIGHT | 
|---|
| 1 /* | 1 /* | 
| 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
| 3  * Copyright (C) 2006-present eyeo GmbH | 3  * Copyright (C) 2006-present eyeo GmbH | 
| 4  * | 4  * | 
| 5  * Adblock Plus is free software: you can redistribute it and/or modify | 5  * Adblock Plus is free software: you can redistribute it and/or modify | 
| 6  * it under the terms of the GNU General Public License version 3 as | 6  * it under the terms of the GNU General Public License version 3 as | 
| 7  * published by the Free Software Foundation. | 7  * published by the Free Software Foundation. | 
| 8  * | 8  * | 
| 9  * Adblock Plus is distributed in the hope that it will be useful, | 9  * Adblock Plus is distributed in the hope that it will be useful, | 
| 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 12  * GNU General Public License for more details. | 12  * GNU General Public License for more details. | 
| 13  * | 13  * | 
| 14  * You should have received a copy of the GNU General Public License | 14  * You should have received a copy of the GNU General Public License | 
| 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 16  */ | 16  */ | 
| 17 | 17 | 
| 18 "use strict"; | 18 "use strict"; | 
| 19 | 19 | 
| 20 const {createSandbox} = require("./_common"); | 20 const {createSandbox} = require("./_common"); | 
| 21 | 21 | 
| 22 let Filter = null; | 22 let Filter = null; | 
| 23 let InvalidFilter = null; | 23 let InvalidFilter = null; | 
| 24 let CommentFilter = null; | 24 let CommentFilter = null; | 
| 25 let ActiveFilter = null; | 25 let ActiveFilter = null; | 
| 26 let RegExpFilter = null; | 26 let RegExpFilter = null; | 
| 27 let BlockingFilter = null; | 27 let BlockingFilter = null; | 
|  | 28 let ContentFilter = null; | 
| 28 let WhitelistFilter = null; | 29 let WhitelistFilter = null; | 
| 29 let CodeInjectionFilter = null; |  | 
| 30 let ElemHideBase = null; | 30 let ElemHideBase = null; | 
| 31 let ElemHideFilter = null; | 31 let ElemHideFilter = null; | 
| 32 let ElemHideException = null; | 32 let ElemHideException = null; | 
| 33 let ElemHideEmulationFilter = null; | 33 let ElemHideEmulationFilter = null; | 
| 34 let SnippetFilter = null; | 34 let SnippetFilter = null; | 
| 35 | 35 | 
| 36 let t = null; | 36 let t = null; | 
| 37 let defaultTypes = null; | 37 let defaultTypes = null; | 
| 38 | 38 | 
| 39 exports.setUp = function(callback) | 39 exports.setUp = function(callback) | 
| 40 { | 40 { | 
| 41   let sandboxedRequire = createSandbox(); | 41   let sandboxedRequire = createSandbox(); | 
| 42   ( | 42   ( | 
| 43     {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter, | 43     {Filter, InvalidFilter, CommentFilter, ActiveFilter, RegExpFilter, | 
| 44      BlockingFilter, WhitelistFilter, CodeInjectionFilter, ElemHideBase, | 44      BlockingFilter, WhitelistFilter, ContentFilter, ElemHideBase, | 
| 45      ElemHideFilter, | 45      ElemHideFilter, ElemHideException, ElemHideEmulationFilter, | 
| 46      ElemHideException, |  | 
| 47      ElemHideEmulationFilter, |  | 
| 48      SnippetFilter} = sandboxedRequire("../lib/filterClasses") | 46      SnippetFilter} = sandboxedRequire("../lib/filterClasses") | 
| 49   ); | 47   ); | 
| 50   t = RegExpFilter.typeMap; | 48   t = RegExpFilter.typeMap; | 
| 51   defaultTypes = 0x7FFFFFFF & ~(t.CSP | t.ELEMHIDE | t.DOCUMENT | t.POPUP | | 49   defaultTypes = 0x7FFFFFFF & ~(t.CSP | t.ELEMHIDE | t.DOCUMENT | t.POPUP | | 
| 52                                 t.GENERICHIDE | t.GENERICBLOCK); | 50                                 t.GENERICHIDE | t.GENERICBLOCK); | 
| 53 | 51 | 
| 54   callback(); | 52   callback(); | 
| 55 }; | 53 }; | 
| 56 | 54 | 
| 57 function serializeFilter(filter) | 55 function serializeFilter(filter) | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 91 | 89 | 
| 92       let sitekeys = filter.sitekeys || []; | 90       let sitekeys = filter.sitekeys || []; | 
| 93       result.push("sitekeys=" + sitekeys.slice().sort().join("|")); | 91       result.push("sitekeys=" + sitekeys.slice().sort().join("|")); | 
| 94 | 92 | 
| 95       result.push("thirdParty=" + filter.thirdParty); | 93       result.push("thirdParty=" + filter.thirdParty); | 
| 96       if (filter instanceof BlockingFilter) | 94       if (filter instanceof BlockingFilter) | 
| 97       { | 95       { | 
| 98         result.push("type=filterlist"); | 96         result.push("type=filterlist"); | 
| 99         result.push("collapse=" + filter.collapse); | 97         result.push("collapse=" + filter.collapse); | 
| 100         result.push("csp=" + filter.csp); | 98         result.push("csp=" + filter.csp); | 
|  | 99         result.push("rewrite=" + filter.rewrite); | 
| 101       } | 100       } | 
| 102       else if (filter instanceof WhitelistFilter) | 101       else if (filter instanceof WhitelistFilter) | 
| 103         result.push("type=whitelist"); | 102         result.push("type=whitelist"); | 
| 104     } | 103     } | 
| 105     else if (filter instanceof CodeInjectionFilter) | 104     else if (filter instanceof ElemHideBase) | 
| 106     { | 105     { | 
| 107       if (filter instanceof ElemHideFilter) | 106       if (filter instanceof ElemHideFilter) | 
| 108         result.push("type=elemhide"); | 107         result.push("type=elemhide"); | 
| 109       else if (filter instanceof ElemHideException) | 108       else if (filter instanceof ElemHideException) | 
| 110         result.push("type=elemhideexception"); | 109         result.push("type=elemhideexception"); | 
| 111       else if (filter instanceof ElemHideEmulationFilter) | 110       else if (filter instanceof ElemHideEmulationFilter) | 
| 112         result.push("type=elemhideemulation"); | 111         result.push("type=elemhideemulation"); | 
| 113       else if (filter instanceof SnippetFilter) | 112 | 
| 114         result.push("type=snippet"); | 113       result.push("selectorDomains=" + | 
| 115 | 114                   [...filter.domains || []] | 
| 116       result.push("injectionDomains=" + (filter.injectionDomains || "")); | 115                   .filter(([domain, isIncluded]) => isIncluded) | 
| 117       result.push("code=" + filter.code); | 116                   .map(([domain]) => domain.toLowerCase())); | 
|  | 117       result.push("selector=" + filter.selector); | 
|  | 118     } | 
|  | 119     else if (filter instanceof SnippetFilter) | 
|  | 120     { | 
|  | 121       result.push("type=snippet"); | 
|  | 122       result.push("scriptDomains=" + | 
|  | 123                   [...filter.domains || []] | 
|  | 124                   .filter(([domain, isIncluded]) => isIncluded) | 
|  | 125                   .map(([domain]) => domain.toLowerCase())); | 
|  | 126       result.push("script=" + filter.script); | 
| 118     } | 127     } | 
| 119   } | 128   } | 
| 120   return result; | 129   return result; | 
| 121 } | 130 } | 
| 122 | 131 | 
| 123 function addDefaults(expected) | 132 function addDefaults(expected) | 
| 124 { | 133 { | 
| 125   let type = null; | 134   let type = null; | 
| 126   let hasProperty = {}; | 135   let hasProperty = {}; | 
| 127   for (let entry of expected) | 136   for (let entry of expected) | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 153     )); | 162     )); | 
| 154     addProperty("matchCase", "false"); | 163     addProperty("matchCase", "false"); | 
| 155     addProperty("thirdParty", "null"); | 164     addProperty("thirdParty", "null"); | 
| 156     addProperty("domains", ""); | 165     addProperty("domains", ""); | 
| 157     addProperty("sitekeys", ""); | 166     addProperty("sitekeys", ""); | 
| 158   } | 167   } | 
| 159   if (type == "filterlist") | 168   if (type == "filterlist") | 
| 160   { | 169   { | 
| 161     addProperty("collapse", "null"); | 170     addProperty("collapse", "null"); | 
| 162     addProperty("csp", "null"); | 171     addProperty("csp", "null"); | 
|  | 172     addProperty("rewrite", "null"); | 
| 163   } | 173   } | 
| 164   if (type == "elemhide" || type == "elemhideexception" || | 174   if (type == "elemhide" || type == "elemhideexception" || | 
| 165       type == "elemhideemulation" || type == "snippet") | 175       type == "elemhideemulation") | 
| 166   { | 176   { | 
| 167     addProperty("injectionDomains", ""); | 177     addProperty("selectorDomains", ""); | 
|  | 178     addProperty("domains", ""); | 
|  | 179   } | 
|  | 180   if (type == "snippet") | 
|  | 181   { | 
|  | 182     addProperty("scriptDomains", ""); | 
| 168     addProperty("domains", ""); | 183     addProperty("domains", ""); | 
| 169   } | 184   } | 
| 170 } | 185 } | 
| 171 | 186 | 
| 172 function compareFilter(test, text, expected, postInit) | 187 function compareFilter(test, text, expected, postInit) | 
| 173 { | 188 { | 
| 174   addDefaults(expected); | 189   addDefaults(expected); | 
| 175 | 190 | 
| 176   let filter = Filter.fromText(text); | 191   let filter = Filter.fromText(text); | 
| 177   if (postInit) | 192   if (postInit) | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 200 } | 215 } | 
| 201 | 216 | 
| 202 exports.testFilterClassDefinitions = function(test) | 217 exports.testFilterClassDefinitions = function(test) | 
| 203 { | 218 { | 
| 204   test.equal(typeof Filter, "function", "typeof Filter"); | 219   test.equal(typeof Filter, "function", "typeof Filter"); | 
| 205   test.equal(typeof InvalidFilter, "function", "typeof InvalidFilter"); | 220   test.equal(typeof InvalidFilter, "function", "typeof InvalidFilter"); | 
| 206   test.equal(typeof CommentFilter, "function", "typeof CommentFilter"); | 221   test.equal(typeof CommentFilter, "function", "typeof CommentFilter"); | 
| 207   test.equal(typeof ActiveFilter, "function", "typeof ActiveFilter"); | 222   test.equal(typeof ActiveFilter, "function", "typeof ActiveFilter"); | 
| 208   test.equal(typeof RegExpFilter, "function", "typeof RegExpFilter"); | 223   test.equal(typeof RegExpFilter, "function", "typeof RegExpFilter"); | 
| 209   test.equal(typeof BlockingFilter, "function", "typeof BlockingFilter"); | 224   test.equal(typeof BlockingFilter, "function", "typeof BlockingFilter"); | 
|  | 225   test.equal(typeof ContentFilter, "function", "typeof ContentFilter"); | 
| 210   test.equal(typeof WhitelistFilter, "function", "typeof WhitelistFilter"); | 226   test.equal(typeof WhitelistFilter, "function", "typeof WhitelistFilter"); | 
| 211   test.equal(typeof CodeInjectionFilter, "function", |  | 
| 212              "typeof CodeInjectionFilter"); |  | 
| 213   test.equal(typeof ElemHideBase, "function", "typeof ElemHideBase"); | 227   test.equal(typeof ElemHideBase, "function", "typeof ElemHideBase"); | 
| 214   test.equal(typeof ElemHideFilter, "function", "typeof ElemHideFilter"); | 228   test.equal(typeof ElemHideFilter, "function", "typeof ElemHideFilter"); | 
| 215   test.equal(typeof ElemHideException, "function", "typeof ElemHideException"); | 229   test.equal(typeof ElemHideException, "function", "typeof ElemHideException"); | 
| 216   test.equal(typeof ElemHideEmulationFilter, "function", | 230   test.equal(typeof ElemHideEmulationFilter, "function", | 
| 217              "typeof ElemHideEmulationFilter"); | 231              "typeof ElemHideEmulationFilter"); | 
| 218   test.equal(typeof SnippetFilter, "function", "typeof SnippetFilter"); | 232   test.equal(typeof SnippetFilter, "function", "typeof SnippetFilter"); | 
| 219 | 233 | 
| 220   test.done(); | 234   test.done(); | 
| 221 }; | 235 }; | 
| 222 | 236 | 
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 289   compareFilter(test, "@@/ddd|f?a[s]d/", ["type=whitelist", "text=@@/ddd|f?a[s]d
     /", "regexp=ddd|f?a[s]d", "contentType=" + defaultTypes]); | 303   compareFilter(test, "@@/ddd|f?a[s]d/", ["type=whitelist", "text=@@/ddd|f?a[s]d
     /", "regexp=ddd|f?a[s]d", "contentType=" + defaultTypes]); | 
| 290   compareFilter(test, "@@*asdf*d**dd*", ["type=whitelist", "text=@@*asdf*d**dd*"
     , "regexp=asdf.*d.*dd", "contentType=" + defaultTypes]); | 304   compareFilter(test, "@@*asdf*d**dd*", ["type=whitelist", "text=@@*asdf*d**dd*"
     , "regexp=asdf.*d.*dd", "contentType=" + defaultTypes]); | 
| 291   compareFilter(test, "@@|*asd|f*d**dd*|", ["type=whitelist", "text=@@|*asd|f*d*
     *dd*|", "regexp=^.*asd\\|f.*d.*dd.*$", "contentType=" + defaultTypes]); | 305   compareFilter(test, "@@|*asd|f*d**dd*|", ["type=whitelist", "text=@@|*asd|f*d*
     *dd*|", "regexp=^.*asd\\|f.*d.*dd.*$", "contentType=" + defaultTypes]); | 
| 292   compareFilter(test, "@@dd[]{}$%<>&()d", ["type=whitelist", "text=@@dd[]{}$%<>&
     ()d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\)d", "contentType=" + defaultTyp
     es]); | 306   compareFilter(test, "@@dd[]{}$%<>&()d", ["type=whitelist", "text=@@dd[]{}$%<>&
     ()d", "regexp=dd\\[\\]\\{\\}\\$\\%\\<\\>\\&\\(\\)d", "contentType=" + defaultTyp
     es]); | 
| 293 | 307 | 
| 294   test.done(); | 308   test.done(); | 
| 295 }; | 309 }; | 
| 296 | 310 | 
| 297 exports.testFilterOptions = function(test) | 311 exports.testFilterOptions = function(test) | 
| 298 { | 312 { | 
| 299   compareFilter(test, "bla$match-case,csp=first csp,script,other,third-party,dom
     ain=foo.com,sitekey=foo", ["type=filterlist", "text=bla$match-case,csp=first csp
     ,script,other,third-party,domain=foo.com,sitekey=foo", "regexp=bla", "matchCase=
     true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domain
     s=FOO.COM", "sitekeys=FOO", "csp=first csp"]); | 313   compareFilter(test, "bla$match-case,csp=first csp,script,other,third-party,dom
     ain=FOO.cOm,sitekey=foo", ["type=filterlist", "text=bla$match-case,csp=first csp
     ,script,other,third-party,domain=FOO.cOm,sitekey=foo", "regexp=bla", "matchCase=
     true", "contentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domain
     s=foo.com", "sitekeys=FOO", "csp=first csp"]); | 
| 300   compareFilter(test, "bla$~match-case,~csp=csp,~script,~other,~third-party,doma
     in=~bar.com", ["type=filterlist", "text=bla$~match-case,~csp=csp,~script,~other,
     ~third-party,domain=~bar.com", "regexp=bla", "contentType=" + (defaultTypes & ~(
     t.SCRIPT | t.OTHER)), "thirdParty=false", "domains=~BAR.COM"]); | 314   compareFilter(test, "bla$~match-case,~csp=csp,~script,~other,~third-party,doma
     in=~bAr.coM", ["type=filterlist", "text=bla$~match-case,~csp=csp,~script,~other,
     ~third-party,domain=~bAr.coM", "regexp=bla", "contentType=" + (defaultTypes & ~(
     t.SCRIPT | t.OTHER)), "thirdParty=false", "domains=~bar.com"]); | 
| 301   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", "regexp=bla", "matchCase=true", "c
     ontentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=BAR.COM
     |FOO.COM|~BAR.FOO.COM|~FOO.BAR.COM", "sitekeys=BAR|FOO"]); | 315   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", "regexp=bla", "matchCase=true", "c
     ontentType=" + (t.SCRIPT | t.OTHER | t.CSP), "thirdParty=true", "domains=bar.com
     |foo.com|~bar.foo.com|~foo.bar.com", "sitekeys=BAR|FOO"]); | 
| 302   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=@@b
     la$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.
     bar.com,sitekey=foo|bar", "regexp=bla", "matchCase=true", "contentType=" + (t.SC
     RIPT | t.OTHER), "thirdParty=true", "domains=BAR.COM|FOO.COM|~BAR.FOO.COM|~FOO.B
     AR.COM", "sitekeys=BAR|FOO"]); | 316   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=@@b
     la$match-case,script,other,third-party,domain=foo.com|bar.com|~bar.foo.com|~foo.
     bar.com,sitekey=foo|bar", "regexp=bla", "matchCase=true", "contentType=" + (t.SC
     RIPT | t.OTHER), "thirdParty=true", "domains=bar.com|foo.com|~bar.foo.com|~foo.b
     ar.com", "sitekeys=BAR|FOO"]); | 
|  | 317   compareFilter(test, "||content.server.com/files/*.php$rewrite=$1", ["type=filt
     erlist", "text=||content.server.com/files/*.php$rewrite=$1", "regexp=^[\\w\\-]+:
     \\/+(?!\\/)(?:[^\\/]+\\.)?content\\.server\\.com\\/files\\/.*\\.php", "matchCase
     =false", "rewrite=$1", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.SUBDOCUME
     NT | t.OBJECT | t.OBJECT_SUBREQUEST))]); | 
| 303 | 318 | 
| 304   // background and image should be the same for backwards compatibility | 319   // background and image should be the same for backwards compatibility | 
| 305   compareFilter(test, "bla$image", ["type=filterlist", "text=bla$image", "regexp
     =bla", "contentType=" + (t.IMAGE)]); | 320   compareFilter(test, "bla$image", ["type=filterlist", "text=bla$image", "regexp
     =bla", "contentType=" + (t.IMAGE)]); | 
| 306   compareFilter(test, "bla$background", ["type=filterlist", "text=bla$background
     ", "regexp=bla", "contentType=" + (t.IMAGE)]); | 321   compareFilter(test, "bla$background", ["type=filterlist", "text=bla$background
     ", "regexp=bla", "contentType=" + (t.IMAGE)]); | 
| 307   compareFilter(test, "bla$~image", ["type=filterlist", "text=bla$~image", "rege
     xp=bla", "contentType=" + (defaultTypes & ~t.IMAGE)]); | 322   compareFilter(test, "bla$~image", ["type=filterlist", "text=bla$~image", "rege
     xp=bla", "contentType=" + (defaultTypes & ~t.IMAGE)]); | 
| 308   compareFilter(test, "bla$~background", ["type=filterlist", "text=bla$~backgrou
     nd", "regexp=bla", "contentType=" + (defaultTypes & ~t.IMAGE)]); | 323   compareFilter(test, "bla$~background", ["type=filterlist", "text=bla$~backgrou
     nd", "regexp=bla", "contentType=" + (defaultTypes & ~t.IMAGE)]); | 
| 309 | 324 | 
| 310   compareFilter(test, "@@bla$~script,~other", ["type=whitelist", "text=@@bla$~sc
     ript,~other", "regexp=bla", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHE
     R))]); | 325   compareFilter(test, "@@bla$~script,~other", ["type=whitelist", "text=@@bla$~sc
     ript,~other", "regexp=bla", "contentType=" + (defaultTypes & ~(t.SCRIPT | t.OTHE
     R))]); | 
| 311   compareFilter(test, "@@http://bla$~script,~other", ["type=whitelist", "text=@@
     http://bla$~script,~other", "regexp=http\\:\\/\\/bla", "contentType=" + (default
     Types & ~(t.SCRIPT | t.OTHER))]); | 326   compareFilter(test, "@@http://bla$~script,~other", ["type=whitelist", "text=@@
     http://bla$~script,~other", "regexp=http\\:\\/\\/bla", "contentType=" + (default
     Types & ~(t.SCRIPT | t.OTHER))]); | 
| 312   compareFilter(test, "@@|ftp://bla$~script,~other", ["type=whitelist", "text=@@
     |ftp://bla$~script,~other", "regexp=^ftp\\:\\/\\/bla", "contentType=" + (default
     Types & ~(t.SCRIPT | t.OTHER))]); | 327   compareFilter(test, "@@|ftp://bla$~script,~other", ["type=whitelist", "text=@@
     |ftp://bla$~script,~other", "regexp=^ftp\\:\\/\\/bla", "contentType=" + (default
     Types & ~(t.SCRIPT | t.OTHER))]); | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 329   compareFilter(test, "bla$csp=foo,csp=referrer foo", ["type=invalid", "text=bla
     $csp=foo,csp=referrer foo", "reason=filter_invalid_csp"]); | 344   compareFilter(test, "bla$csp=foo,csp=referrer foo", ["type=invalid", "text=bla
     $csp=foo,csp=referrer foo", "reason=filter_invalid_csp"]); | 
| 330   compareFilter(test, "bla$csp=foo,csp=base-uri", ["type=invalid", "text=bla$csp
     =foo,csp=base-uri", "reason=filter_invalid_csp"]); | 345   compareFilter(test, "bla$csp=foo,csp=base-uri", ["type=invalid", "text=bla$csp
     =foo,csp=base-uri", "reason=filter_invalid_csp"]); | 
| 331   compareFilter(test, "bla$csp=foo,csp=upgrade-insecure-requests", ["type=invali
     d", "text=bla$csp=foo,csp=upgrade-insecure-requests", "reason=filter_invalid_csp
     "]); | 346   compareFilter(test, "bla$csp=foo,csp=upgrade-insecure-requests", ["type=invali
     d", "text=bla$csp=foo,csp=upgrade-insecure-requests", "reason=filter_invalid_csp
     "]); | 
| 332   compareFilter(test, "bla$csp=foo,csp=ReFeRReR", ["type=invalid", "text=bla$csp
     =foo,csp=ReFeRReR", "reason=filter_invalid_csp"]); | 347   compareFilter(test, "bla$csp=foo,csp=ReFeRReR", ["type=invalid", "text=bla$csp
     =foo,csp=ReFeRReR", "reason=filter_invalid_csp"]); | 
| 333 | 348 | 
| 334   test.done(); | 349   test.done(); | 
| 335 }; | 350 }; | 
| 336 | 351 | 
| 337 exports.testElementHidingRules = function(test) | 352 exports.testElementHidingRules = function(test) | 
| 338 { | 353 { | 
| 339   compareFilter(test, "##ddd", ["type=elemhide", "text=##ddd", "code=ddd"]); | 354   compareFilter(test, "##ddd", ["type=elemhide", "text=##ddd", "selector=ddd"]); | 
| 340   compareFilter(test, "##body > div:first-child", ["type=elemhide", "text=##body
      > div:first-child", "code=body > div:first-child"]); | 355   compareFilter(test, "##body > div:first-child", ["type=elemhide", "text=##body
      > div:first-child", "selector=body > div:first-child"]); | 
| 341   compareFilter(test, "foo##ddd", ["type=elemhide", "text=foo##ddd", "injectionD
     omains=foo", "code=ddd", "domains=FOO"]); | 356   compareFilter(test, "fOO##ddd", ["type=elemhide", "text=fOO##ddd", "selectorDo
     mains=foo", "selector=ddd", "domains=foo"]); | 
| 342   compareFilter(test, "foo,bar##ddd", ["type=elemhide", "text=foo,bar##ddd", "in
     jectionDomains=foo,bar", "code=ddd", "domains=BAR|FOO"]); | 357   compareFilter(test, "Foo,bAr##ddd", ["type=elemhide", "text=Foo,bAr##ddd", "se
     lectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); | 
| 343   compareFilter(test, "foo,~bar##ddd", ["type=elemhide", "text=foo,~bar##ddd", "
     injectionDomains=foo", "code=ddd", "domains=FOO|~BAR"]); | 358   compareFilter(test, "foo,~baR##ddd", ["type=elemhide", "text=foo,~baR##ddd", "
     selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); | 
| 344   compareFilter(test, "foo,~baz,bar##ddd", ["type=elemhide", "text=foo,~baz,bar#
     #ddd", "injectionDomains=foo,bar", "code=ddd", "domains=BAR|FOO|~BAZ"]); | 359   compareFilter(test, "foo,~baz,bar##ddd", ["type=elemhide", "text=foo,~baz,bar#
     #ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~baz"]); | 
| 345 | 360 | 
| 346   test.done(); | 361   test.done(); | 
| 347 }; | 362 }; | 
| 348 | 363 | 
| 349 exports.testElementHidingExceptions = function(test) | 364 exports.testElementHidingExceptions = function(test) | 
| 350 { | 365 { | 
| 351   compareFilter(test, "#@#ddd", ["type=elemhideexception", "text=#@#ddd", "code=
     ddd"]); | 366   compareFilter(test, "#@#ddd", ["type=elemhideexception", "text=#@#ddd", "selec
     tor=ddd"]); | 
| 352   compareFilter(test, "#@#body > div:first-child", ["type=elemhideexception", "t
     ext=#@#body > div:first-child", "code=body > div:first-child"]); | 367   compareFilter(test, "#@#body > div:first-child", ["type=elemhideexception", "t
     ext=#@#body > div:first-child", "selector=body > div:first-child"]); | 
| 353   compareFilter(test, "foo#@#ddd", ["type=elemhideexception", "text=foo#@#ddd", 
     "injectionDomains=foo", "code=ddd", "domains=FOO"]); | 368   compareFilter(test, "fOO#@#ddd", ["type=elemhideexception", "text=fOO#@#ddd", 
     "selectorDomains=foo", "selector=ddd", "domains=foo"]); | 
| 354   compareFilter(test, "foo,bar#@#ddd", ["type=elemhideexception", "text=foo,bar#
     @#ddd", "injectionDomains=foo,bar", "code=ddd", "domains=BAR|FOO"]); | 369   compareFilter(test, "Foo,bAr#@#ddd", ["type=elemhideexception", "text=Foo,bAr#
     @#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo"]); | 
| 355   compareFilter(test, "foo,~bar#@#ddd", ["type=elemhideexception", "text=foo,~ba
     r#@#ddd", "injectionDomains=foo", "code=ddd", "domains=FOO|~BAR"]); | 370   compareFilter(test, "foo,~baR#@#ddd", ["type=elemhideexception", "text=foo,~ba
     R#@#ddd", "selectorDomains=foo", "selector=ddd", "domains=foo|~bar"]); | 
| 356   compareFilter(test, "foo,~baz,bar#@#ddd", ["type=elemhideexception", "text=foo
     ,~baz,bar#@#ddd", "injectionDomains=foo,bar", "code=ddd", "domains=BAR|FOO|~BAZ"
     ]); | 371   compareFilter(test, "foo,~baz,bar#@#ddd", ["type=elemhideexception", "text=foo
     ,~baz,bar#@#ddd", "selectorDomains=foo,bar", "selector=ddd", "domains=bar|foo|~b
     az"]); | 
| 357 | 372 | 
| 358   test.done(); | 373   test.done(); | 
| 359 }; | 374 }; | 
| 360 | 375 | 
| 361 exports.testElemHideEmulationFilters = function(test) | 376 exports.testElemHideEmulationFilters = function(test) | 
| 362 { | 377 { | 
| 363   // Check valid domain combinations | 378   // Check valid domain combinations | 
| 364   compareFilter(test, "foo.com#?#:-abp-properties(abc)", ["type=elemhideemulatio
     n", "text=foo.com#?#:-abp-properties(abc)", "injectionDomains=foo.com", "code=:-
     abp-properties(abc)", "domains=FOO.COM"]); | 379   compareFilter(test, "fOO.cOm#?#:-abp-properties(abc)", ["type=elemhideemulatio
     n", "text=fOO.cOm#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selector
     =:-abp-properties(abc)", "domains=foo.com"]); | 
| 365   compareFilter(test, "foo.com,~bar.com#?#:-abp-properties(abc)", ["type=elemhid
     eemulation", "text=foo.com,~bar.com#?#:-abp-properties(abc)", "injectionDomains=
     foo.com", "code=:-abp-properties(abc)", "domains=FOO.COM|~BAR.COM"]); | 380   compareFilter(test, "Foo.com,~bAr.com#?#:-abp-properties(abc)", ["type=elemhid
     eemulation", "text=Foo.com,~bAr.com#?#:-abp-properties(abc)", "selectorDomains=f
     oo.com", "selector=:-abp-properties(abc)", "domains=foo.com|~bar.com"]); | 
| 366   compareFilter(test, "foo.com,~bar#?#:-abp-properties(abc)", ["type=elemhideemu
     lation", "text=foo.com,~bar#?#:-abp-properties(abc)", "injectionDomains=foo.com"
     , "code=:-abp-properties(abc)", "domains=FOO.COM|~BAR"]); | 381   compareFilter(test, "foo.com,~baR#?#:-abp-properties(abc)", ["type=elemhideemu
     lation", "text=foo.com,~baR#?#:-abp-properties(abc)", "selectorDomains=foo.com",
      "selector=:-abp-properties(abc)", "domains=foo.com|~bar"]); | 
| 367   compareFilter(test, "~foo.com,bar.com#?#:-abp-properties(abc)", ["type=elemhid
     eemulation", "text=~foo.com,bar.com#?#:-abp-properties(abc)", "injectionDomains=
     bar.com", "code=:-abp-properties(abc)", "domains=BAR.COM|~FOO.COM"]); | 382   compareFilter(test, "~foo.com,bar.com#?#:-abp-properties(abc)", ["type=elemhid
     eemulation", "text=~foo.com,bar.com#?#:-abp-properties(abc)", "selectorDomains=b
     ar.com", "selector=:-abp-properties(abc)", "domains=bar.com|~foo.com"]); | 
| 368 | 383 | 
| 369   // Check some special cases | 384   // Check some special cases | 
| 370   compareFilter(test, "#?#:-abp-properties(abc)", ["type=invalid", "text=#?#:-ab
     p-properties(abc)", "reason=filter_elemhideemulation_nodomain"]); | 385   compareFilter(test, "#?#:-abp-properties(abc)", ["type=invalid", "text=#?#:-ab
     p-properties(abc)", "reason=filter_elemhideemulation_nodomain"]); | 
| 371   compareFilter(test, "foo.com#?#abc", ["type=elemhideemulation", "text=foo.com#
     ?#abc", "injectionDomains=foo.com", "code=abc", "domains=FOO.COM"]); | 386   compareFilter(test, "foo.com#?#abc", ["type=elemhideemulation", "text=foo.com#
     ?#abc", "selectorDomains=foo.com", "selector=abc", "domains=foo.com"]); | 
| 372   compareFilter(test, "foo.com#?#:-abp-foobar(abc)", ["type=elemhideemulation", 
     "text=foo.com#?#:-abp-foobar(abc)", "injectionDomains=foo.com", "code=:-abp-foob
     ar(abc)", "domains=FOO.COM"]); | 387   compareFilter(test, "foo.com#?#:-abp-foobar(abc)", ["type=elemhideemulation", 
     "text=foo.com#?#:-abp-foobar(abc)", "selectorDomains=foo.com", "selector=:-abp-f
     oobar(abc)", "domains=foo.com"]); | 
| 373   compareFilter(test, "foo.com#?#aaa :-abp-properties(abc) bbb", ["type=elemhide
     emulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "injectionDomains=fo
     o.com", "code=aaa :-abp-properties(abc) bbb", "domains=FOO.COM"]); | 388   compareFilter(test, "foo.com#?#aaa :-abp-properties(abc) bbb", ["type=elemhide
     emulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "selectorDomains=foo
     .com", "selector=aaa :-abp-properties(abc) bbb", "domains=foo.com"]); | 
| 374   compareFilter(test, "foo.com#?#:-abp-properties(|background-image: url(data:*)
     )", ["type=elemhideemulation", "text=foo.com#?#:-abp-properties(|background-imag
     e: url(data:*))", "injectionDomains=foo.com", "code=:-abp-properties(|background
     -image: url(data:*))", "domains=FOO.COM"]); | 389   compareFilter(test, "foo.com#?#:-abp-properties(|background-image: url(data:*)
     )", ["type=elemhideemulation", "text=foo.com#?#:-abp-properties(|background-imag
     e: url(data:*))", "selectorDomains=foo.com", "selector=:-abp-properties(|backgro
     und-image: url(data:*))", "domains=foo.com"]); | 
| 375 | 390 | 
| 376   // Check conversion of legacy filters | 391   // Check conversion of legacy filters | 
| 377   compareFilter(test, "foo.com##[-abp-properties='abc']", ["type=elemhideemulati
     on", "text=foo.com#?#:-abp-properties(abc)", "injectionDomains=foo.com", "code=:
     -abp-properties(abc)", "domains=FOO.COM"]); | 392   compareFilter(test, "foo.com##[-abp-properties='abc']", ["type=elemhideemulati
     on", "text=foo.com#?#:-abp-properties(abc)", "selectorDomains=foo.com", "selecto
     r=:-abp-properties(abc)", "domains=foo.com"]); | 
| 378   test.equal(Filter.fromText("foo.com##[-abp-properties='abc']"), Filter.fromTex
     t("foo.com#?#:-abp-properties(abc)")); | 393   test.equal(Filter.fromText("foo.com##[-abp-properties='abc']"), Filter.fromTex
     t("foo.com#?#:-abp-properties(abc)")); | 
| 379   compareFilter(test, "foo.com#@#[-abp-properties='abc']", ["type=elemhideexcept
     ion", "text=foo.com#@#[-abp-properties='abc']", "injectionDomains=foo.com", "cod
     e=[-abp-properties='abc']", "domains=FOO.COM"]); | 394   compareFilter(test, "foo.com#@#[-abp-properties='abc']", ["type=elemhideexcept
     ion", "text=foo.com#@#[-abp-properties='abc']", "selectorDomains=foo.com", "sele
     ctor=[-abp-properties='abc']", "domains=foo.com"]); | 
| 380   compareFilter(test, "foo.com#?#[-abp-properties='abc']", ["type=elemhideemulat
     ion", "text=foo.com#?#[-abp-properties='abc']", "injectionDomains=foo.com", "cod
     e=[-abp-properties='abc']", "domains=FOO.COM"]); | 395   compareFilter(test, "foo.com#?#[-abp-properties='abc']", ["type=elemhideemulat
     ion", "text=foo.com#?#[-abp-properties='abc']", "selectorDomains=foo.com", "sele
     ctor=[-abp-properties='abc']", "domains=foo.com"]); | 
| 381   compareFilter(test, "foo.com##aaa [-abp-properties='abc'] bbb", ["type=elemhid
     eemulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "injectionDomains=f
     oo.com", "code=aaa :-abp-properties(abc) bbb", "domains=FOO.COM"]); | 396   compareFilter(test, "foo.com##aaa [-abp-properties='abc'] bbb", ["type=elemhid
     eemulation", "text=foo.com#?#aaa :-abp-properties(abc) bbb", "selectorDomains=fo
     o.com", "selector=aaa :-abp-properties(abc) bbb", "domains=foo.com"]); | 
| 382 | 397 | 
| 383   // test matching -abp-properties= (https://issues.adblockplus.org/ticket/5037)
     . | 398   // test matching -abp-properties= (https://issues.adblockplus.org/ticket/5037)
     . | 
| 384   compareFilter(test, "foo.com##[-abp-properties-bogus='abc']", ["type=elemhide"
     , "text=foo.com##[-abp-properties-bogus='abc']", "injectionDomains=foo.com", "co
     de=[-abp-properties-bogus='abc']", "domains=FOO.COM"]); | 399   compareFilter(test, "foo.com##[-abp-properties-bogus='abc']", ["type=elemhide"
     , "text=foo.com##[-abp-properties-bogus='abc']", "selectorDomains=foo.com", "sel
     ector=[-abp-properties-bogus='abc']", "domains=foo.com"]); | 
| 385 | 400 | 
| 386   test.done(); | 401   test.done(); | 
| 387 }; | 402 }; | 
| 388 | 403 | 
| 389 exports.testEmptyElemHideDomains = function(test) | 404 exports.testEmptyElemHideDomains = function(test) | 
| 390 { | 405 { | 
| 391   let emptyDomainFilters = [ | 406   let emptyDomainFilters = [ | 
| 392     ",##selector", ",,,##selector", "~,foo.com##selector", "foo.com,##selector", | 407     ",##selector", ",,,##selector", "~,foo.com##selector", "foo.com,##selector", | 
| 393     ",foo.com##selector", "foo.com,~##selector", | 408     ",foo.com##selector", "foo.com,~##selector", | 
| 394     "foo.com,,bar.com##selector", "foo.com,~,bar.com##selector" | 409     "foo.com,,bar.com##selector", "foo.com,~,bar.com##selector" | 
| 395   ]; | 410   ]; | 
| 396 | 411 | 
| 397   for (let filterText of emptyDomainFilters) | 412   for (let filterText of emptyDomainFilters) | 
| 398   { | 413   { | 
| 399     let filter = Filter.fromText(filterText); | 414     let filter = Filter.fromText(filterText); | 
| 400     test.ok(filter instanceof InvalidFilter); | 415     test.ok(filter instanceof InvalidFilter); | 
| 401     test.equal(filter.reason, "filter_invalid_domain"); | 416     test.equal(filter.reason, "filter_invalid_domain"); | 
| 402   } | 417   } | 
| 403 | 418 | 
| 404   test.done(); | 419   test.done(); | 
| 405 }; | 420 }; | 
| 406 | 421 | 
| 407 exports.testElemHideRulesWithBraces = function(test) | 422 exports.testElemHideRulesWithBraces = function(test) | 
| 408 { | 423 { | 
| 409   compareFilter( | 424   compareFilter( | 
| 410     test, "###foo{color: red}", [ | 425     test, "###foo{color: red}", [ | 
| 411       "type=elemhide", | 426       "type=elemhide", | 
| 412       "text=###foo{color: red}", | 427       "text=###foo{color: red}", | 
| 413       "injectionDomains=", | 428       "selectorDomains=", | 
| 414       "code=#foo\\7B color: red\\7D ", | 429       "selector=#foo\\7B color: red\\7D ", | 
| 415       "domains=" | 430       "domains=" | 
| 416     ] | 431     ] | 
| 417   ); | 432   ); | 
| 418   compareFilter( | 433   compareFilter( | 
| 419     test, "foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", [ | 434     test, "foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", [ | 
| 420       "type=elemhideemulation", | 435       "type=elemhideemulation", | 
| 421       "text=foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", | 436       "text=foo.com#?#:-abp-properties(/margin: [3-4]{2}/)", | 
| 422       "injectionDomains=foo.com", | 437       "selectorDomains=foo.com", | 
| 423       "code=:-abp-properties(/margin: [3-4]\\7B 2\\7D /)", | 438       "selector=:-abp-properties(/margin: [3-4]\\7B 2\\7D /)", | 
| 424       "domains=FOO.COM" | 439       "domains=foo.com" | 
| 425     ] | 440     ] | 
| 426   ); | 441   ); | 
| 427   test.done(); | 442   test.done(); | 
| 428 }; | 443 }; | 
| 429 | 444 | 
| 430 exports.testSnippetFilters = function(test) | 445 exports.testSnippetFilters = function(test) | 
| 431 { | 446 { | 
| 432   compareFilter(test, "foo.com#$#abc", ["type=snippet", "text=foo.com#$#abc", "i
     njectionDomains=foo.com", "code=abc", "domains=FOO.COM"]); | 447   compareFilter(test, "foo.com#$#abc", ["type=snippet", "text=foo.com#$#abc", "s
     criptDomains=foo.com", "script=abc", "domains=foo.com"]); | 
| 433   compareFilter(test, "foo.com,~bar.com#$#abc", ["type=snippet", "text=foo.com,~
     bar.com#$#abc", "injectionDomains=foo.com", "code=abc", "domains=FOO.COM|~BAR.CO
     M"]); | 448   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
     "]); | 
| 434   compareFilter(test, "foo.com,~bar#$#abc", ["type=snippet", "text=foo.com,~bar#
     $#abc", "injectionDomains=foo.com", "code=abc", "domains=FOO.COM|~BAR"]); | 449   compareFilter(test, "foo.com,~bar#$#abc", ["type=snippet", "text=foo.com,~bar#
     $#abc", "scriptDomains=foo.com", "script=abc", "domains=foo.com|~bar"]); | 
| 435   compareFilter(test, "~foo.com,bar.com#$#abc", ["type=snippet", "text=~foo.com,
     bar.com#$#abc", "injectionDomains=bar.com", "code=abc", "domains=BAR.COM|~FOO.CO
     M"]); | 450   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
     "]); | 
| 436 | 451 | 
| 437   test.done(); | 452   test.done(); | 
| 438 }; | 453 }; | 
| 439 | 454 | 
| 440 exports.testFilterNormalization = function(test) | 455 exports.testFilterNormalization = function(test) | 
| 441 { | 456 { | 
| 442   // Line breaks etc | 457   // Line breaks etc | 
| 443   test.equal(Filter.normalize("\n\t\nad\ns"), | 458   test.equal(Filter.normalize("\n\t\nad\ns"), | 
| 444              "ads"); | 459              "ads"); | 
| 445 | 460 | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 486   ); | 501   ); | 
| 487   test.equal( | 502   test.equal( | 
| 488     normalized, | 503     normalized, | 
| 489     "b$la$sitekey=foo,domain=domain.com|foo.com,csp=c s p" | 504     "b$la$sitekey=foo,domain=domain.com|foo.com,csp=c s p" | 
| 490   ); | 505   ); | 
| 491   compareFilter( | 506   compareFilter( | 
| 492     test, normalized, [ | 507     test, normalized, [ | 
| 493       "type=filterlist", | 508       "type=filterlist", | 
| 494       "text=" + normalized, | 509       "text=" + normalized, | 
| 495       "csp=c s p", | 510       "csp=c s p", | 
| 496       "domains=DOMAIN.COM|FOO.COM", | 511       "domains=domain.com|foo.com", | 
| 497       "sitekeys=FOO", | 512       "sitekeys=FOO", | 
| 498       "regexp=b\\$la", | 513       "regexp=b\\$la", | 
| 499       "contentType=" + t.CSP | 514       "contentType=" + t.CSP | 
| 500     ] | 515     ] | 
| 501   ); | 516   ); | 
| 502 | 517 | 
| 503   // Some $csp edge cases | 518   // Some $csp edge cases | 
| 504   test.equal(Filter.normalize("$csp= c s p"), | 519   test.equal(Filter.normalize("$csp= c s p"), | 
| 505              "$csp=c s p"); | 520              "$csp=c s p"); | 
| 506   test.equal(Filter.normalize("$$csp= c s p"), | 521   test.equal(Filter.normalize("$$csp= c s p"), | 
| 507              "$$csp=c s p"); | 522              "$$csp=c s p"); | 
| 508   test.equal(Filter.normalize("$$$csp= c s p"), | 523   test.equal(Filter.normalize("$$$csp= c s p"), | 
| 509              "$$$csp=c s p"); | 524              "$$$csp=c s p"); | 
| 510   test.equal(Filter.normalize("foo?csp=b a r$csp=script-src  'self'"), | 525   test.equal(Filter.normalize("foo?csp=b a r$csp=script-src  'self'"), | 
| 511              "foo?csp=bar$csp=script-src 'self'"); | 526              "foo?csp=bar$csp=script-src 'self'"); | 
| 512   test.equal(Filter.normalize("foo$bar=c s p = ba z,cs p = script-src  'self'"), | 527   test.equal(Filter.normalize("foo$bar=c s p = ba z,cs p = script-src  'self'"), | 
| 513              "foo$bar=csp=baz,csp=script-src 'self'"); | 528              "foo$bar=csp=baz,csp=script-src 'self'"); | 
| 514   test.equal(Filter.normalize("foo$csp=c s p csp= ba z,cs p  = script-src  'self
     '"), | 529   test.equal(Filter.normalize("foo$csp=c s p csp= ba z,cs p  = script-src  'self
     '"), | 
| 515              "foo$csp=c s p csp= ba z,csp=script-src 'self'"); | 530              "foo$csp=c s p csp= ba z,csp=script-src 'self'"); | 
| 516   test.equal(Filter.normalize("foo$csp=bar,$c sp=c s p"), | 531   test.equal(Filter.normalize("foo$csp=bar,$c sp=c s p"), | 
| 517              "foo$csp=bar,$csp=c s p"); | 532              "foo$csp=bar,$csp=c s p"); | 
| 518   test.equal(Filter.normalize(" f o   o   $      bar   $csp=ba r"), | 533   test.equal(Filter.normalize(" f o   o   $      bar   $csp=ba r"), | 
| 519              "foo$bar$csp=ba r"); | 534              "foo$bar$csp=ba r"); | 
| 520   test.equal(Filter.normalize("f    $    o    $    o    $    csp=f o o "), | 535   test.equal(Filter.normalize("f    $    o    $    o    $    csp=f o o "), | 
| 521              "f$o$o$csp=f o o"); | 536              "f$o$o$csp=f o o"); | 
| 522   test.equal(Filter.normalize("/foo$/$ csp = script-src  http://example.com/?$1=
     1&$2=2&$3=3"), | 537   test.equal(Filter.normalize("/foo$/$ csp = script-src  http://example.com/?$1=
     1&$2=2&$3=3"), | 
| 523              "/foo$/$csp=script-src http://example.com/?$1=1&$2=2&$3=3"); | 538              "/foo$/$csp=script-src http://example.com/?$1=1&$2=2&$3=3"); | 
| 524 | 539   test.equal(Filter.normalize("||content.server.com/files/*.php$rewrite= $1"), | 
| 525   test.done(); | 540              "||content.server.com/files/*.php$rewrite=$1"); | 
| 526 }; | 541   test.done(); | 
|  | 542 }; | 
|  | 543 | 
|  | 544 | 
|  | 545 exports.testFilterRewriteOption = function(test) | 
|  | 546 { | 
|  | 547   let text = "/(content\\.server\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1"; | 
|  | 548 | 
|  | 549   let filter = Filter.fromText(text); | 
|  | 550 | 
|  | 551   test.equal(filter.rewrite, "$1"); | 
|  | 552   // no rewrite occured: didn't match. | 
|  | 553   test.equal(filter.rewriteUrl("foo"), "foo"); | 
|  | 554   // rewrite occured: matched. | 
|  | 555   test.equal(filter.rewriteUrl("http://content.server/file/foo.txt?bar"), | 
|  | 556              "http://content.server/file/foo.txt"); | 
|  | 557 | 
|  | 558   // checking for same origin. | 
|  | 559   let rewriteDiffOrigin = | 
|  | 560       "/content\\.server(\\/file\\/.*\\.txt)\\?.*$/$rewrite=foo.com$1"; | 
|  | 561   let filterDiffOrigin = Filter.fromText(rewriteDiffOrigin); | 
|  | 562 | 
|  | 563   // no rewrite occured because of a different origin. | 
|  | 564   test.equal( | 
|  | 565     filterDiffOrigin.rewriteUrl("http://content.server/file/foo.txt?bar"), | 
|  | 566     "http://content.server/file/foo.txt?bar" | 
|  | 567   ); | 
|  | 568 | 
|  | 569   // relative path. | 
|  | 570   let rewriteRelative = "/(\\/file\\/.*\\.txt)\\?.*$/$rewrite=$1/disable"; | 
|  | 571   let filterRelative = Filter.fromText(rewriteRelative); | 
|  | 572 | 
|  | 573   test.equal( | 
|  | 574     filterRelative.rewriteUrl("http://content.server/file/foo.txt?bar"), | 
|  | 575     "http://content.server/file/foo.txt/disable" | 
|  | 576   ); | 
|  | 577   test.equal( | 
|  | 578     filterRelative.rewriteUrl("http://example.com/file/foo.txt?bar"), | 
|  | 579     "http://example.com/file/foo.txt/disable" | 
|  | 580   ); | 
|  | 581 | 
|  | 582   // Example from https://github.com/uBlockOrigin/uBlock-issues/issues/46#issuec
     omment-391190533 | 
|  | 583   // The rewrite shouldn't happen. | 
|  | 584   let rewriteEvil = "/(^https?:\\/\\/[^/])/$script,rewrite=$1.evil.com"; | 
|  | 585   let filterEvil = Filter.fromText(rewriteEvil); | 
|  | 586 | 
|  | 587   test.equal( | 
|  | 588     filterEvil.rewriteUrl("https://www.adblockplus.org/script.js"), | 
|  | 589     "https://www.adblockplus.org/script.js" | 
|  | 590   ); | 
|  | 591 | 
|  | 592   test.done(); | 
|  | 593 }; | 
| LEFT | RIGHT | 
|---|