| 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 |