LEFT | RIGHT |
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 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
453 */ | 453 */ |
454 get domains() | 454 get domains() |
455 { | 455 { |
456 let domains = null; | 456 let domains = null; |
457 | 457 |
458 if (this.domainSource) | 458 if (this.domainSource) |
459 { | 459 { |
460 // For some filter types this property is accessed only rarely, | 460 // For some filter types this property is accessed only rarely, |
461 // especially when the subscriptions are initially loaded. We defer any | 461 // especially when the subscriptions are initially loaded. We defer any |
462 // caching for such filters. | 462 // caching for such filters. |
463 let cacheValue = this.shouldCacheDomains(); | 463 let {cacheDomains} = this; |
464 | 464 |
465 let source = this.domainSource.toLowerCase(); | 465 let source = this.domainSource.toLowerCase(); |
466 | 466 |
467 let knownMap = knownDomainMaps.get(source); | 467 let knownMap = knownDomainMaps.get(source); |
468 if (knownMap) | 468 if (knownMap) |
469 { | 469 { |
470 domains = knownMap; | 470 domains = knownMap; |
471 } | 471 } |
472 else | 472 else |
473 { | 473 { |
(...skipping 27 matching lines...) Expand all Loading... |
501 if (!domains) | 501 if (!domains) |
502 domains = new Map(); | 502 domains = new Map(); |
503 | 503 |
504 domains.set(domain, include); | 504 domains.set(domain, include); |
505 } | 505 } |
506 | 506 |
507 if (domains) | 507 if (domains) |
508 domains.set("", !hasIncludes); | 508 domains.set("", !hasIncludes); |
509 } | 509 } |
510 | 510 |
511 if (!domains || cacheValue) | 511 if (!domains || cacheDomains) |
512 knownDomainMaps.set(source, domains); | 512 knownDomainMaps.set(source, domains); |
513 } | 513 } |
514 | 514 |
515 if (!domains || cacheValue) | 515 if (!domains || cacheDomains) |
516 { | 516 { |
517 this.domainSource = null; | 517 this.domainSource = null; |
518 Object.defineProperty(this, "domains", {value: domains}); | 518 Object.defineProperty(this, "domains", {value: domains}); |
519 } | 519 } |
520 } | 520 } |
521 | 521 |
522 return domains; | 522 return domains; |
523 }, | 523 }, |
524 | 524 |
525 /** | 525 /** |
526 * Whether the value of {@link ActiveFilter#domains} should be cached. This | 526 * Whether the value of {@link ActiveFilter#domains} should be cached. |
527 * is meant to be overridden by subclasses that don't want the value to be | 527 * Defaults to <code>true</code>, but may be overridden by subclasses that |
528 * cached (for better memory usage). | 528 * don't want the value to be cached (for better memory usage). |
529 * @return {boolean} Always <code>true</code>, but may be overriden by | 529 * @type {boolean} |
530 * subclasses. | |
531 * @protected | 530 * @protected |
532 */ | 531 */ |
533 shouldCacheDomains() | 532 cacheDomains: true, |
534 { | |
535 return true; | |
536 }, | |
537 | 533 |
538 /** | 534 /** |
539 * Array containing public keys of websites that this filter should apply to | 535 * Array containing public keys of websites that this filter should apply to |
540 * @type {?string[]} | 536 * @type {?string[]} |
541 */ | 537 */ |
542 sitekeys: null, | 538 sitekeys: null, |
543 | 539 |
544 /** | 540 /** |
545 * Checks whether this filter is active on a domain. | 541 * Checks whether this filter is active on a domain. |
546 * @param {string} [docDomain] domain name of the document that loads the URL | 542 * @param {string} [docDomain] domain name of the document that loads the URL |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
856 if (contentType == null) | 852 if (contentType == null) |
857 ({contentType} = RegExpFilter.prototype); | 853 ({contentType} = RegExpFilter.prototype); |
858 contentType &= ~type; | 854 contentType &= ~type; |
859 } | 855 } |
860 else | 856 else |
861 { | 857 { |
862 contentType |= type; | 858 contentType |= type; |
863 | 859 |
864 if (type == RegExpFilter.typeMap.CSP) | 860 if (type == RegExpFilter.typeMap.CSP) |
865 { | 861 { |
866 if (!value) | 862 if (blocking && !value) |
867 return new InvalidFilter(origText, "filter_invalid_csp"); | 863 return new InvalidFilter(origText, "filter_invalid_csp"); |
868 csp = value; | 864 csp = value; |
869 } | 865 } |
870 } | 866 } |
871 } | 867 } |
872 else | 868 else |
873 { | 869 { |
874 switch (option.toLowerCase()) | 870 switch (option.toLowerCase()) |
875 { | 871 { |
876 case "match-case": | 872 case "match-case": |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 * @augments ContentFilter | 1164 * @augments ContentFilter |
1169 */ | 1165 */ |
1170 function ElemHideBase(text, domains, selector) | 1166 function ElemHideBase(text, domains, selector) |
1171 { | 1167 { |
1172 ContentFilter.call(this, text, domains, selector); | 1168 ContentFilter.call(this, text, domains, selector); |
1173 } | 1169 } |
1174 exports.ElemHideBase = ElemHideBase; | 1170 exports.ElemHideBase = ElemHideBase; |
1175 | 1171 |
1176 ElemHideBase.prototype = extend(ContentFilter, { | 1172 ElemHideBase.prototype = extend(ContentFilter, { |
1177 /** | 1173 /** |
1178 * Whether {@link ActiveFilter#domains} has been accessed at least once. | 1174 * @see ActiveFilter#domains |
1179 * @type {boolean} | 1175 * @type {?Map.<string,boolean>} |
1180 * @private | |
1181 */ | |
1182 _domainsAccessed: false, | |
1183 | |
1184 /** | |
1185 * See ActiveFilter.domains | |
1186 * @inheritdoc | |
1187 */ | 1176 */ |
1188 get domains() | 1177 get domains() |
1189 { | 1178 { |
1190 let {get} = Object.getOwnPropertyDescriptor(ActiveFilter.prototype, | 1179 let {get} = Object.getOwnPropertyDescriptor(ActiveFilter.prototype, |
1191 "domains"); | 1180 "domains"); |
1192 let value = get.call(this); | 1181 let value = get.call(this); |
1193 this._domainsAccessed = true; | 1182 this.cacheDomains = true; |
1194 return value; | 1183 return value; |
1195 }, | 1184 }, |
1196 | 1185 |
1197 /** | 1186 /** |
1198 * See ActiveFilter.shouldCacheDomains() | 1187 * Initially <code>false</code>, but set to <code>true</code> after |
1199 * @inheritdoc | 1188 * {@link ActiveFilter#domains} has been accessed once. |
1200 */ | 1189 * @see ActiveFilter#cacheDomains |
1201 shouldCacheDomains() | 1190 * @type {boolean} |
1202 { | 1191 * @protected |
1203 return this._domainsAccessed; | 1192 */ |
1204 }, | 1193 cacheDomains: false, |
1205 | 1194 |
1206 /** | 1195 /** |
1207 * CSS selector for the HTML elements that should be hidden | 1196 * CSS selector for the HTML elements that should be hidden |
1208 * @type {string} | 1197 * @type {string} |
1209 */ | 1198 */ |
1210 get selector() | 1199 get selector() |
1211 { | 1200 { |
1212 // Braces are being escaped to prevent CSS rule injection. | 1201 // Braces are being escaped to prevent CSS rule injection. |
1213 return this.body.replace("{", "\\7B ").replace("}", "\\7D "); | 1202 return this.body.replace("{", "\\7B ").replace("}", "\\7D "); |
1214 } | 1203 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1287 | 1276 |
1288 /** | 1277 /** |
1289 * Script that should be executed | 1278 * Script that should be executed |
1290 * @type {string} | 1279 * @type {string} |
1291 */ | 1280 */ |
1292 get script() | 1281 get script() |
1293 { | 1282 { |
1294 return this.body; | 1283 return this.body; |
1295 } | 1284 } |
1296 }); | 1285 }); |
LEFT | RIGHT |