Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/filterClasses.js

Issue 29383960: Issue 3143 - Filter elements with :-abp-has() (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore
Patch Set: Filter reporting was broken in the previous revision. Created May 12, 2017, 3:40 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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-2017 eyeo GmbH 3 * Copyright (C) 2006-2017 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 908 matching lines...) Expand 10 before | Expand all | Expand 10 after
919 * @type {string} 919 * @type {string}
920 */ 920 */
921 selectorDomain: null, 921 selectorDomain: null,
922 /** 922 /**
923 * CSS selector for the HTML elements that should be hidden 923 * CSS selector for the HTML elements that should be hidden
924 * @type {string} 924 * @type {string}
925 */ 925 */
926 selector: null 926 selector: null
927 }); 927 });
928 928
929 const abpSelectorRegExp = /\[-abp-selector=(["'])(.+)\1\]/;
930 const abpPropertySelectorRegExp = /\[-abp-properties=(["'])([^"']+)\1\]/;
931
929 /** 932 /**
930 * Creates an element hiding filter from a pre-parsed text representation 933 * Creates an element hiding filter from a pre-parsed text representation
931 * 934 *
932 * @param {string} text same as in Filter() 935 * @param {string} text same as in Filter()
933 * @param {string} domain 936 * @param {string} domain
934 * domain part of the text representation (can be empty) 937 * domain part of the text representation (can be empty)
935 * @param {boolean} isException exception rule indicator 938 * @param {boolean} isException exception rule indicator
936 * @param {string} tagName tag name part (can be empty) 939 * @param {string} tagName tag name part (can be empty)
937 * @param {string} attrRules attribute matching rules (can be empty) 940 * @param {string} attrRules attribute matching rules (can be empty)
938 * @param {string} selector raw CSS selector (can be empty) 941 * @param {string} selector raw CSS selector (can be empty)
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
978 else 981 else
979 return new InvalidFilter(text, "filter_elemhide_nocriteria"); 982 return new InvalidFilter(text, "filter_elemhide_nocriteria");
980 } 983 }
981 984
982 // We don't allow ElemHide filters which have any empty domains. 985 // We don't allow ElemHide filters which have any empty domains.
983 // Note: The ElemHide.prototype.domainSeparator is duplicated here, if that 986 // Note: The ElemHide.prototype.domainSeparator is duplicated here, if that
984 // changes this must be changed too. 987 // changes this must be changed too.
985 if (domain && /(^|,)~?(,|$)/.test(domain)) 988 if (domain && /(^|,)~?(,|$)/.test(domain))
986 return new InvalidFilter(text, "filter_invalid_domain"); 989 return new InvalidFilter(text, "filter_invalid_domain");
987 990
991 let isHideEmulation = false;
992 if ((selector.indexOf("[-abp-properties=") != -1) ||
993 (selector.indexOf("[-abp-selector=") != -1))
994 {
995 isHideEmulation = true;
996
997 // Element hiding emulation filters are inefficient so we need to make sure
998 // that they're only applied if they specify active domains
999 if (!/,[^~][^,.]*\.[^,]/.test("," + domain))
1000 return new InvalidFilter(text, "filter_elemhideemulation_nodomain");
1001
1002 let match = abpSelectorRegExp.exec(selector);
1003 if (match)
1004 {
1005 let prefix = selector.substr(0, match.index);
1006 let suffix = selector.substr(match.index + match[0].length);
1007 selector = prefix + match[2] + suffix;
1008 }
1009 match = abpPropertySelectorRegExp.exec(selector);
1010 if (match)
1011 {
1012 let prefix = selector.substr(0, match.index);
1013 let suffix = selector.substr(match.index + match[0].length);
1014 selector = prefix + ":-abp-properties(" +
1015 match[1] + match[2] + match[1] + ")" + suffix;
1016 }
1017 }
1018
988 if (isException) 1019 if (isException)
989 return new ElemHideException(text, domain, selector); 1020 return new ElemHideException(text, domain, selector);
990 1021
991 if (selector.indexOf("[-abp-properties=") != -1) 1022 if (isHideEmulation)
992 { 1023 {
993 // Element hiding emulation filters are inefficient so we need to make sure 1024 // Element hiding emulation filters are inefficient so we need to make sure
994 // that they're only applied if they specify active domains 1025 // that they're only applied if they specify active domains
995 if (!/,[^~][^,.]*\.[^,]/.test("," + domain)) 1026 if (!/,[^~][^,.]*\.[^,]/.test("," + domain))
996 return new InvalidFilter(text, "filter_elemhideemulation_nodomain"); 1027 return new InvalidFilter(text, "filter_elemhideemulation_nodomain");
997 1028
998 return new ElemHideEmulationFilter(text, domain, selector); 1029 return new ElemHideEmulationFilter(text, domain, selector);
999 } 1030 }
1000 1031
1001 return new ElemHideFilter(text, domain, selector); 1032 return new ElemHideFilter(text, domain, selector);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1047 */ 1078 */
1048 function ElemHideEmulationFilter(text, domains, selector) 1079 function ElemHideEmulationFilter(text, domains, selector)
1049 { 1080 {
1050 ElemHideBase.call(this, text, domains, selector); 1081 ElemHideBase.call(this, text, domains, selector);
1051 } 1082 }
1052 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; 1083 exports.ElemHideEmulationFilter = ElemHideEmulationFilter;
1053 1084
1054 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { 1085 ElemHideEmulationFilter.prototype = extend(ElemHideBase, {
1055 type: "elemhideemulation" 1086 type: "elemhideemulation"
1056 }); 1087 });
OLDNEW

Powered by Google App Engine
This is Rietveld