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

Side by Side Diff: chrome/content/elemHideEmulation.js

Issue 29361668: Issue 4394 - Create a filter class for element hiding emulation filters (Closed) Base URL: https://bitbucket.org/fhd/adblockpluscore
Patch Set: Address kzar's comments Created Nov. 21, 2016, 5:24 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | lib/common.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 var propertySelectorRegExp = /\[\-abp\-properties=(["'])([^"']+)\1\]/;
2
1 function splitSelector(selector) 3 function splitSelector(selector)
2 { 4 {
3 if (selector.indexOf(",") == -1) 5 if (selector.indexOf(",") == -1)
4 return [selector]; 6 return [selector];
5 7
6 var selectors = []; 8 var selectors = [];
7 var start = 0; 9 var start = 0;
8 var level = 0; 10 var level = 0;
9 var sep = ""; 11 var sep = "";
10 12
(...skipping 18 matching lines...) Expand all
29 selectors.push(selector.substring(start, i)); 31 selectors.push(selector.substring(start, i));
30 start = i + 1; 32 start = i + 1;
31 } 33 }
32 } 34 }
33 } 35 }
34 36
35 selectors.push(selector.substring(start)); 37 selectors.push(selector.substring(start));
36 return selectors; 38 return selectors;
37 } 39 }
38 40
39 function CSSPropertyFilters(window, getFiltersFunc, addSelectorsFunc) 41 function ElemHideEmulation(window, getFiltersFunc, addSelectorsFunc)
40 { 42 {
41 this.window = window; 43 this.window = window;
42 this.getFiltersFunc = getFiltersFunc; 44 this.getFiltersFunc = getFiltersFunc;
43 this.addSelectorsFunc = addSelectorsFunc; 45 this.addSelectorsFunc = addSelectorsFunc;
44 } 46 }
45 47
46 CSSPropertyFilters.prototype = { 48 ElemHideEmulation.prototype = {
47 stringifyStyle: function(style) 49 stringifyStyle: function(style)
48 { 50 {
49 var styles = []; 51 var styles = [];
50 for (var i = 0; i < style.length; i++) 52 for (var i = 0; i < style.length; i++)
51 { 53 {
52 var property = style.item(i); 54 var property = style.item(i);
53 var value = style.getPropertyValue(property); 55 var value = style.getPropertyValue(property);
54 var priority = style.getPropertyPriority(property); 56 var priority = style.getPropertyPriority(property);
55 styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";"); 57 styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";");
56 } 58 }
(...skipping 28 matching lines...) Expand all
85 for (var i = 0; i < rules.length; i++) 87 for (var i = 0; i < rules.length; i++)
86 { 88 {
87 var rule = rules[i]; 89 var rule = rules[i];
88 if (rule.type != rule.STYLE_RULE) 90 if (rule.type != rule.STYLE_RULE)
89 continue; 91 continue;
90 92
91 var style = this.stringifyStyle(rule.style); 93 var style = this.stringifyStyle(rule.style);
92 for (var j = 0; j < this.patterns.length; j++) 94 for (var j = 0; j < this.patterns.length; j++)
93 { 95 {
94 var pattern = this.patterns[j]; 96 var pattern = this.patterns[j];
95 var regexp = pattern.regexp; 97 if (pattern.regexp.test(style))
96
97 if (typeof regexp == "string")
98 regexp = pattern.regexp = new RegExp(regexp, "i");
99
100 if (regexp.test(style))
101 { 98 {
102 var subSelectors = splitSelector(rule.selectorText); 99 var subSelectors = splitSelector(rule.selectorText);
103 for (var k = 0; k < subSelectors.length; k++) 100 for (var k = 0; k < subSelectors.length; k++)
104 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix); 101 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix);
105 filters[pattern.text] = true; 102 filters[pattern.text] = true;
106 } 103 }
107 } 104 }
108 } 105 }
109 }, 106 },
110 107
(...skipping 10 matching lines...) Expand all
121 { 118 {
122 var stylesheet = event.target.sheet; 119 var stylesheet = event.target.sheet;
123 if (stylesheet) 120 if (stylesheet)
124 this.addSelectors([stylesheet]); 121 this.addSelectors([stylesheet]);
125 }, 122 },
126 123
127 load: function(callback) 124 load: function(callback)
128 { 125 {
129 this.getFiltersFunc(function(patterns) 126 this.getFiltersFunc(function(patterns)
130 { 127 {
131 this.patterns = patterns; 128 this.patterns = [];
129 for (var i = 0; i < patterns.length; i++)
130 {
131 var pattern = patterns[i];
132 var match = propertySelectorRegExp.exec(pattern.selector);
133 if (!match)
134 continue;
135
136 var propertyExpression = match[2];
137 var regexpString;
138 if (propertyExpression.length >= 2 && propertyExpression[0] == "/" &&
139 propertyExpression[propertyExpression.length - 1] == "/")
140 regexpString = propertyExpression.slice(1, -1);
141 else
142 regexpString = filterToRegExp(propertyExpression);
143
144 this.patterns.push({
145 text: pattern.text,
146 regexp: new RegExp(regexpString, "i"),
147 prefix: pattern.selector.substr(0, match.index),
148 suffix: pattern.selector.substr(match.index + match[0].length)
149 });
150 }
151
132 callback(); 152 callback();
133 }.bind(this)); 153 }.bind(this));
134 }, 154 },
135 155
136 apply: function() 156 apply: function()
137 { 157 {
138 if (this.patterns.length > 0) 158 if (this.patterns.length > 0)
139 { 159 {
140 var document = this.window.document; 160 var document = this.window.document;
141 this.addSelectors(document.styleSheets); 161 this.addSelectors(document.styleSheets);
142 document.addEventListener("load", this.onLoad.bind(this), true); 162 document.addEventListener("load", this.onLoad.bind(this), true);
143 } 163 }
144 } 164 }
145 }; 165 };
OLDNEW
« no previous file with comments | « no previous file | lib/common.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld