OLD | NEW |
1 function splitSelector(selector) | 1 function splitSelector(selector) |
2 { | 2 { |
3 if (selector.indexOf(",") == -1) | 3 if (selector.indexOf(",") == -1) |
4 return [selector]; | 4 return [selector]; |
5 | 5 |
6 var selectors = []; | 6 var selectors = []; |
7 var start = 0; | 7 var start = 0; |
8 var level = 0; | 8 var level = 0; |
9 var sep = ""; | 9 var sep = ""; |
10 | 10 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
64 { | 64 { |
65 return new URL(stylesheet.href).origin == this.window.location.origin; | 65 return new URL(stylesheet.href).origin == this.window.location.origin; |
66 } | 66 } |
67 catch (e) | 67 catch (e) |
68 { | 68 { |
69 // Invalid URL, assume that it is first-party. | 69 // Invalid URL, assume that it is first-party. |
70 return true; | 70 return true; |
71 } | 71 } |
72 }, | 72 }, |
73 | 73 |
74 findSelectors: function(stylesheet, selectors) | 74 findSelectors: function(stylesheet, selectors, filters) |
75 { | 75 { |
76 // Explicitly ignore third-party stylesheets to ensure consistent behavior | 76 // Explicitly ignore third-party stylesheets to ensure consistent behavior |
77 // between Firefox and Chrome. | 77 // between Firefox and Chrome. |
78 if (!this.isSameOrigin(stylesheet)) | 78 if (!this.isSameOrigin(stylesheet)) |
79 return; | 79 return; |
80 | 80 |
81 var rules = stylesheet.cssRules; | 81 var rules = stylesheet.cssRules; |
82 if (!rules) | 82 if (!rules) |
83 return; | 83 return; |
84 | 84 |
(...skipping 10 matching lines...) Expand all Loading... |
95 var regexp = pattern.regexp; | 95 var regexp = pattern.regexp; |
96 | 96 |
97 if (typeof regexp == "string") | 97 if (typeof regexp == "string") |
98 regexp = pattern.regexp = new RegExp(regexp); | 98 regexp = pattern.regexp = new RegExp(regexp); |
99 | 99 |
100 if (regexp.test(style)) | 100 if (regexp.test(style)) |
101 { | 101 { |
102 var subSelectors = splitSelector(rule.selectorText); | 102 var subSelectors = splitSelector(rule.selectorText); |
103 for (var k = 0; k < subSelectors.length; k++) | 103 for (var k = 0; k < subSelectors.length; k++) |
104 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix); | 104 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix); |
| 105 filters[pattern.text] = true; |
105 } | 106 } |
106 } | 107 } |
107 } | 108 } |
108 }, | 109 }, |
109 | 110 |
110 addSelectors: function(stylesheets) | 111 addSelectors: function(stylesheets) |
111 { | 112 { |
112 var selectors = []; | 113 var selectors = []; |
| 114 var filters = {}; |
113 for (var i = 0; i < stylesheets.length; i++) | 115 for (var i = 0; i < stylesheets.length; i++) |
114 this.findSelectors(stylesheets[i], selectors); | 116 this.findSelectors(stylesheets[i], selectors, filters); |
115 this.addSelectorsFunc(selectors); | 117 this.addSelectorsFunc(selectors, Object.keys(filters)); |
116 }, | 118 }, |
117 | 119 |
118 onLoad: function(event) | 120 onLoad: function(event) |
119 { | 121 { |
120 var stylesheet = event.target.sheet; | 122 var stylesheet = event.target.sheet; |
121 if (stylesheet) | 123 if (stylesheet) |
122 this.addSelectors([stylesheet]); | 124 this.addSelectors([stylesheet]); |
123 }, | 125 }, |
124 | 126 |
125 load: function(callback) | 127 load: function(callback) |
126 { | 128 { |
127 this.getFiltersFunc(function(patterns) | 129 this.getFiltersFunc(function(patterns) |
128 { | 130 { |
129 this.patterns = patterns; | 131 this.patterns = patterns; |
130 callback(); | 132 callback(); |
131 }.bind(this)); | 133 }.bind(this)); |
132 }, | 134 }, |
133 | 135 |
134 apply: function() | 136 apply: function() |
135 { | 137 { |
136 if (this.patterns.length > 0) | 138 if (this.patterns.length > 0) |
137 { | 139 { |
138 var document = this.window.document; | 140 var document = this.window.document; |
139 this.addSelectors(document.styleSheets); | 141 this.addSelectors(document.styleSheets); |
140 document.addEventListener("load", this.onLoad.bind(this), true); | 142 document.addEventListener("load", this.onLoad.bind(this), true); |
141 } | 143 } |
142 } | 144 } |
143 }; | 145 }; |
OLD | NEW |