| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 var propertySelectorRegExp = /\[\-abp\-properties=(["'])([^"']+)\1\]/; | 1 var propertySelectorRegExp = /\[\-abp\-properties=(["'])([^"']+)\1\]/; |
| 2 | 2 |
| 3 function splitSelector(selector) | 3 function splitSelector(selector) |
| 4 { | 4 { |
| 5 if (selector.indexOf(",") == -1) | 5 if (selector.indexOf(",") == -1) |
| 6 return [selector]; | 6 return [selector]; |
| 7 | 7 |
| 8 var selectors = []; | 8 var selectors = []; |
| 9 var start = 0; | 9 var start = 0; |
| 10 var level = 0; | 10 var level = 0; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 66 { | 66 { |
| 67 return new URL(stylesheet.href).origin == this.window.location.origin; | 67 return new URL(stylesheet.href).origin == this.window.location.origin; |
| 68 } | 68 } |
| 69 catch (e) | 69 catch (e) |
| 70 { | 70 { |
| 71 // Invalid URL, assume that it is first-party. | 71 // Invalid URL, assume that it is first-party. |
| 72 return true; | 72 return true; |
| 73 } | 73 } |
| 74 }, | 74 }, |
| 75 | 75 |
| 76 findSelectors: function(stylesheet, selectors, filters) | 76 findSelectors: function(stylesheet, filters) |
| 77 { | 77 { |
| 78 // Explicitly ignore third-party stylesheets to ensure consistent behavior | 78 // Explicitly ignore third-party stylesheets to ensure consistent behavior |
| 79 // between Firefox and Chrome. | 79 // between Firefox and Chrome. |
| 80 if (!this.isSameOrigin(stylesheet)) | 80 if (!this.isSameOrigin(stylesheet)) |
| 81 return; | 81 return; |
| 82 | 82 |
| 83 var rules = stylesheet.cssRules; | 83 let rules = stylesheet.cssRules; |
| 84 if (!rules) | 84 if (!rules) |
| 85 return; | 85 return; |
| 86 | 86 |
| 87 for (var i = 0; i < rules.length; i++) | 87 for (let rule of rules) |
| 88 { | 88 { |
| 89 var rule = rules[i]; | |
| 90 if (rule.type != rule.STYLE_RULE) | 89 if (rule.type != rule.STYLE_RULE) |
| 91 continue; | 90 continue; |
| 92 | 91 |
| 93 var style = this.stringifyStyle(rule.style); | 92 let style = this.stringifyStyle(rule.style); |
| 94 for (var j = 0; j < this.patterns.length; j++) | 93 |
|
Sebastian Noack
2017/02/07 15:37:57
Nit: The blank line added here is unrelated at lea
wspee
2017/02/09 08:40:34
Done.
| |
| 94 for (let pattern of this.patterns) | |
| 95 { | 95 { |
| 96 var pattern = this.patterns[j]; | |
| 97 if (pattern.regexp.test(style)) | 96 if (pattern.regexp.test(style)) |
| 98 { | 97 { |
| 99 var subSelectors = splitSelector(rule.selectorText); | 98 let selectors = filters.get(pattern.text); |
| 100 for (var k = 0; k < subSelectors.length; k++) | 99 if (!selectors) |
| 101 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix); | 100 { |
| 102 filters[pattern.text] = true; | 101 selectors = []; |
| 102 filters.set(pattern.text, selectors); | |
| 103 } | |
| 104 | |
| 105 for (let subSelector of splitSelector(rule.selectorText)) | |
| 106 selectors.push(pattern.prefix + subSelector + pattern.suffix); | |
| 103 } | 107 } |
| 104 } | 108 } |
| 105 } | 109 } |
| 106 }, | 110 }, |
| 107 | 111 |
| 108 addSelectors: function(stylesheets) | 112 addSelectors: function(stylesheets) |
| 109 { | 113 { |
| 110 var selectors = []; | 114 let filters = new Map(); |
| 111 var filters = {}; | 115 for (let stylesheet of stylesheets) |
| 112 for (var i = 0; i < stylesheets.length; i++) | 116 this.findSelectors(stylesheet, filters); |
| 113 this.findSelectors(stylesheets[i], selectors, filters); | 117 this.addSelectorsFunc(filters); |
|
Sebastian Noack
2017/02/07 15:37:57
I just realized, the implications for when this fu
Sebastian Noack
2017/02/07 15:59:56
Another advantage of this approach is, that the AP
Sebastian Noack
2017/02/08 07:12:29
Perhaps even better, just use two arrays (instead
wspee
2017/02/09 08:40:34
Done.
| |
| 114 this.addSelectorsFunc(selectors, Object.keys(filters)); | |
| 115 }, | 118 }, |
| 116 | 119 |
| 117 onLoad: function(event) | 120 onLoad: function(event) |
| 118 { | 121 { |
| 119 var stylesheet = event.target.sheet; | 122 var stylesheet = event.target.sheet; |
| 120 if (stylesheet) | 123 if (stylesheet) |
| 121 this.addSelectors([stylesheet]); | 124 this.addSelectors([stylesheet]); |
| 122 }, | 125 }, |
| 123 | 126 |
| 124 load: function(callback) | 127 load: function(callback) |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 157 apply: function() | 160 apply: function() |
| 158 { | 161 { |
| 159 if (this.patterns.length > 0) | 162 if (this.patterns.length > 0) |
| 160 { | 163 { |
| 161 var document = this.window.document; | 164 var document = this.window.document; |
| 162 this.addSelectors(document.styleSheets); | 165 this.addSelectors(document.styleSheets); |
| 163 document.addEventListener("load", this.onLoad.bind(this), true); | 166 document.addEventListener("load", this.onLoad.bind(this), true); |
| 164 } | 167 } |
| 165 } | 168 } |
| 166 }; | 169 }; |
| OLD | NEW |