Left: | ||
Right: |
OLD | NEW |
---|---|
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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
74 /** | 74 /** |
75 * Filter type as a string, e.g. "blocking". | 75 * Filter type as a string, e.g. "blocking". |
76 * @type {string} | 76 * @type {string} |
77 */ | 77 */ |
78 get type() | 78 get type() |
79 { | 79 { |
80 throw new Error("Please define filter type in the subclass"); | 80 throw new Error("Please define filter type in the subclass"); |
81 }, | 81 }, |
82 | 82 |
83 /** | 83 /** |
84 * Whether this object is discarded after use. If <code>false</code>, the | |
85 * object is retained in memory once created and every call to | |
86 * {@link Filter#fromText} returns the same instance. Defaults to | |
87 * <code>false</code>. | |
88 * @type {boolean} | |
89 * @package | |
90 */ | |
91 ephemeral: false, | |
92 | |
93 /** | |
84 * Subscriptions to which this filter belongs. | 94 * Subscriptions to which this filter belongs. |
85 * @type {?(Subscription|Set.<Subscription>)} | 95 * @type {?(Subscription|Set.<Subscription>)} |
86 * @private | 96 * @private |
87 */ | 97 */ |
88 _subscriptions: null, | 98 _subscriptions: null, |
89 | 99 |
90 /** | 100 /** |
91 * Whether the filter's subscriptions have already been added to the filter. | 101 * Whether the filter's subscriptions have already been added to the filter. |
92 * @type {boolean} | 102 * @type {boolean} |
93 * @package | 103 * @package |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
177 this._subscriptions = [...this._subscriptions][0]; | 187 this._subscriptions = [...this._subscriptions][0]; |
178 } | 188 } |
179 else if (subscription == this._subscriptions) | 189 else if (subscription == this._subscriptions) |
180 { | 190 { |
181 this._subscriptions = null; | 191 this._subscriptions = null; |
182 } | 192 } |
183 } | 193 } |
184 }, | 194 }, |
185 | 195 |
186 /** | 196 /** |
197 * Checks whether the filter should be serialized. | |
198 * @return {boolean} | |
199 * @protected | |
200 */ | |
201 shouldSerialize() | |
202 { | |
203 return false; | |
204 }, | |
205 | |
206 /** | |
187 * Serializes the filter for writing out on disk. | 207 * Serializes the filter for writing out on disk. |
188 * @yields {string} | 208 * @yields {string} |
189 */ | 209 */ |
190 *serialize() | 210 *serialize() |
191 { | 211 { |
192 let {text} = this; | 212 let {text} = this; |
193 | 213 |
194 yield "[Filter]"; | 214 yield "[Filter]"; |
195 yield "text=" + text; | 215 yield "text=" + text; |
196 }, | 216 }, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
242 } | 262 } |
243 else | 263 else |
244 { | 264 { |
245 let match = text.includes("#") ? Filter.contentRegExp.exec(text) : null; | 265 let match = text.includes("#") ? Filter.contentRegExp.exec(text) : null; |
246 if (match) | 266 if (match) |
247 filter = ContentFilter.fromText(text, match[1], match[2], match[3]); | 267 filter = ContentFilter.fromText(text, match[1], match[2], match[3]); |
248 else | 268 else |
249 filter = RegExpFilter.fromText(text); | 269 filter = RegExpFilter.fromText(text); |
250 } | 270 } |
251 | 271 |
252 Filter.knownFilters.set(filter.text, filter); | 272 if (!filter.ephemeral) |
273 Filter.knownFilters.set(filter.text, filter); | |
274 | |
253 return filter; | 275 return filter; |
254 }; | 276 }; |
255 | 277 |
256 /** | 278 /** |
257 * Deserializes a filter | 279 * Deserializes a filter |
258 * | 280 * |
259 * @param {Object} obj map of serialized properties and their values | 281 * @param {Object} obj map of serialized properties and their values |
260 * @return {Filter} filter or null if the filter couldn't be created | 282 * @return {Filter} filter or null if the filter couldn't be created |
261 */ | 283 */ |
262 Filter.fromObject = function(obj) | 284 Filter.fromObject = function(obj) |
263 { | 285 { |
264 let filter = Filter.fromText(obj.text); | 286 let filter = Filter.fromText(obj.text); |
265 if (filter instanceof ActiveFilter) | 287 if (filter instanceof ActiveFilter) |
266 { | 288 { |
267 if ("disabled" in obj) | 289 if ("disabled" in obj) |
268 filter._disabled = (obj.disabled == "true"); | 290 filter._disabled = (obj.disabled == "true"); |
269 if ("hitCount" in obj) | 291 if ("hitCount" in obj) |
270 filter._hitCount = parseInt(obj.hitCount, 10) || 0; | 292 filter._hitCount = parseInt(obj.hitCount, 10) || 0; |
271 if ("lastHit" in obj) | 293 if ("lastHit" in obj) |
272 filter._lastHit = parseInt(obj.lastHit, 10) || 0; | 294 filter._lastHit = parseInt(obj.lastHit, 10) || 0; |
295 | |
296 // If the filter object is ephemeral, we normally don't keep it, but if it | |
297 // has any state then we must. | |
298 if (filter.ephemeral && this.shouldSerialize()) | |
299 Filter.knownFilters.set(filter.text, filter); | |
273 } | 300 } |
274 return filter; | 301 return filter; |
275 }; | 302 }; |
276 | 303 |
277 /** | 304 /** |
278 * Removes unnecessary whitespaces from filter text, will only return null if | 305 * Removes unnecessary whitespaces from filter text, will only return null if |
279 * the input parameter is null. | 306 * the input parameter is null. |
280 * @param {string} text | 307 * @param {string} text |
281 * @return {string} | 308 * @return {string} |
282 */ | 309 */ |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
425 get disabled() | 452 get disabled() |
426 { | 453 { |
427 return this._disabled; | 454 return this._disabled; |
428 }, | 455 }, |
429 set disabled(value) | 456 set disabled(value) |
430 { | 457 { |
431 if (value != this._disabled) | 458 if (value != this._disabled) |
432 { | 459 { |
433 let oldValue = this._disabled; | 460 let oldValue = this._disabled; |
434 this._disabled = value; | 461 this._disabled = value; |
462 | |
463 if (value && this.ephemeral) | |
Manish Jethani
2018/11/18 03:29:12
This could be optimized a little bit, but this pro
Manish Jethani
2018/11/18 06:19:14
Ignore, now removed.
| |
464 Filter.knownFilters.set(this.text, this); | |
465 | |
435 filterNotifier.emit("filter.disabled", this, value, oldValue); | 466 filterNotifier.emit("filter.disabled", this, value, oldValue); |
436 } | 467 } |
437 return this._disabled; | 468 return this._disabled; |
438 }, | 469 }, |
439 | 470 |
440 /** | 471 /** |
441 * Number of hits on the filter since the last reset | 472 * Number of hits on the filter since the last reset |
442 * @type {number} | 473 * @type {number} |
443 */ | 474 */ |
444 get hitCount() | 475 get hitCount() |
445 { | 476 { |
446 return this._hitCount; | 477 return this._hitCount; |
447 }, | 478 }, |
448 set hitCount(value) | 479 set hitCount(value) |
449 { | 480 { |
450 if (value != this._hitCount) | 481 if (value != this._hitCount) |
451 { | 482 { |
452 let oldValue = this._hitCount; | 483 let oldValue = this._hitCount; |
453 this._hitCount = value; | 484 this._hitCount = value; |
485 | |
486 if (value && this.ephemeral) | |
487 Filter.knownFilters.set(this.text, this); | |
488 | |
454 filterNotifier.emit("filter.hitCount", this, value, oldValue); | 489 filterNotifier.emit("filter.hitCount", this, value, oldValue); |
455 } | 490 } |
456 return this._hitCount; | 491 return this._hitCount; |
457 }, | 492 }, |
458 | 493 |
459 /** | 494 /** |
460 * Last time the filter had a hit (in milliseconds since the beginning of the | 495 * Last time the filter had a hit (in milliseconds since the beginning of the |
461 * epoch) | 496 * epoch) |
462 * @type {number} | 497 * @type {number} |
463 */ | 498 */ |
464 get lastHit() | 499 get lastHit() |
465 { | 500 { |
466 return this._lastHit; | 501 return this._lastHit; |
467 }, | 502 }, |
468 set lastHit(value) | 503 set lastHit(value) |
469 { | 504 { |
470 if (value != this._lastHit) | 505 if (value != this._lastHit) |
471 { | 506 { |
472 let oldValue = this._lastHit; | 507 let oldValue = this._lastHit; |
473 this._lastHit = value; | 508 this._lastHit = value; |
509 | |
510 if (value && this.ephemeral) | |
511 Filter.knownFilters.set(this.text, this); | |
512 | |
474 filterNotifier.emit("filter.lastHit", this, value, oldValue); | 513 filterNotifier.emit("filter.lastHit", this, value, oldValue); |
475 } | 514 } |
476 return this._lastHit; | 515 return this._lastHit; |
477 }, | 516 }, |
478 | 517 |
479 /** | 518 /** |
480 * String that the domains property should be generated from | 519 * String that the domains property should be generated from |
481 * @type {?string} | 520 * @type {?string} |
482 */ | 521 */ |
483 domainSource: null, | 522 domainSource: null, |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
664 * @return {boolean} | 703 * @return {boolean} |
665 */ | 704 */ |
666 isGeneric() | 705 isGeneric() |
667 { | 706 { |
668 let {sitekeys, domains} = this; | 707 let {sitekeys, domains} = this; |
669 | 708 |
670 return !(sitekeys && sitekeys.length) && (!domains || domains.get("")); | 709 return !(sitekeys && sitekeys.length) && (!domains || domains.get("")); |
671 }, | 710 }, |
672 | 711 |
673 /** | 712 /** |
713 * See Filter.shouldSerialize() | |
714 * @inheritdoc | |
715 */ | |
716 shouldSerialize() | |
Manish Jethani
2018/11/18 03:29:12
Note that this will always return false in the cur
Manish Jethani
2018/11/18 06:19:14
Ignore, now removed.
An object created with Filte
| |
717 { | |
718 return this._disabled || this._hitCount || this._lastHit; | |
719 }, | |
720 | |
721 /** | |
674 * See Filter.serialize() | 722 * See Filter.serialize() |
675 * @inheritdoc | 723 * @inheritdoc |
676 */ | 724 */ |
677 *serialize() | 725 *serialize() |
678 { | 726 { |
679 let {_disabled, _hitCount, _lastHit} = this; | 727 if (this.shouldSerialize()) |
680 | |
681 if (_disabled || _hitCount || _lastHit) | |
682 { | 728 { |
729 let {_disabled, _hitCount, _lastHit} = this; | |
683 yield* Filter.prototype.serialize.call(this); | 730 yield* Filter.prototype.serialize.call(this); |
684 if (_disabled) | 731 if (_disabled) |
685 yield "disabled=true"; | 732 yield "disabled=true"; |
686 if (_hitCount) | 733 if (_hitCount) |
687 yield "hitCount=" + _hitCount; | 734 yield "hitCount=" + _hitCount; |
688 if (_lastHit) | 735 if (_lastHit) |
689 yield "lastHit=" + _lastHit; | 736 yield "lastHit=" + _lastHit; |
690 } | 737 } |
691 } | 738 } |
692 }); | 739 }); |
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1309 * @constructor | 1356 * @constructor |
1310 * @augments ElemHideBase | 1357 * @augments ElemHideBase |
1311 */ | 1358 */ |
1312 function ElemHideFilter(text, domains, selector) | 1359 function ElemHideFilter(text, domains, selector) |
1313 { | 1360 { |
1314 ElemHideBase.call(this, text, domains, selector); | 1361 ElemHideBase.call(this, text, domains, selector); |
1315 } | 1362 } |
1316 exports.ElemHideFilter = ElemHideFilter; | 1363 exports.ElemHideFilter = ElemHideFilter; |
1317 | 1364 |
1318 ElemHideFilter.prototype = extend(ElemHideBase, { | 1365 ElemHideFilter.prototype = extend(ElemHideBase, { |
1319 type: "elemhide" | 1366 type: "elemhide", |
1367 | |
1368 /** | |
1369 * See Filter.ephemeral | |
1370 * @inheritdoc | |
1371 */ | |
1372 ephemeral: true | |
1320 }); | 1373 }); |
1321 | 1374 |
1322 /** | 1375 /** |
1323 * Class for element hiding exceptions | 1376 * Class for element hiding exceptions |
1324 * @param {string} text see {@link Filter Filter()} | 1377 * @param {string} text see {@link Filter Filter()} |
1325 * @param {string} [domains] see {@link ElemHideBase ElemHideBase()} | 1378 * @param {string} [domains] see {@link ElemHideBase ElemHideBase()} |
1326 * @param {string} selector see {@link ElemHideBase ElemHideBase()} | 1379 * @param {string} selector see {@link ElemHideBase ElemHideBase()} |
1327 * @constructor | 1380 * @constructor |
1328 * @augments ElemHideBase | 1381 * @augments ElemHideBase |
1329 */ | 1382 */ |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1374 | 1427 |
1375 /** | 1428 /** |
1376 * Script that should be executed | 1429 * Script that should be executed |
1377 * @type {string} | 1430 * @type {string} |
1378 */ | 1431 */ |
1379 get script() | 1432 get script() |
1380 { | 1433 { |
1381 return this.body; | 1434 return this.body; |
1382 } | 1435 } |
1383 }); | 1436 }); |
OLD | NEW |