| Index: lib/filterClasses.js |
| =================================================================== |
| --- a/lib/filterClasses.js |
| +++ b/lib/filterClasses.js |
| @@ -982,17 +982,18 @@ ElemHideBase.fromText = function(text, d |
| // Note: The ElemHide.prototype.domainSeparator is duplicated here, if that |
| // changes this must be changed too. |
| if (domain && /(^|,)~?(,|$)/.test(domain)) |
| return new InvalidFilter(text, "filter_invalid_domain"); |
| if (isException) |
| return new ElemHideException(text, domain, selector); |
| - if (selector.indexOf("[-abp-properties") != -1) |
| + if ((selector.indexOf("[-abp-properties") != -1) || |
| + (selector.indexOf(":has(") != -1)) |
| { |
| // Element hiding emulation filters are inefficient so we need to make sure |
| // that they're only applied if they specify active domains |
| if (!/,[^~][^,.]*\.[^,]/.test("," + domain)) |
| return new InvalidFilter(text, "filter_elemhideemulation_nodomain"); |
| return new ElemHideEmulationFilter(text, domain, selector); |
| } |
| @@ -1042,14 +1043,18 @@ ElemHideException.prototype = extend(Ele |
| * @param {string} domains see ElemHideBase() |
| * @param {string} selector see ElemHideBase() |
| * @constructor |
| * @augments ElemHideBase |
| */ |
| function ElemHideEmulationFilter(text, domains, selector) |
| { |
| ElemHideBase.call(this, text, domains, selector); |
| + this.cssPropFilter = (selector.indexOf("[-abp-properties") != -1); |
| + this.pseudoClassHas = (selector.indexOf(":has(") != -1); |
| } |
| exports.ElemHideEmulationFilter = ElemHideEmulationFilter; |
| ElemHideEmulationFilter.prototype = extend(ElemHideBase, { |
| - type: "elemhideemulation" |
| + type: "elemhideemulation", |
| + cssPropFilter: false, |
| + pseudoClassHas: false |
| }); |