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 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 domainSource: null, | 379 domainSource: null, |
380 | 380 |
381 /** | 381 /** |
382 * Separator character used in domainSource property, must be | 382 * Separator character used in domainSource property, must be |
383 * overridden by subclasses | 383 * overridden by subclasses |
384 * @type {string} | 384 * @type {string} |
385 */ | 385 */ |
386 domainSeparator: null, | 386 domainSeparator: null, |
387 | 387 |
388 /** | 388 /** |
389 * Determines whether the trailing dot in domain names isn't important and | |
390 * should be ignored, must be overridden by subclasses. | |
391 * @type {boolean} | |
392 */ | |
393 ignoreTrailingDot: true, | |
394 | |
395 /** | |
396 * Determines whether domainSource is already upper-case, | 389 * Determines whether domainSource is already upper-case, |
397 * can be overridden by subclasses. | 390 * can be overridden by subclasses. |
398 * @type {boolean} | 391 * @type {boolean} |
399 */ | 392 */ |
400 domainSourceIsUpperCase: false, | 393 domainSourceIsUpperCase: false, |
401 | 394 |
402 /** | 395 /** |
403 * Map containing domains that this filter should match on/not match | 396 * Map containing domains that this filter should match on/not match |
404 * on or null if the filter should match on all domains | 397 * on or null if the filter should match on all domains |
405 * @type {?Map.<string,boolean>} | 398 * @type {?Map.<string,boolean>} |
(...skipping 13 matching lines...) Expand all Loading... |
419 let source = this.domainSource; | 412 let source = this.domainSource; |
420 if (!this.domainSourceIsUpperCase) | 413 if (!this.domainSourceIsUpperCase) |
421 { | 414 { |
422 // RegExpFilter already have uppercase domains | 415 // RegExpFilter already have uppercase domains |
423 source = source.toUpperCase(); | 416 source = source.toUpperCase(); |
424 } | 417 } |
425 let list = source.split(this.domainSeparator); | 418 let list = source.split(this.domainSeparator); |
426 if (list.length == 1 && list[0][0] != "~") | 419 if (list.length == 1 && list[0][0] != "~") |
427 { | 420 { |
428 // Fast track for the common one-domain scenario | 421 // Fast track for the common one-domain scenario |
429 if (this.ignoreTrailingDot) | |
430 list[0] = list[0].replace(/\.+$/, ""); | |
431 domains = new Map([["", false], [list[0], true]]); | 422 domains = new Map([["", false], [list[0], true]]); |
432 } | 423 } |
433 else | 424 else |
434 { | 425 { |
435 let hasIncludes = false; | 426 let hasIncludes = false; |
436 for (let i = 0; i < list.length; i++) | 427 for (let i = 0; i < list.length; i++) |
437 { | 428 { |
438 let domain = list[i]; | 429 let domain = list[i]; |
439 if (this.ignoreTrailingDot) | |
440 domain = domain.replace(/\.+$/, ""); | |
441 if (domain == "") | 430 if (domain == "") |
442 continue; | 431 continue; |
443 | 432 |
444 let include; | 433 let include; |
445 if (domain[0] == "~") | 434 if (domain[0] == "~") |
446 { | 435 { |
447 include = false; | 436 include = false; |
448 domain = domain.substr(1); | 437 domain = domain.substr(1); |
449 } | 438 } |
450 else | 439 else |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
494 | 483 |
495 // If no domains are set the rule matches everywhere | 484 // If no domains are set the rule matches everywhere |
496 if (!this.domains) | 485 if (!this.domains) |
497 return true; | 486 return true; |
498 | 487 |
499 // If the document has no host name, match only if the filter | 488 // If the document has no host name, match only if the filter |
500 // isn't restricted to specific domains | 489 // isn't restricted to specific domains |
501 if (!docDomain) | 490 if (!docDomain) |
502 return this.domains.get(""); | 491 return this.domains.get(""); |
503 | 492 |
504 if (this.ignoreTrailingDot) | 493 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); |
505 docDomain = docDomain.replace(/\.+$/, ""); | |
506 docDomain = docDomain.toUpperCase(); | |
507 | 494 |
508 while (true) | 495 while (true) |
509 { | 496 { |
510 let isDomainIncluded = this.domains.get(docDomain); | 497 let isDomainIncluded = this.domains.get(docDomain); |
511 if (typeof isDomainIncluded != "undefined") | 498 if (typeof isDomainIncluded != "undefined") |
512 return isDomainIncluded; | 499 return isDomainIncluded; |
513 | 500 |
514 let nextDot = docDomain.indexOf("."); | 501 let nextDot = docDomain.indexOf("."); |
515 if (nextDot < 0) | 502 if (nextDot < 0) |
516 break; | 503 break; |
517 docDomain = docDomain.substr(nextDot + 1); | 504 docDomain = docDomain.substr(nextDot + 1); |
518 } | 505 } |
519 return this.domains.get(""); | 506 return this.domains.get(""); |
520 }, | 507 }, |
521 | 508 |
522 /** | 509 /** |
523 * Checks whether this filter is active only on a domain and its subdomains. | 510 * Checks whether this filter is active only on a domain and its subdomains. |
524 * @param {string} docDomain | 511 * @param {string} docDomain |
525 * @return {boolean} | 512 * @return {boolean} |
526 */ | 513 */ |
527 isActiveOnlyOnDomain(docDomain) | 514 isActiveOnlyOnDomain(docDomain) |
528 { | 515 { |
529 if (!docDomain || !this.domains || this.domains.get("")) | 516 if (!docDomain || !this.domains || this.domains.get("")) |
530 return false; | 517 return false; |
531 | 518 |
532 if (this.ignoreTrailingDot) | 519 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); |
533 docDomain = docDomain.replace(/\.+$/, ""); | |
534 docDomain = docDomain.toUpperCase(); | |
535 | 520 |
536 for (let [domain, isIncluded] of this.domains) | 521 for (let [domain, isIncluded] of this.domains) |
537 { | 522 { |
538 if (isIncluded && domain != docDomain) | 523 if (isIncluded && domain != docDomain) |
539 { | 524 { |
540 if (domain.length <= docDomain.length) | 525 if (domain.length <= docDomain.length) |
541 return false; | 526 return false; |
542 | 527 |
543 if (!domain.endsWith("." + docDomain)) | 528 if (!domain.endsWith("." + docDomain)) |
544 return false; | 529 return false; |
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1008 } | 993 } |
1009 exports.ElemHideBase = ElemHideBase; | 994 exports.ElemHideBase = ElemHideBase; |
1010 | 995 |
1011 ElemHideBase.prototype = extend(ActiveFilter, { | 996 ElemHideBase.prototype = extend(ActiveFilter, { |
1012 /** | 997 /** |
1013 * @see ActiveFilter.domainSeparator | 998 * @see ActiveFilter.domainSeparator |
1014 */ | 999 */ |
1015 domainSeparator: ",", | 1000 domainSeparator: ",", |
1016 | 1001 |
1017 /** | 1002 /** |
1018 * @see ActiveFilter.ignoreTrailingDot | |
1019 */ | |
1020 ignoreTrailingDot: false, | |
1021 | |
1022 /** | |
1023 * Host names or domains the filter should be restricted to (can be null for | 1003 * Host names or domains the filter should be restricted to (can be null for |
1024 * no restriction) | 1004 * no restriction) |
1025 * @type {?string} | 1005 * @type {?string} |
1026 */ | 1006 */ |
1027 selectorDomains: null, | 1007 selectorDomains: null, |
1028 /** | 1008 /** |
1029 * CSS selector for the HTML elements that should be hidden | 1009 * CSS selector for the HTML elements that should be hidden |
1030 * @type {string} | 1010 * @type {string} |
1031 */ | 1011 */ |
1032 selector: null | 1012 selector: null |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1114 */ | 1094 */ |
1115 function ElemHideEmulationFilter(text, domains, selector) | 1095 function ElemHideEmulationFilter(text, domains, selector) |
1116 { | 1096 { |
1117 ElemHideBase.call(this, text, domains, selector); | 1097 ElemHideBase.call(this, text, domains, selector); |
1118 } | 1098 } |
1119 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; | 1099 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; |
1120 | 1100 |
1121 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { | 1101 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { |
1122 type: "elemhideemulation" | 1102 type: "elemhideemulation" |
1123 }); | 1103 }); |
OLD | NEW |