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 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 domainSeparator: null, | 386 domainSeparator: null, |
387 | 387 |
388 /** | 388 /** |
389 * Determines whether domainSource is already upper-case, | 389 * Determines whether domainSource is already upper-case, |
390 * can be overridden by subclasses. | 390 * can be overridden by subclasses. |
391 * @type {boolean} | 391 * @type {boolean} |
392 */ | 392 */ |
393 domainSourceIsUpperCase: false, | 393 domainSourceIsUpperCase: false, |
394 | 394 |
395 /** | 395 /** |
396 * Map containing domains that this filter should match on/not match | 396 * String specifying the domain that this filter should match on, or map |
397 * on or null if the filter should match on all domains | 397 * containing domains that this filter should match on/not match on, or null |
398 * @type {?Map.<string,boolean>} | 398 * if the filter should match on all domains |
| 399 * @type {?Map.<string,boolean>|string} |
399 */ | 400 */ |
400 get domains() | 401 get domains() |
401 { | 402 { |
402 // Despite this property being cached, the getter is called | 403 // Despite this property being cached, the getter is called |
403 // several times on Safari, due to WebKit bug 132872 | 404 // several times on Safari, due to WebKit bug 132872 |
404 let prop = Object.getOwnPropertyDescriptor(this, "domains"); | 405 let prop = Object.getOwnPropertyDescriptor(this, "domains"); |
405 if (prop) | 406 if (prop) |
406 return prop.value; | 407 return prop.value; |
407 | 408 |
408 let domains = null; | 409 let domains = null; |
409 | 410 |
410 if (this.domainSource) | 411 if (this.domainSource) |
411 { | 412 { |
412 let source = this.domainSource; | 413 let source = this.domainSource; |
413 if (!this.domainSourceIsUpperCase) | 414 if (!this.domainSourceIsUpperCase) |
414 { | 415 { |
415 // RegExpFilter already have uppercase domains | 416 // RegExpFilter already have uppercase domains |
416 source = source.toUpperCase(); | 417 source = source.toUpperCase(); |
417 } | 418 } |
418 let list = source.split(this.domainSeparator); | 419 let list = source.split(this.domainSeparator); |
419 if (list.length == 1 && list[0][0] != "~") | 420 if (list.length == 1 && list[0][0] != "~") |
420 { | 421 { |
421 // Fast track for the common one-domain scenario | 422 // Fast track for the common one-domain scenario |
422 domains = new Map([["", false], [list[0], true]]); | 423 domains = list[0]; |
423 } | 424 } |
424 else | 425 else |
425 { | 426 { |
426 let hasIncludes = false; | 427 let hasIncludes = false; |
427 for (let i = 0; i < list.length; i++) | 428 for (let i = 0; i < list.length; i++) |
428 { | 429 { |
429 let domain = list[i]; | 430 let domain = list[i]; |
430 if (domain == "") | 431 if (domain == "") |
431 continue; | 432 continue; |
432 | 433 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
481 return false; | 482 return false; |
482 } | 483 } |
483 | 484 |
484 // If no domains are set the rule matches everywhere | 485 // If no domains are set the rule matches everywhere |
485 if (!this.domains) | 486 if (!this.domains) |
486 return true; | 487 return true; |
487 | 488 |
488 // If the document has no host name, match only if the filter | 489 // If the document has no host name, match only if the filter |
489 // isn't restricted to specific domains | 490 // isn't restricted to specific domains |
490 if (!docDomain) | 491 if (!docDomain) |
491 return this.domains.get(""); | 492 return typeof this.domains != "string" && this.domains.get(""); |
492 | 493 |
493 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); | 494 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); |
494 | 495 |
| 496 if (typeof this.domains == "string") |
| 497 { |
| 498 return docDomain == this.domains || |
| 499 docDomain.endsWith("." + this.domains); |
| 500 } |
| 501 |
495 while (true) | 502 while (true) |
496 { | 503 { |
497 let isDomainIncluded = this.domains.get(docDomain); | 504 let isDomainIncluded = this.domains.get(docDomain); |
498 if (typeof isDomainIncluded != "undefined") | 505 if (typeof isDomainIncluded != "undefined") |
499 return isDomainIncluded; | 506 return isDomainIncluded; |
500 | 507 |
501 let nextDot = docDomain.indexOf("."); | 508 let nextDot = docDomain.indexOf("."); |
502 if (nextDot < 0) | 509 if (nextDot < 0) |
503 break; | 510 break; |
504 docDomain = docDomain.substr(nextDot + 1); | 511 docDomain = docDomain.substr(nextDot + 1); |
505 } | 512 } |
506 return this.domains.get(""); | 513 return this.domains.get(""); |
507 }, | 514 }, |
508 | 515 |
509 /** | 516 /** |
510 * Checks whether this filter is active only on a domain and its subdomains. | 517 * Checks whether this filter is active only on a domain and its subdomains. |
511 * @param {string} docDomain | 518 * @param {string} docDomain |
512 * @return {boolean} | 519 * @return {boolean} |
513 */ | 520 */ |
514 isActiveOnlyOnDomain(docDomain) | 521 isActiveOnlyOnDomain(docDomain) |
515 { | 522 { |
516 if (!docDomain || !this.domains || this.domains.get("")) | 523 if (!docDomain || !this.domains || |
| 524 typeof this.domains != "string" && this.domains.get("")) |
| 525 { |
517 return false; | 526 return false; |
| 527 } |
518 | 528 |
519 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); | 529 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); |
520 | 530 |
| 531 if (typeof this.domains == "string") |
| 532 { |
| 533 return docDomain == this.domains || |
| 534 this.domains.endsWith("." + docDomain); |
| 535 } |
| 536 |
521 for (let [domain, isIncluded] of this.domains) | 537 for (let [domain, isIncluded] of this.domains) |
522 { | 538 { |
523 if (isIncluded && domain != docDomain) | 539 if (isIncluded && domain != docDomain) |
524 { | 540 { |
525 if (domain.length <= docDomain.length) | 541 if (domain.length <= docDomain.length) |
526 return false; | 542 return false; |
527 | 543 |
528 if (!domain.endsWith("." + docDomain)) | 544 if (!domain.endsWith("." + docDomain)) |
529 return false; | 545 return false; |
530 } | 546 } |
531 } | 547 } |
532 | 548 |
533 return true; | 549 return true; |
534 }, | 550 }, |
535 | 551 |
536 /** | 552 /** |
537 * Checks whether this filter is generic or specific | 553 * Checks whether this filter is generic or specific |
538 * @return {boolean} | 554 * @return {boolean} |
539 */ | 555 */ |
540 isGeneric() | 556 isGeneric() |
541 { | 557 { |
542 return !(this.sitekeys && this.sitekeys.length) && | 558 return !(this.sitekeys && this.sitekeys.length) && |
543 (!this.domains || this.domains.get("")); | 559 (!this.domains || |
| 560 typeof this.domains != "string" && this.domains.get("")); |
544 }, | 561 }, |
545 | 562 |
546 /** | 563 /** |
547 * See Filter.serialize() | 564 * See Filter.serialize() |
548 * @inheritdoc | 565 * @inheritdoc |
549 */ | 566 */ |
550 serialize(buffer) | 567 serialize(buffer) |
551 { | 568 { |
552 if (this._disabled || this._hitCount || this._lastHit) | 569 if (this._disabled || this._hitCount || this._lastHit) |
553 { | 570 { |
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1099 */ | 1116 */ |
1100 function ElemHideEmulationFilter(text, domains, selector) | 1117 function ElemHideEmulationFilter(text, domains, selector) |
1101 { | 1118 { |
1102 ElemHideBase.call(this, text, domains, selector); | 1119 ElemHideBase.call(this, text, domains, selector); |
1103 } | 1120 } |
1104 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; | 1121 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; |
1105 | 1122 |
1106 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { | 1123 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { |
1107 type: "elemhideemulation" | 1124 type: "elemhideemulation" |
1108 }); | 1125 }); |
OLD | NEW |