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

Delta Between Two Patch Sets: lib/filterClasses.js

Issue 29791555: Issue 6727 - Use string rather than map for single-domain filters (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Left Patch Set: Rebase Created June 6, 2018, 11:39 a.m.
Right Patch Set: Use temporary Map objects Created June 6, 2018, 12:13 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « no previous file | no next file » | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
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
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 * String specifying the domain that this filter should match on, or map 396 * Map containing domains that this filter should match on/not match
397 * containing domains that this filter should match on/not match on, or null 397 * on or null if the filter should match on all domains
398 * if the filter should match on all domains 398 * @type {?Map.<string,boolean>}
399 * @type {?Map.<string,boolean>|string}
400 */ 399 */
401 get domains() 400 get domains()
402 { 401 {
403 // Despite this property being cached, the getter is called 402 // Despite this property being cached, the getter is called
404 // several times on Safari, due to WebKit bug 132872 403 // several times on Safari, due to WebKit bug 132872
405 let prop = Object.getOwnPropertyDescriptor(this, "domains"); 404 let prop = Object.getOwnPropertyDescriptor(this, "_domains");
406 if (prop) 405 if (prop)
407 return prop.value; 406 {
407 let {value} = prop;
408 return typeof value == "string" ?
409 new Map([[value, true], ["", false]]) : value;
410 }
408 411
409 let domains = null; 412 let domains = null;
410 413
411 if (this.domainSource) 414 if (this.domainSource)
412 { 415 {
413 let source = this.domainSource; 416 let source = this.domainSource;
414 if (!this.domainSourceIsUpperCase) 417 if (!this.domainSourceIsUpperCase)
415 { 418 {
416 // RegExpFilter already have uppercase domains 419 // RegExpFilter already have uppercase domains
417 source = source.toUpperCase(); 420 source = source.toUpperCase();
(...skipping 30 matching lines...) Expand all
448 451
449 domains.set(domain, include); 452 domains.set(domain, include);
450 } 453 }
451 if (domains) 454 if (domains)
452 domains.set("", !hasIncludes); 455 domains.set("", !hasIncludes);
453 } 456 }
454 457
455 this.domainSource = null; 458 this.domainSource = null;
456 } 459 }
457 460
458 Object.defineProperty(this, "domains", {value: domains, enumerable: true}); 461 Object.defineProperty(this, "_domains", {value: domains});
459 return this.domains; 462 return this.domains;
460 }, 463 },
461 464
462 /** 465 /**
463 * Array containing public keys of websites that this filter should apply to 466 * Array containing public keys of websites that this filter should apply to
464 * @type {?string[]} 467 * @type {?string[]}
465 */ 468 */
466 sitekeys: null, 469 sitekeys: null,
467 470
468 /** 471 /**
(...skipping 13 matching lines...) Expand all
482 return false; 485 return false;
483 } 486 }
484 487
485 // If no domains are set the rule matches everywhere 488 // If no domains are set the rule matches everywhere
486 if (!this.domains) 489 if (!this.domains)
487 return true; 490 return true;
488 491
489 // If the document has no host name, match only if the filter 492 // If the document has no host name, match only if the filter
490 // isn't restricted to specific domains 493 // isn't restricted to specific domains
491 if (!docDomain) 494 if (!docDomain)
492 return typeof this.domains != "string" && this.domains.get(""); 495 return this.domains.get("");
493 496
494 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); 497 docDomain = docDomain.replace(/\.+$/, "").toUpperCase();
495
496 if (typeof this.domains == "string")
497 {
498 return docDomain == this.domains ||
499 docDomain.endsWith("." + this.domains);
500 }
501 498
502 while (true) 499 while (true)
503 { 500 {
504 let isDomainIncluded = this.domains.get(docDomain); 501 let isDomainIncluded = this.domains.get(docDomain);
505 if (typeof isDomainIncluded != "undefined") 502 if (typeof isDomainIncluded != "undefined")
506 return isDomainIncluded; 503 return isDomainIncluded;
507 504
508 let nextDot = docDomain.indexOf("."); 505 let nextDot = docDomain.indexOf(".");
509 if (nextDot < 0) 506 if (nextDot < 0)
510 break; 507 break;
511 docDomain = docDomain.substr(nextDot + 1); 508 docDomain = docDomain.substr(nextDot + 1);
512 } 509 }
513 return this.domains.get(""); 510 return this.domains.get("");
514 }, 511 },
515 512
516 /** 513 /**
517 * Checks whether this filter is active only on a domain and its subdomains. 514 * Checks whether this filter is active only on a domain and its subdomains.
518 * @param {string} docDomain 515 * @param {string} docDomain
519 * @return {boolean} 516 * @return {boolean}
520 */ 517 */
521 isActiveOnlyOnDomain(docDomain) 518 isActiveOnlyOnDomain(docDomain)
522 { 519 {
523 if (!docDomain || !this.domains || 520 if (!docDomain || !this.domains || this.domains.get(""))
524 typeof this.domains != "string" && this.domains.get(""))
525 {
526 return false; 521 return false;
527 }
528 522
529 docDomain = docDomain.replace(/\.+$/, "").toUpperCase(); 523 docDomain = docDomain.replace(/\.+$/, "").toUpperCase();
530
531 if (typeof this.domains == "string")
532 {
533 return docDomain == this.domains ||
534 this.domains.endsWith("." + docDomain);
535 }
536 524
537 for (let [domain, isIncluded] of this.domains) 525 for (let [domain, isIncluded] of this.domains)
538 { 526 {
539 if (isIncluded && domain != docDomain) 527 if (isIncluded && domain != docDomain)
540 { 528 {
541 if (domain.length <= docDomain.length) 529 if (domain.length <= docDomain.length)
542 return false; 530 return false;
543 531
544 if (!domain.endsWith("." + docDomain)) 532 if (!domain.endsWith("." + docDomain))
545 return false; 533 return false;
546 } 534 }
547 } 535 }
548 536
549 return true; 537 return true;
550 }, 538 },
551 539
552 /** 540 /**
553 * Checks whether this filter is generic or specific 541 * Checks whether this filter is generic or specific
554 * @return {boolean} 542 * @return {boolean}
555 */ 543 */
556 isGeneric() 544 isGeneric()
557 { 545 {
558 return !(this.sitekeys && this.sitekeys.length) && 546 return !(this.sitekeys && this.sitekeys.length) &&
559 (!this.domains || 547 (!this.domains || this.domains.get(""));
560 typeof this.domains != "string" && this.domains.get(""));
561 }, 548 },
562 549
563 /** 550 /**
564 * See Filter.serialize() 551 * See Filter.serialize()
565 * @inheritdoc 552 * @inheritdoc
566 */ 553 */
567 serialize(buffer) 554 serialize(buffer)
568 { 555 {
569 if (this._disabled || this._hitCount || this._lastHit) 556 if (this._disabled || this._hitCount || this._lastHit)
570 { 557 {
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
1116 */ 1103 */
1117 function ElemHideEmulationFilter(text, domains, selector) 1104 function ElemHideEmulationFilter(text, domains, selector)
1118 { 1105 {
1119 ElemHideBase.call(this, text, domains, selector); 1106 ElemHideBase.call(this, text, domains, selector);
1120 } 1107 }
1121 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; 1108 exports.ElemHideEmulationFilter = ElemHideEmulationFilter;
1122 1109
1123 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { 1110 ElemHideEmulationFilter.prototype = extend(ElemHideBase, {
1124 type: "elemhideemulation" 1111 type: "elemhideemulation"
1125 }); 1112 });
LEFTRIGHT
« no previous file | no next file » | Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Toggle Comments ('s')

Powered by Google App Engine
This is Rietveld