Left: | ||
Right: |
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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
352 /** | 352 /** |
353 * Determines whether domainSource is already upper-case, | 353 * Determines whether domainSource is already upper-case, |
354 * can be overridden by subclasses. | 354 * can be overridden by subclasses. |
355 * @type {boolean} | 355 * @type {boolean} |
356 */ | 356 */ |
357 domainSourceIsUpperCase: false, | 357 domainSourceIsUpperCase: false, |
358 | 358 |
359 /** | 359 /** |
360 * Map containing domains that this filter should match on/not match | 360 * Map containing domains that this filter should match on/not match |
361 * on or null if the filter should match on all domains | 361 * on or null if the filter should match on all domains |
362 * @type {Object} | 362 * @type {?Map.<string,boolean>} |
363 */ | 363 */ |
364 get domains() | 364 get domains() |
365 { | 365 { |
366 // Despite this property being cached, the getter is called | 366 // Despite this property being cached, the getter is called |
367 // several times on Safari, due to WebKit bug 132872 | 367 // several times on Safari, due to WebKit bug 132872 |
368 let prop = Object.getOwnPropertyDescriptor(this, "domains"); | 368 let prop = Object.getOwnPropertyDescriptor(this, "domains"); |
369 if (prop) | 369 if (prop) |
370 return prop.value; | 370 return prop.value; |
371 | 371 |
372 let domains = null; | 372 let domains = null; |
373 | 373 |
374 if (this.domainSource) | 374 if (this.domainSource) |
375 { | 375 { |
376 let source = this.domainSource; | 376 let source = this.domainSource; |
377 if (!this.domainSourceIsUpperCase) | 377 if (!this.domainSourceIsUpperCase) |
378 { | 378 { |
379 // RegExpFilter already have uppercase domains | 379 // RegExpFilter already have uppercase domains |
380 source = source.toUpperCase(); | 380 source = source.toUpperCase(); |
381 } | 381 } |
382 let list = source.split(this.domainSeparator); | 382 let list = source.split(this.domainSeparator); |
383 if (list.length == 1 && list[0][0] != "~") | 383 if (list.length == 1 && list[0][0] != "~") |
384 { | 384 { |
385 // Fast track for the common one-domain scenario | 385 // Fast track for the common one-domain scenario |
386 domains = Object.create(null); | 386 domains = new Map(); |
387 domains[""] = false; | 387 domains.set("", false); |
388 if (this.ignoreTrailingDot) | 388 if (this.ignoreTrailingDot) |
389 list[0] = list[0].replace(/\.+$/, ""); | 389 list[0] = list[0].replace(/\.+$/, ""); |
390 domains[list[0]] = true; | 390 domains.set(list[0], true); |
Wladimir Palant
2017/09/21 08:11:44
You can initialize the Map object immediately: new
sergei
2017/09/21 10:50:34
Done. BTW, I would like to pay attention to the im
Wladimir Palant
2017/09/21 10:53:01
Feel free to measure that. I assume that the JS en
| |
391 } | 391 } |
392 else | 392 else |
393 { | 393 { |
394 let hasIncludes = false; | 394 let hasIncludes = false; |
395 for (let i = 0; i < list.length; i++) | 395 for (let i = 0; i < list.length; i++) |
396 { | 396 { |
397 let domain = list[i]; | 397 let domain = list[i]; |
398 if (this.ignoreTrailingDot) | 398 if (this.ignoreTrailingDot) |
399 domain = domain.replace(/\.+$/, ""); | 399 domain = domain.replace(/\.+$/, ""); |
400 if (domain == "") | 400 if (domain == "") |
401 continue; | 401 continue; |
402 | 402 |
403 let include; | 403 let include; |
404 if (domain[0] == "~") | 404 if (domain[0] == "~") |
405 { | 405 { |
406 include = false; | 406 include = false; |
407 domain = domain.substr(1); | 407 domain = domain.substr(1); |
408 } | 408 } |
409 else | 409 else |
410 { | 410 { |
411 include = true; | 411 include = true; |
412 hasIncludes = true; | 412 hasIncludes = true; |
413 } | 413 } |
414 | 414 |
415 if (!domains) | 415 if (!domains) |
416 domains = Object.create(null); | 416 domains = new Map(); |
417 | 417 |
418 domains[domain] = include; | 418 domains.set(domain, include); |
419 } | 419 } |
420 if (domains) | 420 if (domains) |
421 domains[""] = !hasIncludes; | 421 domains.set("", !hasIncludes); |
422 } | 422 } |
423 | 423 |
424 this.domainSource = null; | 424 this.domainSource = null; |
425 } | 425 } |
426 | 426 |
427 Object.defineProperty(this, "domains", {value: domains, enumerable: true}); | 427 Object.defineProperty(this, "domains", {value: domains, enumerable: true}); |
428 return this.domains; | 428 return this.domains; |
429 }, | 429 }, |
430 | 430 |
431 /** | 431 /** |
(...skipping 19 matching lines...) Expand all Loading... | |
451 return false; | 451 return false; |
452 } | 452 } |
453 | 453 |
454 // If no domains are set the rule matches everywhere | 454 // If no domains are set the rule matches everywhere |
455 if (!this.domains) | 455 if (!this.domains) |
456 return true; | 456 return true; |
457 | 457 |
458 // If the document has no host name, match only if the filter | 458 // If the document has no host name, match only if the filter |
459 // isn't restricted to specific domains | 459 // isn't restricted to specific domains |
460 if (!docDomain) | 460 if (!docDomain) |
461 return this.domains[""]; | 461 return this.domains.get(""); |
462 | 462 |
463 if (this.ignoreTrailingDot) | 463 if (this.ignoreTrailingDot) |
464 docDomain = docDomain.replace(/\.+$/, ""); | 464 docDomain = docDomain.replace(/\.+$/, ""); |
465 docDomain = docDomain.toUpperCase(); | 465 docDomain = docDomain.toUpperCase(); |
466 | 466 |
467 while (true) | 467 while (true) |
468 { | 468 { |
469 if (docDomain in this.domains) | 469 let isDomainIncluded = this.domains.get(docDomain); |
470 return this.domains[docDomain]; | 470 if (isDomainIncluded != undefined) |
Wladimir Palant
2017/09/21 08:11:44
We usually use the typeof operator: `typeof isDoma
sergei
2017/09/21 10:50:34
Acknowledged.
| |
471 return isDomainIncluded; | |
471 | 472 |
472 let nextDot = docDomain.indexOf("."); | 473 let nextDot = docDomain.indexOf("."); |
473 if (nextDot < 0) | 474 if (nextDot < 0) |
474 break; | 475 break; |
475 docDomain = docDomain.substr(nextDot + 1); | 476 docDomain = docDomain.substr(nextDot + 1); |
476 } | 477 } |
477 return this.domains[""]; | 478 return this.domains.get(""); |
478 }, | 479 }, |
479 | 480 |
480 /** | 481 /** |
481 * Checks whether this filter is active only on a domain and its subdomains. | 482 * Checks whether this filter is active only on a domain and its subdomains. |
482 * @param {string} docDomain | 483 * @param {string} docDomain |
483 * @return {boolean} | 484 * @return {boolean} |
484 */ | 485 */ |
485 isActiveOnlyOnDomain(docDomain) | 486 isActiveOnlyOnDomain(docDomain) |
486 { | 487 { |
487 if (!docDomain || !this.domains || this.domains[""]) | 488 if (!docDomain || !this.domains || this.domains.get("")) |
488 return false; | 489 return false; |
489 | 490 |
490 if (this.ignoreTrailingDot) | 491 if (this.ignoreTrailingDot) |
491 docDomain = docDomain.replace(/\.+$/, ""); | 492 docDomain = docDomain.replace(/\.+$/, ""); |
492 docDomain = docDomain.toUpperCase(); | 493 docDomain = docDomain.toUpperCase(); |
493 | 494 |
494 for (let domain in this.domains) | 495 for (let [domain, isIncluded] of this.domains) |
495 { | 496 { |
496 if (this.domains[domain] && domain != docDomain) | 497 if (isIncluded && domain != docDomain) |
497 { | 498 { |
498 if (domain.length <= docDomain.length) | 499 if (domain.length <= docDomain.length) |
499 return false; | 500 return false; |
500 | 501 |
501 if (!domain.endsWith("." + docDomain)) | 502 if (!domain.endsWith("." + docDomain)) |
502 return false; | 503 return false; |
503 } | 504 } |
504 } | 505 } |
505 | 506 |
506 return true; | 507 return true; |
507 }, | 508 }, |
508 | 509 |
509 /** | 510 /** |
510 * Checks whether this filter is generic or specific | 511 * Checks whether this filter is generic or specific |
511 * @return {boolean} | 512 * @return {boolean} |
512 */ | 513 */ |
513 isGeneric() | 514 isGeneric() |
514 { | 515 { |
515 return !(this.sitekeys && this.sitekeys.length) && | 516 return !(this.sitekeys && this.sitekeys.length) && |
516 (!this.domains || this.domains[""]); | 517 (!this.domains || this.domains.get("")); |
517 }, | 518 }, |
518 | 519 |
519 /** | 520 /** |
520 * See Filter.serialize() | 521 * See Filter.serialize() |
521 * @inheritdoc | 522 * @inheritdoc |
522 */ | 523 */ |
523 serialize(buffer) | 524 serialize(buffer) |
524 { | 525 { |
525 if (this._disabled || this._hitCount || this._lastHit) | 526 if (this._disabled || this._hitCount || this._lastHit) |
526 { | 527 { |
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1020 */ | 1021 */ |
1021 function ElemHideEmulationFilter(text, domains, selector) | 1022 function ElemHideEmulationFilter(text, domains, selector) |
1022 { | 1023 { |
1023 ElemHideBase.call(this, text, domains, selector); | 1024 ElemHideBase.call(this, text, domains, selector); |
1024 } | 1025 } |
1025 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; | 1026 exports.ElemHideEmulationFilter = ElemHideEmulationFilter; |
1026 | 1027 |
1027 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { | 1028 ElemHideEmulationFilter.prototype = extend(ElemHideBase, { |
1028 type: "elemhideemulation" | 1029 type: "elemhideemulation" |
1029 }); | 1030 }); |
OLD | NEW |