| OLD | NEW | 
|    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 let {createSandbox} = require("./_common"); |   20 let {createSandbox} = require("./_common"); | 
 |   21 const {withNAD} = require("./_test-utils"); | 
|   21  |   22  | 
|   22 let Filter = null; |   23 let Filter = null; | 
|   23 let InvalidFilter = null; |   24 let InvalidFilter = null; | 
|   24 let CommentFilter = null; |   25 let CommentFilter = null; | 
|   25 let ActiveFilter = null; |   26 let ActiveFilter = null; | 
|   26 let RegExpFilter = null; |   27 let RegExpFilter = null; | 
|   27 let BlockingFilter = null; |   28 let BlockingFilter = null; | 
|   28 let WhitelistFilter = null; |   29 let WhitelistFilter = null; | 
|   29 let ElemHideBase = null; |   30 let ElemHideBase = null; | 
|   30 let ElemHideFilter = null; |   31 let ElemHideFilter = null; | 
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   70     ["foobar#asdf", BlockingFilter, "blocking", 1], |   71     ["foobar#asdf", BlockingFilter, "blocking", 1], | 
|   71     ["foobar|foobas##asdf", BlockingFilter, "blocking", 1], |   72     ["foobar|foobas##asdf", BlockingFilter, "blocking", 1], | 
|   72     ["foobar##asdf{asdf}", ElemHideFilter, "elemhide"], |   73     ["foobar##asdf{asdf}", ElemHideFilter, "elemhide"], | 
|   73     ["foobar##", BlockingFilter, "blocking", 1], |   74     ["foobar##", BlockingFilter, "blocking", 1], | 
|   74     ["foobar#@#", BlockingFilter, "blocking", 1], |   75     ["foobar#@#", BlockingFilter, "blocking", 1], | 
|   75     ["asdf$foobar", InvalidFilter, "invalid"], |   76     ["asdf$foobar", InvalidFilter, "invalid"], | 
|   76     ["asdf$image,foobar", InvalidFilter, "invalid"], |   77     ["asdf$image,foobar", InvalidFilter, "invalid"], | 
|   77     ["asdf$image=foobar", BlockingFilter, "blocking", 1], |   78     ["asdf$image=foobar", BlockingFilter, "blocking", 1], | 
|   78     ["asdf$image=foobar=xyz,~collapse", BlockingFilter, "blocking", 0], |   79     ["asdf$image=foobar=xyz,~collapse", BlockingFilter, "blocking", 0], | 
|   79  |   80  | 
|   80     ["##foo[-abp-properties='something']bar", InvalidFilter, "invalid"], |   81     ["#?#foo:-abp-properties(something)bar", InvalidFilter, "invalid"], | 
|   81     ["#@#foo[-abp-properties='something']bar", ElemHideException, "elemhideexcep
     tion"], |   82     ["#@#foo:-abp-properties(something)bar", ElemHideException, "elemhideexcepti
     on"], | 
|   82     ["example.com##foo[-abp-properties='something']bar", ElemHideEmulationFilter
     , "elemhideemulation"], |   83     ["example.com#?#foo:-abp-properties(something)bar", ElemHideEmulationFilter,
      "elemhideemulation"], | 
|   83     ["example.com#@#foo[-abp-properties='something']bar", ElemHideException, "el
     emhideexception"], |   84     ["example.com#@#foo:-abp-properties(something)bar", ElemHideException, "elem
     hideexception"], | 
|   84     ["~example.com##foo[-abp-properties='something']bar", InvalidFilter, "invali
     d"], |   85     ["~example.com#?#foo:-abp-properties(something)bar", InvalidFilter, "invalid
     "], | 
|   85     ["~example.com#@#foo[-abp-properties='something']bar", ElemHideException, "e
     lemhideexception"], |   86     ["~example.com#@#foo:-abp-properties(something)bar", ElemHideException, "ele
     mhideexception"], | 
|   86     ["~example.com,~example.info##foo[-abp-properties='something']bar", InvalidF
     ilter, "invalid"], |   87     ["~example.com,~example.info#?#foo:-abp-properties(something)bar", InvalidFi
     lter, "invalid"], | 
|   87     ["~example.com,~example.info#@#foo[-abp-properties='something']bar", ElemHid
     eException, "elemhideexception"], |   88     ["~example.com,~example.info#@#foo:-abp-properties(something)bar", ElemHideE
     xception, "elemhideexception"], | 
|   88     ["~sub.example.com,example.com##foo[-abp-properties='something']bar", ElemHi
     deEmulationFilter, "elemhideemulation"], |   89     ["~sub.example.com,example.com#?#foo:-abp-properties(something)bar", ElemHid
     eEmulationFilter, "elemhideemulation"], | 
|   89     ["~sub.example.com,example.com#@#foo[-abp-properties='something']bar", ElemH
     ideException, "elemhideexception"], |   90     ["~sub.example.com,example.com#@#foo:-abp-properties(something)bar", ElemHid
     eException, "elemhideexception"], | 
|   90     ["example.com,~sub.example.com##foo[-abp-properties='something']bar", ElemHi
     deEmulationFilter, "elemhideemulation"], |   91     ["example.com,~sub.example.com#?#foo:-abp-properties(something)bar", ElemHid
     eEmulationFilter, "elemhideemulation"], | 
|   91     ["example.com,~sub.example.com#@#foo[-abp-properties='something']bar", ElemH
     ideException, "elemhideexception"], |   92     ["example.com,~sub.example.com#@#foo:-abp-properties(something)bar", ElemHid
     eException, "elemhideexception"], | 
|   92     ["example.com##[-abp-properties='something']", ElemHideEmulationFilter, "ele
     mhideemulation"], |   93     ["example.com#?#:-abp-properties(something)", ElemHideEmulationFilter, "elem
     hideemulation"], | 
|   93     ["example.com#@#[-abp-properties='something']", ElemHideException, "elemhide
     exception"], |   94     ["example.com#@#:-abp-properties(something)", ElemHideException, "elemhideex
     ception"], | 
|   94     ["example.com##[-abp-properties=\"something\"]", ElemHideEmulationFilter, "e
     lemhideemulation"], |   95     ["example.com#?#:-abp-properties((something))", ElemHideEmulationFilter, "el
     emhideemulation"], | 
|   95     ["example.com#@#[-abp-properties=\"something\"]", ElemHideException, "elemhi
     deexception"], |   96     ["example.com#@#:-abp-properties((something))", ElemHideException, "elemhide
     exception"] | 
|   96     ["example.com##[-abp-properties=(something)]", ElemHideEmulationFilter, "ele
     mhideemulation"], |  | 
|   97     ["example.com#@#[-abp-properties=(something)]", ElemHideException, "elemhide
     exception"] |  | 
|   98   ]; |   97   ]; | 
|   99   for (let [text, type, typeName, collapse] of tests) |   98   for (let [text, type, typeName, collapse] of tests) | 
|  100   { |   99   { | 
|  101     let filter = Filter.fromText(text); |  100     withNAD(0, filter => | 
|  102     test.ok(filter instanceof Filter, "Got filter for " + text); |  101     { | 
|  103     test.equal(filter.text, text, "Correct filter text for " + text); |  102       test.ok(filter instanceof Filter, "Got filter for " + text); | 
|  104     test.ok(filter instanceof type, "Correct filter type for " + text); |  103       test.equal(filter.text, text, "Correct filter text for " + text); | 
|  105     test.equal(filter.type, typeName, "Type name for " + text + " is " + typeNam
     e); |  104       test.ok(filter instanceof type, "Correct filter type for " + text); | 
|  106     if (filter instanceof BlockingFilter) |  105       test.equal(filter.type, typeName, "Type name for " + text + " is " + typeN
     ame); | 
|  107       test.equal(filter.collapse, collapse); |  106       if (filter instanceof BlockingFilter) | 
|  108     else |  107         test.equal(filter.collapse, collapse); | 
|  109       test.equal(filter.collapse, undefined); |  108       else | 
|  110     if (type == InvalidFilter) |  109         test.equal(filter.collapse, undefined); | 
|  111       test.ok(filter.reason, "Invalid filter " + text + " has a reason set"); |  110       if (type == InvalidFilter) | 
|  112     filter.delete(); |  111         test.ok(filter.reason, "Invalid filter " + text + " has a reason set"); | 
 |  112     })(Filter.fromText(text)); | 
|  113   } |  113   } | 
 |  114  | 
 |  115   // conversion from old syntax. | 
 |  116   withNAD(0, filter => | 
 |  117   { | 
 |  118     test.equal(filter.text, "example.com#?#:-abp-properties(something)"); | 
 |  119     test.ok(filter instanceof ElemHideEmulationFilter); | 
 |  120     test.equal(filter.type, "elemhideemulation"); | 
 |  121   })(Filter.fromText("example.com##[-abp-properties='something']")); | 
 |  122  | 
|  114   test.done(); |  123   test.done(); | 
|  115 }; |  124 }; | 
|  116  |  125  | 
|  117 exports.testClassHierarchy = function(test) |  126 exports.testClassHierarchy = function(test) | 
|  118 { |  127 { | 
|  119   let allClasses = [ |  128   let allClasses = [ | 
|  120     Filter, InvalidFilter, CommentFilter, ActiveFilter, |  129     Filter, InvalidFilter, CommentFilter, ActiveFilter, | 
|  121     RegExpFilter, BlockingFilter, WhitelistFilter, ElemHideBase, |  130     RegExpFilter, BlockingFilter, WhitelistFilter, ElemHideBase, | 
|  122     ElemHideFilter, ElemHideException, ElemHideEmulationFilter |  131     ElemHideFilter, ElemHideException, ElemHideEmulationFilter | 
|  123   ]; |  132   ]; | 
|  124   let tests = [ |  133   let tests = [ | 
|  125     ["/asdf??+/", Filter, InvalidFilter], |  134     ["/asdf??+/", Filter, InvalidFilter], | 
|  126     ["!asdf", Filter, CommentFilter], |  135     ["!asdf", Filter, CommentFilter], | 
|  127     ["asdf", Filter, ActiveFilter, RegExpFilter, BlockingFilter], |  136     ["asdf", Filter, ActiveFilter, RegExpFilter, BlockingFilter], | 
|  128     ["@@asdf", Filter, ActiveFilter, RegExpFilter, WhitelistFilter], |  137     ["@@asdf", Filter, ActiveFilter, RegExpFilter, WhitelistFilter], | 
|  129     ["##asdf", Filter, ActiveFilter, ElemHideBase, ElemHideFilter], |  138     ["##asdf", Filter, ActiveFilter, ElemHideBase, ElemHideFilter], | 
|  130     ["#@#asdf", Filter, ActiveFilter, ElemHideBase, ElemHideException], |  139     ["#@#asdf", Filter, ActiveFilter, ElemHideBase, ElemHideException], | 
|  131     ["example.com##[-abp-properties='something']", Filter, ActiveFilter, ElemHid
     eBase, ElemHideEmulationFilter] |  140     ["example.com#?#:-abp-properties(something)", Filter, ActiveFilter, ElemHide
     Base, ElemHideEmulationFilter] | 
|  132   ]; |  141   ]; | 
|  133  |  142  | 
|  134   for (let list of tests) |  143   for (let list of tests) | 
|  135   { |  144   { | 
|  136     let filter = Filter.fromText(list.shift()); |  145     let filter = Filter.fromText(list.shift()); | 
|  137     for (let cls of list) |  146     for (let cls of list) | 
|  138     { |  147     { | 
|  139       test.ok(filter instanceof cls, |  148       test.ok(filter instanceof cls, | 
|  140           "Testing correct superclass for filter " + filter.text); |  149           "Testing correct superclass for filter " + filter.text); | 
|  141     } |  150     } | 
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  270   filter.delete(); |  279   filter.delete(); | 
|  271  |  280  | 
|  272   test.done(); |  281   test.done(); | 
|  273 }; |  282 }; | 
|  274  |  283  | 
|  275 exports.testInvalidReasons = function(test) |  284 exports.testInvalidReasons = function(test) | 
|  276 { |  285 { | 
|  277   let tests = [ |  286   let tests = [ | 
|  278     ["/??/", "filter_invalid_regexp"], |  287     ["/??/", "filter_invalid_regexp"], | 
|  279     ["asd$foobar", "filter_unknown_option"], |  288     ["asd$foobar", "filter_unknown_option"], | 
|  280     ["~foo.com##[-abp-properties='abc']", "filter_elemhideemulation_nodomain"] |  289     ["~foo.com#?#:-abp-properties(abc)", "filter_elemhideemulation_nodomain"] | 
|  281   ]; |  290   ]; | 
|  282  |  291  | 
|  283   for (let [text, reason] of tests) |  292   for (let [text, reason] of tests) | 
|  284   { |  293   { | 
|  285     let filter = Filter.fromText(text); |  294     let filter = Filter.fromText(text); | 
|  286     test.equals(filter.reason, reason, "Reason why filter " + text + " is invali
     d"); |  295     test.equals(filter.reason, reason, "Reason why filter " + text + " is invali
     d"); | 
|  287     filter.delete(); |  296     filter.delete(); | 
|  288   } |  297   } | 
|  289  |  298  | 
|  290   test.done(); |  299   test.done(); | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  365     filter.delete(); |  374     filter.delete(); | 
|  366   } |  375   } | 
|  367  |  376  | 
|  368   let tests = [ |  377   let tests = [ | 
|  369     ["##foobar", "foobar", ""], |  378     ["##foobar", "foobar", ""], | 
|  370     ["~example.com##foobar", "foobar", ""], |  379     ["~example.com##foobar", "foobar", ""], | 
|  371     ["example.com##body > div:first-child", "body > div:first-child", "example.c
     om"], |  380     ["example.com##body > div:first-child", "body > div:first-child", "example.c
     om"], | 
|  372     ["xYz,~example.com##foobar:not(whatever)", "foobar:not(whatever)", "xyz"], |  381     ["xYz,~example.com##foobar:not(whatever)", "foobar:not(whatever)", "xyz"], | 
|  373     ["~xyz,com,~abc.com,example.info##foobar", "foobar", "com,example.info"], |  382     ["~xyz,com,~abc.com,example.info##foobar", "foobar", "com,example.info"], | 
|  374     ["foo,bar,bas,bam##foobar", "foobar", "foo,bar,bas,bam"], |  383     ["foo,bar,bas,bam##foobar", "foobar", "foo,bar,bas,bam"], | 
|  375     ["foo.com##x[-abp-properties='abc']y", "x[-abp-properties='abc']y", "foo.com
     "], |  384     ["foo.com##x:-abp-properties(abc)y", "x:-abp-properties(abc)y", "foo.com"], | 
|  376  |  385  | 
|  377     // Good idea to test this? Maybe consider behavior undefined in this case. |  386     // Good idea to test this? Maybe consider behavior undefined in this case. | 
|  378     ["foo,bar,bas,~bar##foobar", "foobar", "foo,bas"] |  387     ["foo,bar,bas,~bar##foobar", "foobar", "foo,bas"] | 
|  379   ]; |  388   ]; | 
|  380  |  389  | 
|  381   for (let [text, selector, selectorDomain] of tests) |  390   for (let [text, selector, selectorDomain] of tests) | 
|  382   { |  391   { | 
|  383     doTest(text, selector, selectorDomain); |  392     doTest(text, selector, selectorDomain); | 
|  384     doTest(text.replace("##", "#@#"), selector, selectorDomain); |  393     doTest(text.replace("##", "#@#"), selector, selectorDomain); | 
|  385   } |  394   } | 
|  386  |  395  | 
|  387   test.done(); |  396   test.done(); | 
|  388 }; |  397 }; | 
|  389  |  398  | 
|  390 exports.testElemHideRulesWithBraces = function(test) |  399 exports.testElemHideRulesWithBraces = function(test) | 
|  391 { |  400 { | 
|  392   let filter = Filter.fromText("###foo{color: red}"); |  401   withNAD(0, filter => | 
|  393   test.equal(filter.type, "elemhide"); |  402   { | 
|  394   test.equal(filter.selector, "#foo\\7B color: red\\7D "); |  403     test.equal(filter.type, "elemhide"); | 
|  395   filter.delete(); |  404     test.equal(filter.selector, "#foo\\7B color: red\\7D "); | 
 |  405   })(Filter.fromText("###foo{color: red}")); | 
|  396  |  406  | 
|  397   filter = Filter.fromText("foo.com##[-abp-properties='/margin: [3-4]{2}/']"); |  407   // Filter conversion to the new syntax dealing with braces too. | 
|  398   test.equal(filter.type, "elemhideemulation"); |  408   withNAD(0, filter => | 
|  399   test.equal(filter.selector, "[-abp-properties='/margin: [3-4]\\7B 2\\7D /']"); |  409   { | 
|  400   filter.delete(); |  410     test.equal(filter.type, "elemhideemulation"); | 
 |  411     test.equal(filter.selector, ":-abp-properties(/margin: [3-4]\\7B 2\\7D /)"); | 
 |  412   })(Filter.fromText("foo.com##[-abp-properties='/margin: [3-4]{2}/']")); | 
|  401  |  413  | 
|  402   test.done(); |  414   test.done(); | 
|  403 }; |  415 }; | 
|  404  |  416  | 
|  405 exports.testNotifications = function(test) |  417 exports.testNotifications = function(test) | 
|  406 { |  418 { | 
|  407   function checkNotifications(action, expected, message) |  419   function checkNotifications(action, expected, message) | 
|  408   { |  420   { | 
|  409     let result = null; |  421     let result = null; | 
|  410     let listener = (topic, filter) => |  422     let listener = (topic, filter) => | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  452     filter.hitCount++; |  464     filter.hitCount++; | 
|  453   }, ["filter.hitCount", "foobar"], "Increasing filter hit counts"); |  465   }, ["filter.hitCount", "foobar"], "Increasing filter hit counts"); | 
|  454   checkNotifications(() => |  466   checkNotifications(() => | 
|  455   { |  467   { | 
|  456     filter.hitCount = 0; |  468     filter.hitCount = 0; | 
|  457   }, ["filter.hitCount", "foobar"], "Resetting filter hit counts"); |  469   }, ["filter.hitCount", "foobar"], "Resetting filter hit counts"); | 
|  458  |  470  | 
|  459   filter.delete(); |  471   filter.delete(); | 
|  460   test.done(); |  472   test.done(); | 
|  461 }; |  473 }; | 
| OLD | NEW |