| LEFT | RIGHT | 
|---|
| 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 586 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 597 { | 597 { | 
| 598   return patterns.some(pattern => pattern.dependsOnCharacterData); | 598   return patterns.some(pattern => pattern.dependsOnCharacterData); | 
| 599 } | 599 } | 
| 600 | 600 | 
| 601 function ElemHideEmulation(addSelectorsFunc, hideElemsFunc) | 601 function ElemHideEmulation(addSelectorsFunc, hideElemsFunc) | 
| 602 { | 602 { | 
| 603   this.document = document; | 603   this.document = document; | 
| 604   this.addSelectorsFunc = addSelectorsFunc; | 604   this.addSelectorsFunc = addSelectorsFunc; | 
| 605   this.hideElemsFunc = hideElemsFunc; | 605   this.hideElemsFunc = hideElemsFunc; | 
| 606   this.observer = new MutationObserver(this.observe.bind(this)); | 606   this.observer = new MutationObserver(this.observe.bind(this)); | 
| 607 |  | 
| 608   // This flag is supposed to indicate whether we should prefer setting the |  | 
| 609   // style attribute of the element over using CSS selectors. It is set by the |  | 
| 610   // web extension if the tabs.removeCSS API is available (Firefox 53+). But |  | 
| 611   // because of issues with performance (see #6422), we are ignoring the value |  | 
| 612   // of this flag for now; we always set the style attribute. |  | 
| 613   // https://issues.adblockplus.org/ticket/6504#comment:9 |  | 
| 614   this.useInlineStyles = true; |  | 
| 615 } | 607 } | 
| 616 | 608 | 
| 617 ElemHideEmulation.prototype = { | 609 ElemHideEmulation.prototype = { | 
| 618   isSameOrigin(stylesheet) | 610   isSameOrigin(stylesheet) | 
| 619   { | 611   { | 
| 620     try | 612     try | 
| 621     { | 613     { | 
| 622       return new URL(stylesheet.href).origin == this.document.location.origin; | 614       return new URL(stylesheet.href).origin == this.document.location.origin; | 
| 623     } | 615     } | 
| 624     catch (e) | 616     catch (e) | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 723 | 715 | 
| 724     // If neither any style sheets nor any DOM mutations have been specified, | 716     // If neither any style sheets nor any DOM mutations have been specified, | 
| 725     // do full processing. | 717     // do full processing. | 
| 726     if (!stylesheets && !mutations) | 718     if (!stylesheets && !mutations) | 
| 727       stylesheets = this.document.styleSheets; | 719       stylesheets = this.document.styleSheets; | 
| 728 | 720 | 
| 729     // If there are any DOM mutations and any of the patterns depends on both | 721     // If there are any DOM mutations and any of the patterns depends on both | 
| 730     // style sheets and the DOM (e.g. -abp-has(-abp-properties)), find all the | 722     // style sheets and the DOM (e.g. -abp-has(-abp-properties)), find all the | 
| 731     // rules in every style sheet in the document, because we need to run | 723     // rules in every style sheet in the document, because we need to run | 
| 732     // querySelectorAll afterwards. On the other hand, if we only have patterns | 724     // querySelectorAll afterwards. On the other hand, if we only have patterns | 
| 733     // that depend on either styles or DOM both not both | 725     // that depend on either styles or DOM both not both (e.g. -abp-contains), | 
| 734     // (e.g. -abp-properties or -abp-contains), we can skip this part. | 726     // we can skip this part. | 
| 735     if (mutations && patterns.some(pattern => pattern.dependsOnStylesAndDOM)) | 727     if (mutations && patterns.some(pattern => pattern.dependsOnStylesAndDOM)) | 
| 736       stylesheets = this.document.styleSheets; | 728       stylesheets = this.document.styleSheets; | 
| 737 | 729 | 
| 738     for (let stylesheet of stylesheets || []) | 730     for (let stylesheet of stylesheets || []) | 
| 739     { | 731     { | 
| 740       // Explicitly ignore third-party stylesheets to ensure consistent behavior | 732       // Explicitly ignore third-party stylesheets to ensure consistent behavior | 
| 741       // between Firefox and Chrome. | 733       // between Firefox and Chrome. | 
| 742       if (!this.isSameOrigin(stylesheet)) | 734       if (!this.isSameOrigin(stylesheet)) | 
| 743         continue; | 735         continue; | 
| 744 | 736 | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 792 | 784 | 
| 793         pattern = patterns.shift(); | 785         pattern = patterns.shift(); | 
| 794 | 786 | 
| 795         let evaluationTargets = targets; | 787         let evaluationTargets = targets; | 
| 796 | 788 | 
| 797         // If the pattern appears to contain any sibling combinators, we can't | 789         // If the pattern appears to contain any sibling combinators, we can't | 
| 798         // easily optimize based on the mutation targets. Since this is a | 790         // easily optimize based on the mutation targets. Since this is a | 
| 799         // special case, skip the optimization. By setting it to null here we | 791         // special case, skip the optimization. By setting it to null here we | 
| 800         // make sure we process the entire DOM. | 792         // make sure we process the entire DOM. | 
| 801         if (pattern.maybeContainsSiblingCombinators) | 793         if (pattern.maybeContainsSiblingCombinators) | 
| 802           evaluationTargets = null; |  | 
| 803 |  | 
| 804         // Ignore mutation targets when using style sheets, because we may have |  | 
| 805         // to update all the CSS selectors. |  | 
| 806         if (!this.useInlineStyles) |  | 
| 807           evaluationTargets = null; | 794           evaluationTargets = null; | 
| 808 | 795 | 
| 809         generator = evaluate(pattern.selectors, 0, "", | 796         generator = evaluate(pattern.selectors, 0, "", | 
| 810                              this.document, cssStyles, evaluationTargets); | 797                              this.document, cssStyles, evaluationTargets); | 
| 811       } | 798       } | 
| 812       for (let selector of generator) | 799       for (let selector of generator) | 
| 813       { | 800       { | 
| 814         if (selector != null) | 801         if (selector != null) | 
| 815         { | 802         { | 
| 816           for (let element of this.document.querySelectorAll(selector)) | 803           for (let element of this.document.querySelectorAll(selector)) | 
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 978           characterData: shouldObserveCharacterData(this.patterns), | 965           characterData: shouldObserveCharacterData(this.patterns), | 
| 979           subtree: true | 966           subtree: true | 
| 980         } | 967         } | 
| 981       ); | 968       ); | 
| 982       this.document.addEventListener("load", this.onLoad.bind(this), true); | 969       this.document.addEventListener("load", this.onLoad.bind(this), true); | 
| 983     } | 970     } | 
| 984   } | 971   } | 
| 985 }; | 972 }; | 
| 986 | 973 | 
| 987 exports.ElemHideEmulation = ElemHideEmulation; | 974 exports.ElemHideEmulation = ElemHideEmulation; | 
| LEFT | RIGHT | 
|---|