| Index: lib/filterClasses.js |
| diff --git a/lib/filterClasses.js b/lib/filterClasses.js |
| index 5a8ac6d77bf116ace79ceebbbf3df1b02dc11fc6..b8be92b981f5631bf690edc28110c75527796142 100644 |
| --- a/lib/filterClasses.js |
| +++ b/lib/filterClasses.js |
| @@ -20,6 +20,7 @@ |
| */ |
| let {FilterNotifier} = require("filterNotifier"); |
| +let {desc} = require("coreUtils"); |
| /** |
| * Abstract base class for filters |
| @@ -210,10 +211,7 @@ function InvalidFilter(text, reason) |
| } |
| exports.InvalidFilter = InvalidFilter; |
| -InvalidFilter.prototype = |
| -{ |
| - __proto__: Filter.prototype, |
| - |
| +InvalidFilter.prototype = Object.create(Filter.prototype, desc({ |
| type: "invalid", |
| /** |
| @@ -226,7 +224,7 @@ InvalidFilter.prototype = |
| * See Filter.serialize() |
| */ |
| serialize: function(buffer) {} |
| -}; |
| +})); |
| /** |
| * Class for comments |
| @@ -240,17 +238,14 @@ function CommentFilter(text) |
| } |
| exports.CommentFilter = CommentFilter; |
| -CommentFilter.prototype = |
| -{ |
| - __proto__: Filter.prototype, |
| - |
| +CommentFilter.prototype = Object.create(Filter.prototype, desc({ |
| type: "comment", |
| /** |
| * See Filter.serialize() |
| */ |
| serialize: function(buffer) {} |
| -}; |
| +})); |
| /** |
| * Abstract base class for filters that can get hits |
| @@ -267,10 +262,7 @@ function ActiveFilter(text, domains) |
| } |
| exports.ActiveFilter = ActiveFilter; |
| -ActiveFilter.prototype = |
| -{ |
| - __proto__: Filter.prototype, |
| - |
| +ActiveFilter.prototype = Object.create(Filter.prototype, desc({ |
| _disabled: false, |
| _hitCount: 0, |
| _lastHit: 0, |
| @@ -279,57 +271,66 @@ ActiveFilter.prototype = |
| * Defines whether the filter is disabled |
| * @type Boolean |
| */ |
| - get disabled() |
| - { |
| - return this._disabled; |
| - }, |
| - set disabled(value) |
| - { |
| - if (value != this._disabled) |
| + disabled: { |
| + get: function() |
| { |
| - let oldValue = this._disabled; |
| - this._disabled = value; |
| - FilterNotifier.triggerListeners("filter.disabled", this, value, oldValue); |
| + return this._disabled; |
| + }, |
| + set: function(value) |
| + { |
| + if (value != this._disabled) |
| + { |
| + let oldValue = this._disabled; |
| + this._disabled = value; |
| + FilterNotifier.triggerListeners("filter.disabled", this, |
| + value, oldValue); |
| + } |
| + return this._disabled; |
| } |
| - return this._disabled; |
| }, |
| /** |
| * Number of hits on the filter since the last reset |
| * @type Number |
| */ |
| - get hitCount() |
| - { |
| - return this._hitCount; |
| - }, |
| - set hitCount(value) |
| - { |
| - if (value != this._hitCount) |
| + hitCount: { |
| + get: function() |
| { |
| - let oldValue = this._hitCount; |
| - this._hitCount = value; |
| - FilterNotifier.triggerListeners("filter.hitCount", this, value, oldValue); |
| + return this._hitCount; |
| + }, |
| + set: function(value) |
| + { |
| + if (value != this._hitCount) |
| + { |
| + let oldValue = this._hitCount; |
| + this._hitCount = value; |
| + FilterNotifier.triggerListeners("filter.hitCount", this, |
| + value, oldValue); |
| + } |
| + return this._hitCount; |
| } |
| - return this._hitCount; |
| }, |
| /** |
| * Last time the filter had a hit (in milliseconds since the beginning of the epoch) |
| * @type Number |
| */ |
| - get lastHit() |
| - { |
| - return this._lastHit; |
| - }, |
| - set lastHit(value) |
| - { |
| - if (value != this._lastHit) |
| + lastHit: { |
| + get: function() |
| + { |
| + return this._lastHit; |
| + }, |
| + set: function(value) |
| { |
| - let oldValue = this._lastHit; |
| - this._lastHit = value; |
| - FilterNotifier.triggerListeners("filter.lastHit", this, value, oldValue); |
| + if (value != this._lastHit) |
| + { |
| + let oldValue = this._lastHit; |
| + this._lastHit = value; |
| + FilterNotifier.triggerListeners("filter.lastHit", this, |
| + value, oldValue); |
| + } |
| + return this._lastHit; |
| } |
| - return this._lastHit; |
| }, |
| /** |
| @@ -362,69 +363,71 @@ ActiveFilter.prototype = |
| * Map containing domains that this filter should match on/not match on or null if the filter should match on all domains |
| * @type Object |
| */ |
| - get domains() |
| - { |
| - // Despite this property being cached, the getter is called |
| - // several times on Safari, due to WebKit bug 132872 |
| - let prop = Object.getOwnPropertyDescriptor(this, "domains"); |
| - if (prop) |
| - return prop.value; |
| + domains: { |
| + get: function() |
| + { |
| + // Despite this property being cached, the getter is called |
| + // several times on Safari, due to WebKit bug 132872 |
| + let prop = Object.getOwnPropertyDescriptor(this, "domains"); |
| + if (prop) |
| + return prop.value; |
| - let domains = null; |
| + let domains = null; |
| - if (this.domainSource) |
| - { |
| - let source = this.domainSource; |
| - if (!this.domainSourceIsUpperCase) { |
| - // RegExpFilter already have uppercase domains |
| - source = source.toUpperCase(); |
| - } |
| - let list = source.split(this.domainSeparator); |
| - if (list.length == 1 && list[0][0] != "~") |
| - { |
| - // Fast track for the common one-domain scenario |
| - domains = Object.create(null); |
| - domains[""] = false; |
| - if (this.ignoreTrailingDot) |
| - list[0] = list[0].replace(/\.+$/, ""); |
| - domains[list[0]] = true; |
| - } |
| - else |
| + if (this.domainSource) |
| { |
| - let hasIncludes = false; |
| - for (let i = 0; i < list.length; i++) |
| + let source = this.domainSource; |
| + if (!this.domainSourceIsUpperCase) { |
| + // RegExpFilter already have uppercase domains |
| + source = source.toUpperCase(); |
| + } |
| + let list = source.split(this.domainSeparator); |
| + if (list.length == 1 && list[0][0] != "~") |
| { |
| - let domain = list[i]; |
| + // Fast track for the common one-domain scenario |
| + domains = Object.create(null); |
| + domains[""] = false; |
| if (this.ignoreTrailingDot) |
| - domain = domain.replace(/\.+$/, ""); |
| - if (domain == "") |
| - continue; |
| - |
| - let include; |
| - if (domain[0] == "~") |
| - { |
| - include = false; |
| - domain = domain.substr(1); |
| - } |
| - else |
| + list[0] = list[0].replace(/\.+$/, ""); |
| + domains[list[0]] = true; |
| + } |
| + else |
| + { |
| + let hasIncludes = false; |
| + for (let i = 0; i < list.length; i++) |
| { |
| - include = true; |
| - hasIncludes = true; |
| + let domain = list[i]; |
| + if (this.ignoreTrailingDot) |
| + domain = domain.replace(/\.+$/, ""); |
| + if (domain == "") |
| + continue; |
| + |
| + let include; |
| + if (domain[0] == "~") |
| + { |
| + include = false; |
| + domain = domain.substr(1); |
| + } |
| + else |
| + { |
| + include = true; |
| + hasIncludes = true; |
| + } |
| + |
| + if (!domains) |
| + domains = Object.create(null); |
| + |
| + domains[domain] = include; |
| } |
| - |
| - if (!domains) |
| - domains = Object.create(null); |
| - |
| - domains[domain] = include; |
| + domains[""] = !hasIncludes; |
| } |
| - domains[""] = !hasIncludes; |
| + |
| + this.domainSource = null; |
| } |
| - this.domainSource = null; |
| + Object.defineProperty(this, "domains", {value: domains, enumerable: true}); |
| + return this.domains; |
| } |
| - |
| - Object.defineProperty(this, "domains", {value: domains, enumerable: true}); |
| - return this.domains; |
| }, |
| /** |
| @@ -515,7 +518,7 @@ ActiveFilter.prototype = |
| buffer.push("lastHit=" + this._lastHit); |
| } |
| } |
| -}; |
| +})); |
| /** |
| * Abstract base class for RegExp-based filters |
| @@ -556,10 +559,7 @@ function RegExpFilter(text, regexpSource, contentType, matchCase, domains, third |
| } |
| exports.RegExpFilter = RegExpFilter; |
| -RegExpFilter.prototype = |
| -{ |
| - __proto__: ActiveFilter.prototype, |
| - |
| +RegExpFilter.prototype = Object.create(ActiveFilter.prototype, desc({ |
| /** |
| * @see ActiveFilter.domainSourceIsUpperCase |
| */ |
| @@ -585,19 +585,22 @@ RegExpFilter.prototype = |
| * Regular expression to be used when testing against this filter |
| * @type RegExp |
| */ |
| - get regexp() |
| - { |
| - // Despite this property being cached, the getter is called |
| - // several times on Safari, due to WebKit bug 132872 |
| - let prop = Object.getOwnPropertyDescriptor(this, "regexp"); |
| - if (prop) |
| - return prop.value; |
| - |
| - let source = Filter.toRegExp(this.regexpSource); |
| - let regexp = new RegExp(source, this.matchCase ? "" : "i"); |
| - Object.defineProperty(this, "regexp", {value: regexp}); |
| - return regexp; |
| + regexp: { |
| + get: function() |
| + { |
| + // Despite this property being cached, the getter is called |
| + // several times on Safari, due to WebKit bug 132872 |
| + let prop = Object.getOwnPropertyDescriptor(this, "regexp"); |
| + if (prop) |
| + return prop.value; |
| + |
| + let source = Filter.toRegExp(this.regexpSource); |
| + let regexp = new RegExp(source, this.matchCase ? "" : "i"); |
| + Object.defineProperty(this, "regexp", {value: regexp}); |
| + return regexp; |
| + } |
| }, |
| + |
| /** |
| * Content types the filter applies to, combination of values from RegExpFilter.typeMap |
| * @type Number |
| @@ -624,24 +627,26 @@ RegExpFilter.prototype = |
| * Array containing public keys of websites that this filter should apply to |
| * @type string[] |
| */ |
| - get sitekeys() |
| - { |
| - // Despite this property being cached, the getter is called |
| - // several times on Safari, due to WebKit bug 132872 |
| - let prop = Object.getOwnPropertyDescriptor(this, "sitekeys"); |
| - if (prop) |
| - return prop.value; |
| + sitekeys: { |
| + get: function() |
| + { |
| + // Despite this property being cached, the getter is called |
| + // several times on Safari, due to WebKit bug 132872 |
| + let prop = Object.getOwnPropertyDescriptor(this, "sitekeys"); |
| + if (prop) |
| + return prop.value; |
| - let sitekeys = null; |
| + let sitekeys = null; |
| - if (this.sitekeySource) |
| - { |
| - sitekeys = this.sitekeySource.split("|"); |
| - this.sitekeySource = null; |
| - } |
| + if (this.sitekeySource) |
| + { |
| + sitekeys = this.sitekeySource.split("|"); |
| + this.sitekeySource = null; |
| + } |
| - Object.defineProperty(this, "sitekeys", {value: sitekeys, enumerable: true}); |
| - return this.sitekeys; |
| + Object.defineProperty(this, "sitekeys", {value: sitekeys, enumerable: true}); |
| + return this.sitekeys; |
| + } |
| }, |
| /** |
| @@ -663,14 +668,13 @@ RegExpFilter.prototype = |
| } |
| return false; |
| - } |
| -}; |
| + }, |
| -// Required to optimize Matcher, see also RegExpFilter.prototype.length |
| -Object.defineProperty(RegExpFilter.prototype, "0", |
| -{ |
| - get: function() { return this; } |
| -}); |
| + // Required to optimize Matcher, see also RegExpFilter.prototype.length |
| + 0: { |
| + get: function() { return this; } |
| + } |
| +})); |
| /** |
| * Creates a RegExp filter from its text representation |
| @@ -810,10 +814,7 @@ function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thi |
| } |
| exports.BlockingFilter = BlockingFilter; |
| -BlockingFilter.prototype = |
| -{ |
| - __proto__: RegExpFilter.prototype, |
| - |
| +BlockingFilter.prototype = Object.create(RegExpFilter.prototype, desc({ |
| type: "blocking", |
| /** |
| @@ -821,7 +822,7 @@ BlockingFilter.prototype = |
| * @type Boolean |
| */ |
| collapse: null |
| -}; |
| +})); |
| /** |
| * Class for whitelist filters |
| @@ -841,12 +842,9 @@ function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, th |
| } |
| exports.WhitelistFilter = WhitelistFilter; |
| -WhitelistFilter.prototype = |
| -{ |
| - __proto__: RegExpFilter.prototype, |
| - |
| +WhitelistFilter.prototype = Object.create(RegExpFilter.prototype, desc({ |
| type: "whitelist" |
| -}; |
| +})); |
| /** |
| * Base class for element hiding filters |
| @@ -866,10 +864,7 @@ function ElemHideBase(text, domains, selector) |
| } |
| exports.ElemHideBase = ElemHideBase; |
| -ElemHideBase.prototype = |
| -{ |
| - __proto__: ActiveFilter.prototype, |
| - |
| +ElemHideBase.prototype = Object.create(ActiveFilter.prototype, desc({ |
| /** |
| * @see ActiveFilter.domainSeparator |
| */ |
| @@ -890,7 +885,7 @@ ElemHideBase.prototype = |
| * @type String |
| */ |
| selector: null |
| -}; |
| +})); |
| /** |
| * Creates an element hiding filter from a pre-parsed text representation |
| @@ -975,12 +970,9 @@ function ElemHideFilter(text, domains, selector) |
| } |
| exports.ElemHideFilter = ElemHideFilter; |
| -ElemHideFilter.prototype = |
| -{ |
| - __proto__: ElemHideBase.prototype, |
| - |
| +ElemHideFilter.prototype = Object.create(ElemHideBase.prototype, desc({ |
| type: "elemhide" |
| -}; |
| +})); |
| /** |
| * Class for element hiding exceptions |
| @@ -996,12 +988,9 @@ function ElemHideException(text, domains, selector) |
| } |
| exports.ElemHideException = ElemHideException; |
| -ElemHideException.prototype = |
| -{ |
| - __proto__: ElemHideBase.prototype, |
| - |
| +ElemHideException.prototype = Object.create(ElemHideBase.prototype, desc({ |
| type: "elemhideexception" |
| -}; |
| +})); |
| /** |
| * Class for CSS property filters |
| @@ -1025,10 +1014,7 @@ function CSSPropertyFilter(text, domains, selector, regexpSource, |
| } |
| exports.CSSPropertyFilter = CSSPropertyFilter; |
| -CSSPropertyFilter.prototype = |
| -{ |
| - __proto__: ElemHideBase.prototype, |
| - |
| +CSSPropertyFilter.prototype = Object.create(ElemHideBase.prototype, desc({ |
| type: "cssproperty", |
| /** |
| @@ -1055,16 +1041,18 @@ CSSPropertyFilter.prototype = |
| * against this filter |
| * @type String |
| */ |
| - get regexpString() |
| - { |
| - // Despite this property being cached, the getter is called |
| - // several times on Safari, due to WebKit bug 132872 |
| - let prop = Object.getOwnPropertyDescriptor(this, "regexpString"); |
| - if (prop) |
| - return prop.value; |
| - |
| - let regexp = Filter.toRegExp(this.regexpSource); |
| - Object.defineProperty(this, "regexpString", {value: regexp}); |
| - return regexp; |
| + regexpString: { |
| + get: function() |
| + { |
| + // Despite this property being cached, the getter is called |
| + // several times on Safari, due to WebKit bug 132872 |
| + let prop = Object.getOwnPropertyDescriptor(this, "regexpString"); |
| + if (prop) |
| + return prop.value; |
| + |
| + let regexp = Filter.toRegExp(this.regexpSource); |
| + Object.defineProperty(this, "regexpString", {value: regexp}); |
| + return regexp; |
| + } |
| } |
| -}; |
| +})); |