Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/filterClasses.js

Issue 29791555: Issue 6727 - Use string rather than map for single-domain filters (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Created May 26, 2018, 10:52 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
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 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 ignoreTrailingDot: true, 393 ignoreTrailingDot: true,
394 394
395 /** 395 /**
396 * Determines whether domainSource is already upper-case, 396 * Determines whether domainSource is already upper-case,
397 * can be overridden by subclasses. 397 * can be overridden by subclasses.
398 * @type {boolean} 398 * @type {boolean}
399 */ 399 */
400 domainSourceIsUpperCase: false, 400 domainSourceIsUpperCase: false,
401 401
402 /** 402 /**
403 * Map containing domains that this filter should match on/not match 403 * String specifying the domain that this filter should match on, or map
404 * on or null if the filter should match on all domains 404 * containing domains that this filter should match on/not match on, or null
405 * @type {?Map.<string,boolean>} 405 * if the filter should match on all domains
406 * @type {?Map.<string,boolean>|string}
406 */ 407 */
407 get domains() 408 get domains()
408 { 409 {
409 // Despite this property being cached, the getter is called 410 // Despite this property being cached, the getter is called
410 // several times on Safari, due to WebKit bug 132872 411 // several times on Safari, due to WebKit bug 132872
411 let prop = Object.getOwnPropertyDescriptor(this, "domains"); 412 let prop = Object.getOwnPropertyDescriptor(this, "domains");
412 if (prop) 413 if (prop)
413 return prop.value; 414 return prop.value;
414 415
415 let domains = null; 416 let domains = null;
416 417
417 if (this.domainSource) 418 if (this.domainSource)
418 { 419 {
419 let source = this.domainSource; 420 let source = this.domainSource;
420 if (!this.domainSourceIsUpperCase) 421 if (!this.domainSourceIsUpperCase)
421 { 422 {
422 // RegExpFilter already have uppercase domains 423 // RegExpFilter already have uppercase domains
423 source = source.toUpperCase(); 424 source = source.toUpperCase();
424 } 425 }
425 let list = source.split(this.domainSeparator); 426 let list = source.split(this.domainSeparator);
426 if (list.length == 1 && list[0][0] != "~") 427 if (list.length == 1 && list[0][0] != "~")
427 { 428 {
428 // Fast track for the common one-domain scenario 429 // Fast track for the common one-domain scenario
429 if (this.ignoreTrailingDot) 430 if (this.ignoreTrailingDot)
430 list[0] = list[0].replace(/\.+$/, ""); 431 list[0] = list[0].replace(/\.+$/, "");
431 domains = new Map([["", false], [list[0], true]]); 432 domains = list[0];
432 } 433 }
433 else 434 else
434 { 435 {
435 let hasIncludes = false; 436 let hasIncludes = false;
436 for (let i = 0; i < list.length; i++) 437 for (let i = 0; i < list.length; i++)
437 { 438 {
438 let domain = list[i]; 439 let domain = list[i];
439 if (this.ignoreTrailingDot) 440 if (this.ignoreTrailingDot)
440 domain = domain.replace(/\.+$/, ""); 441 domain = domain.replace(/\.+$/, "");
441 if (domain == "") 442 if (domain == "")
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 return false; 493 return false;
493 } 494 }
494 495
495 // If no domains are set the rule matches everywhere 496 // If no domains are set the rule matches everywhere
496 if (!this.domains) 497 if (!this.domains)
497 return true; 498 return true;
498 499
499 // If the document has no host name, match only if the filter 500 // If the document has no host name, match only if the filter
500 // isn't restricted to specific domains 501 // isn't restricted to specific domains
501 if (!docDomain) 502 if (!docDomain)
502 return this.domains.get(""); 503 return typeof this.domains != "string" && this.domains.get("");
503 504
504 if (this.ignoreTrailingDot) 505 if (this.ignoreTrailingDot)
505 docDomain = docDomain.replace(/\.+$/, ""); 506 docDomain = docDomain.replace(/\.+$/, "");
506 docDomain = docDomain.toUpperCase(); 507 docDomain = docDomain.toUpperCase();
507 508
509 if (typeof this.domains == "string")
510 {
511 return docDomain == this.domains ||
512 docDomain.endsWith("." + this.domains);
513 }
514
508 while (true) 515 while (true)
509 { 516 {
510 let isDomainIncluded = this.domains.get(docDomain); 517 let isDomainIncluded = this.domains.get(docDomain);
511 if (typeof isDomainIncluded != "undefined") 518 if (typeof isDomainIncluded != "undefined")
512 return isDomainIncluded; 519 return isDomainIncluded;
513 520
514 let nextDot = docDomain.indexOf("."); 521 let nextDot = docDomain.indexOf(".");
515 if (nextDot < 0) 522 if (nextDot < 0)
516 break; 523 break;
517 docDomain = docDomain.substr(nextDot + 1); 524 docDomain = docDomain.substr(nextDot + 1);
518 } 525 }
519 return this.domains.get(""); 526 return this.domains.get("");
520 }, 527 },
521 528
522 /** 529 /**
523 * Checks whether this filter is active only on a domain and its subdomains. 530 * Checks whether this filter is active only on a domain and its subdomains.
524 * @param {string} docDomain 531 * @param {string} docDomain
525 * @return {boolean} 532 * @return {boolean}
526 */ 533 */
527 isActiveOnlyOnDomain(docDomain) 534 isActiveOnlyOnDomain(docDomain)
528 { 535 {
529 if (!docDomain || !this.domains || this.domains.get("")) 536 if (!docDomain || !this.domains ||
537 typeof this.domains != "string" && this.domains.get(""))
sergei 2018/05/28 09:22:07 IMO, perhaps it would be safer to rather check tha
kzar 2018/06/05 16:51:30 Disagree on this one, people that don't understand
Manish Jethani 2018/06/06 11:16:31 This is one of those things that can lead to an en
Manish Jethani 2018/06/06 12:31:18 typeof is typically faster than instanceof, so whe
538 {
530 return false; 539 return false;
540 }
531 541
532 if (this.ignoreTrailingDot) 542 if (this.ignoreTrailingDot)
533 docDomain = docDomain.replace(/\.+$/, ""); 543 docDomain = docDomain.replace(/\.+$/, "");
534 docDomain = docDomain.toUpperCase(); 544 docDomain = docDomain.toUpperCase();
535 545
546 if (typeof this.domains == "string")
547 {
548 return docDomain == this.domains ||
549 this.domains.endsWith("." + docDomain);
550 }
551
536 for (let [domain, isIncluded] of this.domains) 552 for (let [domain, isIncluded] of this.domains)
537 { 553 {
538 if (isIncluded && domain != docDomain) 554 if (isIncluded && domain != docDomain)
539 { 555 {
540 if (domain.length <= docDomain.length) 556 if (domain.length <= docDomain.length)
541 return false; 557 return false;
542 558
543 if (!domain.endsWith("." + docDomain)) 559 if (!domain.endsWith("." + docDomain))
544 return false; 560 return false;
545 } 561 }
546 } 562 }
547 563
548 return true; 564 return true;
549 }, 565 },
550 566
551 /** 567 /**
552 * Checks whether this filter is generic or specific 568 * Checks whether this filter is generic or specific
553 * @return {boolean} 569 * @return {boolean}
554 */ 570 */
555 isGeneric() 571 isGeneric()
556 { 572 {
557 return !(this.sitekeys && this.sitekeys.length) && 573 return !(this.sitekeys && this.sitekeys.length) &&
558 (!this.domains || this.domains.get("")); 574 (!this.domains ||
575 typeof this.domains != "string" && this.domains.get(""));
559 }, 576 },
560 577
561 /** 578 /**
562 * See Filter.serialize() 579 * See Filter.serialize()
563 * @inheritdoc 580 * @inheritdoc
564 */ 581 */
565 serialize(buffer) 582 serialize(buffer)
566 { 583 {
567 if (this._disabled || this._hitCount || this._lastHit) 584 if (this._disabled || this._hitCount || this._lastHit)
568 { 585 {
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
1114 */ 1131 */
1115 function ElemHideEmulationFilter(text, domains, selector) 1132 function ElemHideEmulationFilter(text, domains, selector)
1116 { 1133 {
1117 ElemHideBase.call(this, text, domains, selector); 1134 ElemHideBase.call(this, text, domains, selector);
1118 } 1135 }
1119 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; 1136 exports.ElemHideEmulationFilter = ElemHideEmulationFilter;
1120 1137
1121 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { 1138 ElemHideEmulationFilter.prototype = extend(ElemHideBase, {
1122 type: "elemhideemulation" 1139 type: "elemhideemulation"
1123 }); 1140 });
OLDNEW
« lib/elemHide.js ('K') | « lib/elemHide.js ('k') | test/filterClasses.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld