| Index: lib/filterClasses.js |
| =================================================================== |
| --- a/lib/filterClasses.js |
| +++ b/lib/filterClasses.js |
| @@ -76,16 +76,26 @@ |
| * @type {string} |
| */ |
| get type() |
| { |
| throw new Error("Please define filter type in the subclass"); |
| }, |
| /** |
| + * Whether this object is discarded after use. If <code>false</code>, the |
| + * object is retained in memory once created and every call to |
| + * {@link Filter#fromText} returns the same instance. Defaults to |
| + * <code>false</code>. |
| + * @type {boolean} |
| + * @package |
| + */ |
| + ephemeral: false, |
| + |
| + /** |
| * Subscriptions to which this filter belongs. |
| * @type {?(Subscription|Set.<Subscription>)} |
| * @private |
| */ |
| _subscriptions: null, |
| /** |
| * Whether the filter's subscriptions have already been added to the filter. |
| @@ -223,19 +233,21 @@ |
| */ |
| Filter.invalidCSPRegExp = /(;|^) ?(base-uri|referrer|report-to|report-uri|upgrade-insecure-requests)\b/i; |
| /** |
| * Creates a filter of correct type from its text representation - does the |
| * basic parsing and calls the right constructor then. |
| * |
| * @param {string} text as in Filter() |
| + * @param {boolean} persistent Whether the filter object should be persisted in |
| + * memory. |
| * @return {Filter} |
| */ |
| -Filter.fromText = function(text) |
| +Filter.fromText = function(text, persistent = true) |
|
Manish Jethani
2018/11/18 06:19:14
The idea here is that internally we'll always pass
|
| { |
| let filter = Filter.knownFilters.get(text); |
| if (filter) |
| return filter; |
| if (text[0] == "!") |
| { |
| filter = new CommentFilter(text); |
| @@ -244,17 +256,22 @@ |
| { |
| let match = text.includes("#") ? Filter.contentRegExp.exec(text) : null; |
| if (match) |
| filter = ContentFilter.fromText(text, match[1], match[2], match[3]); |
| else |
| filter = RegExpFilter.fromText(text); |
| } |
| - Filter.knownFilters.set(filter.text, filter); |
| + if (persistent) |
| + filter.ephemeral = false; |
| + |
| + if (!filter.ephemeral) |
| + Filter.knownFilters.set(filter.text, filter); |
| + |
| return filter; |
| }; |
| /** |
| * Deserializes a filter |
| * |
| * @param {Object} obj map of serialized properties and their values |
| * @return {Filter} filter or null if the filter couldn't be created |
| @@ -1311,17 +1328,23 @@ |
| */ |
| function ElemHideFilter(text, domains, selector) |
| { |
| ElemHideBase.call(this, text, domains, selector); |
| } |
| exports.ElemHideFilter = ElemHideFilter; |
| ElemHideFilter.prototype = extend(ElemHideBase, { |
| - type: "elemhide" |
| + type: "elemhide", |
| + |
| + /** |
| + * See Filter.ephemeral |
| + * @inheritdoc |
| + */ |
| + ephemeral: true |
| }); |
| /** |
| * Class for element hiding exceptions |
| * @param {string} text see {@link Filter Filter()} |
| * @param {string} [domains] see {@link ElemHideBase ElemHideBase()} |
| * @param {string} selector see {@link ElemHideBase ElemHideBase()} |
| * @constructor |