| Left: | ||
| Right: |
| 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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 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 |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 712 collapse = true; | 712 collapse = true; |
| 713 else if (option == "~COLLAPSE") | 713 else if (option == "~COLLAPSE") |
| 714 collapse = false; | 714 collapse = false; |
| 715 else if (option == "SITEKEY" && typeof value != "undefined") | 715 else if (option == "SITEKEY" && typeof value != "undefined") |
| 716 sitekeys = value; | 716 sitekeys = value; |
| 717 else | 717 else |
| 718 return new InvalidFilter(origText, "Unknown option " + option.toLowerCas e()); | 718 return new InvalidFilter(origText, "Unknown option " + option.toLowerCas e()); |
| 719 } | 719 } |
| 720 } | 720 } |
| 721 | 721 |
| 722 if (!blocking && (contentType == null || (contentType & RegExpFilter.typeMap.D OCUMENT)) && | |
| 723 (!options || options.indexOf("DOCUMENT") < 0) && !/^\|?[\w\-]+:/.test(text )) | |
| 724 { | |
| 725 // Exception filters shouldn't apply to pages by default unless they start w ith a protocol name | |
| 726 if (contentType == null) | |
| 727 contentType = RegExpFilter.prototype.contentType; | |
| 728 contentType &= ~RegExpFilter.typeMap.DOCUMENT; | |
| 729 } | |
| 730 | |
| 731 try | 722 try |
| 732 { | 723 { |
| 733 if (blocking) | 724 if (blocking) |
| 734 return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); | 725 return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse); |
| 735 else | 726 else |
| 736 return new WhitelistFilter(origText, text, contentType, matchCase, domains , thirdParty, sitekeys); | 727 return new WhitelistFilter(origText, text, contentType, matchCase, domains , thirdParty, sitekeys); |
| 737 } | 728 } |
| 738 catch (e) | 729 catch (e) |
| 739 { | 730 { |
| 740 return new InvalidFilter(origText, e); | 731 return new InvalidFilter(origText, e); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 759 DTD: 1, | 750 DTD: 1, |
| 760 MEDIA: 16384, | 751 MEDIA: 16384, |
| 761 FONT: 32768, | 752 FONT: 32768, |
| 762 | 753 |
| 763 BACKGROUND: 4, // Backwards compat, same as IMAGE | 754 BACKGROUND: 4, // Backwards compat, same as IMAGE |
| 764 | 755 |
| 765 POPUP: 0x10000000, | 756 POPUP: 0x10000000, |
| 766 ELEMHIDE: 0x40000000 | 757 ELEMHIDE: 0x40000000 |
| 767 }; | 758 }; |
| 768 | 759 |
| 769 // ELEMHIDE, POPUP option shouldn't be there by default | 760 // DOCUMENT, ELEMHIDE, POPUP options shouldn't be there by default |
| 770 RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.ELEMHIDE | RegExpFi lter.typeMap.POPUP); | 761 RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.DOCUMENT | RegExpFi lter.typeMap.ELEMHIDE | RegExpFilter.typeMap.POPUP); |
| 771 | 762 |
| 772 /** | 763 /** |
| 773 * Class for blocking filters | 764 * Class for blocking filters |
| 774 * @param {String} text see Filter() | 765 * @param {String} text see Filter() |
| 775 * @param {String} regexpSource see RegExpFilter() | 766 * @param {String} regexpSource see RegExpFilter() |
| 776 * @param {Number} contentType see RegExpFilter() | 767 * @param {Number} contentType see RegExpFilter() |
| 777 * @param {Boolean} matchCase see RegExpFilter() | 768 * @param {Boolean} matchCase see RegExpFilter() |
| 778 * @param {String} domains see RegExpFilter() | 769 * @param {String} domains see RegExpFilter() |
| 779 * @param {Boolean} thirdParty see RegExpFilter() | 770 * @param {Boolean} thirdParty see RegExpFilter() |
| 780 * @param {String} sitekeys see RegExpFilter() | 771 * @param {String} sitekeys see RegExpFilter() |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 896 let separatorPos = rule.indexOf("="); | 887 let separatorPos = rule.indexOf("="); |
| 897 if (separatorPos > 0) | 888 if (separatorPos > 0) |
| 898 { | 889 { |
| 899 rule = rule.replace(/=/, '="') + '"'; | 890 rule = rule.replace(/=/, '="') + '"'; |
| 900 additional += "[" + rule + "]"; | 891 additional += "[" + rule + "]"; |
| 901 } | 892 } |
| 902 else | 893 else |
| 903 { | 894 { |
| 904 if (id) | 895 if (id) |
| 905 return new InvalidFilter(text, Utils.getString("filter_elemhide_dupl icate_id")); | 896 return new InvalidFilter(text, Utils.getString("filter_elemhide_dupl icate_id")); |
| 906 else | 897 |
| 907 id = rule; | 898 id = rule; |
| 908 } | 899 } |
| 909 } | 900 } |
| 910 } | 901 } |
| 911 | 902 |
| 912 if (id) | 903 if (id) |
| 913 selector = tagName + "." + id + additional + "," + tagName + "#" + id + ad ditional; | 904 selector = tagName + "." + id + additional + "," + tagName + "#" + id + ad ditional; |
| 914 else if (tagName || additional) | 905 else if (tagName || additional) |
| 915 selector = tagName + additional; | 906 selector = tagName + additional; |
| 916 else | 907 else |
| 917 return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria ")); | 908 return new InvalidFilter(text, Utils.getString("filter_elemhide_nocriteria ")); |
| 918 } | 909 } |
| 910 | |
| 919 if (isException) | 911 if (isException) |
| 920 return new ElemHideException(text, domain, selector); | 912 return new ElemHideException(text, domain, selector); |
| 921 else | 913 |
| 922 { | 914 let match = Filter.csspropertyRegExp.exec(selector); |
| 923 if (Filter.csspropertyRegExp.test(selector)) | 915 if (match) |
| 924 { | 916 { |
| 925 // CSS property filters are inefficient so we need to make sure that | 917 // CSS property filters are inefficient so we need to make sure that |
| 926 // they're only applied if they specify active domains | 918 // they're only applied if they specify active domains |
| 927 if (!/,[^~][^,.]*\.[^,]/.test("," + domain)) | 919 if (!/,[^~][^,.]*\.[^,]/.test("," + domain)) |
|
Sebastian Noack
2015/05/06 13:07:48
This regex will allow "foo.." (note that this is e
Thomas Greiner
2015/05/06 15:33:07
While "foo.." might be equivalent to "foo" when us
| |
| 928 return new InvalidFilter(text, Utils.getString("filter_cssproperty_nodom ain")); | 920 return new InvalidFilter(text, Utils.getString("filter_cssproperty_nodomai n")); |
| 929 | 921 |
| 930 return new CSSPropertyFilter(text, domain, selector); | 922 return new CSSPropertyFilter(text, domain, selector, match[2], |
| 931 } | 923 selector.substr(0, match.index), |
| 932 | 924 selector.substr(match.index + match[0].length)); |
| 933 return new ElemHideFilter(text, domain, selector); | 925 } |
| 934 } | 926 |
| 927 return new ElemHideFilter(text, domain, selector); | |
| 935 }; | 928 }; |
| 936 | 929 |
| 937 /** | 930 /** |
| 938 * Class for element hiding filters | 931 * Class for element hiding filters |
| 939 * @param {String} text see Filter() | 932 * @param {String} text see Filter() |
| 940 * @param {String} domains see ElemHideBase() | 933 * @param {String} domains see ElemHideBase() |
| 941 * @param {String} selector see ElemHideBase() | 934 * @param {String} selector see ElemHideBase() |
| 942 * @constructor | 935 * @constructor |
| 943 * @augments ElemHideBase | 936 * @augments ElemHideBase |
| 944 */ | 937 */ |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 967 } | 960 } |
| 968 exports.ElemHideException = ElemHideException; | 961 exports.ElemHideException = ElemHideException; |
| 969 | 962 |
| 970 ElemHideException.prototype = | 963 ElemHideException.prototype = |
| 971 { | 964 { |
| 972 __proto__: ElemHideBase.prototype | 965 __proto__: ElemHideBase.prototype |
| 973 }; | 966 }; |
| 974 | 967 |
| 975 /** | 968 /** |
| 976 * Class for CSS property filters | 969 * Class for CSS property filters |
| 977 * @param {String} text see Filter() | 970 * @param {String} text see Filter() |
| 978 * @param {String} domains see ElemHideBase() | 971 * @param {String} domains see ElemHideBase() |
| 979 * @param {String} selector see ElemHideBase() | 972 * @param {String} selector see ElemHideBase() |
| 973 * @param {String} regexpSource see CSSPropertyFilter.regexpSource | |
| 974 * @param {String} selectorPrefix see CSSPropertyFilter.selectorPrefix | |
| 975 * @param {String} selectorSuffix see CSSPropertyFilter.selectorSuffix | |
| 980 * @constructor | 976 * @constructor |
| 981 * @augments ElemHideBase | 977 * @augments ElemHideBase |
| 982 */ | 978 */ |
| 983 function CSSPropertyFilter(text, domains, selector) | 979 function CSSPropertyFilter(text, domains, selector, regexpSource, |
| 980 selectorPrefix, selectorSuffix) | |
| 984 { | 981 { |
| 985 ElemHideBase.call(this, text, domains, selector); | 982 ElemHideBase.call(this, text, domains, selector); |
| 986 | 983 |
| 987 let properties; | 984 this.regexpSource = regexpSource; |
| 988 [properties, , this.regexpSource] = selector.match(Filter.csspropertyRegExp); | 985 this.selectorPrefix = selectorPrefix; |
| 989 [this.selectorPrefix, this.selectorSuffix] = selector.split(properties); | 986 this.selectorSuffix = selectorSuffix; |
| 990 } | 987 } |
| 991 exports.CSSPropertyFilter = CSSPropertyFilter; | 988 exports.CSSPropertyFilter = CSSPropertyFilter; |
| 992 | 989 |
| 993 CSSPropertyFilter.prototype = | 990 CSSPropertyFilter.prototype = |
| 994 { | 991 { |
| 995 __proto__: ElemHideBase.prototype, | 992 __proto__: ElemHideBase.prototype, |
| 996 | 993 |
| 997 /** | 994 /** |
| 998 * Expression from which a regular expression should be generated for matching | 995 * Expression from which a regular expression should be generated for matching |
| 999 * CSS properties - for delayed creation of the regexpString property | 996 * CSS properties - for delayed creation of the regexpString property |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 1024 // several times on Safari, due to WebKit bug 132872 | 1021 // several times on Safari, due to WebKit bug 132872 |
| 1025 let prop = Object.getOwnPropertyDescriptor(this, "regexpString"); | 1022 let prop = Object.getOwnPropertyDescriptor(this, "regexpString"); |
| 1026 if (prop) | 1023 if (prop) |
| 1027 return prop.value; | 1024 return prop.value; |
| 1028 | 1025 |
| 1029 let regexp = Filter.toRegExp(this.regexpSource); | 1026 let regexp = Filter.toRegExp(this.regexpSource); |
| 1030 Object.defineProperty(this, "regexpString", {value: regexp}); | 1027 Object.defineProperty(this, "regexpString", {value: regexp}); |
| 1031 return regexp; | 1028 return regexp; |
| 1032 } | 1029 } |
| 1033 }; | 1030 }; |
| LEFT | RIGHT |