| Index: lib/content/elemHideEmulation.js |
| =================================================================== |
| --- a/lib/content/elemHideEmulation.js |
| +++ b/lib/content/elemHideEmulation.js |
| @@ -12,17 +12,17 @@ |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| "use strict"; |
| -const {filterToRegExp, splitSelector} = require("../common"); |
| +const {textToRegExp, filterToRegExp, splitSelector} = require("../common"); |
| let MIN_INVOCATION_INTERVAL = 3000; |
| const MAX_SYNCHRONOUS_PROCESSING_TIME = 50; |
| const abpSelectorRegexp = /:-abp-([\w-]+)\(/i; |
| /** Return position of node from parent. |
| * @param {Node} node the node to find the position of. |
| * @return {number} One-based index like for :nth-child(), or 0 on error. |
| @@ -166,16 +166,39 @@ |
| subtree.querySelector(selector); |
| } |
| function scopedQuerySelectorAll(subtree, selector) |
| { |
| return scopedQuerySelector(subtree, selector, true); |
| } |
| +const regexpRegexp = /^\/(.*)\/([im]*)$/; |
| + |
| +/** |
| + * Make a regular expression from a text argument. If it can be parsed as a |
| + * regular expression, parse it and the flags. |
| + * @param {string} text the text argument. |
| + * @return {?RegExp} a RegExp object or null in case of error. |
| + */ |
| +function makeRegExpParameter(text) |
| +{ |
| + let [, pattern, flags] = |
| + regexpRegexp.exec(text) || [undefined, textToRegExp(text)]; |
| + |
| + try |
| + { |
| + return new RegExp(pattern, flags); |
| + } |
| + catch (e) |
| + { |
| + } |
| + return null; |
| +} |
| + |
| function* evaluate(chain, index, prefix, subtree, styles) |
| { |
| if (index >= chain.length) |
| { |
| yield prefix; |
| return; |
| } |
| for (let [selector, element] of |
| @@ -258,17 +281,17 @@ |
| yield null; |
| } |
| } |
| } |
| }; |
| function ContainsSelector(textContent) |
| { |
| - this._text = textContent; |
| + this._regexp = makeRegExpParameter(textContent); |
| } |
| ContainsSelector.prototype = { |
| requiresHiding: true, |
| *getSelectors(prefix, subtree, stylesheet) |
| { |
| for (let element of this.getElements(prefix, subtree, stylesheet)) |
| @@ -280,17 +303,17 @@ |
| let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ? |
| prefix + "*" : prefix; |
| let elements = scopedQuerySelectorAll(subtree, actualPrefix); |
| if (elements) |
| { |
| for (let element of elements) |
| { |
| - if (element.textContent.includes(this._text)) |
| + if (this._regexp && this._regexp.test(element.textContent)) |
| yield element; |
| else |
| yield null; |
| } |
| } |
| } |
| }; |