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

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

Issue 29336406: Issue 3654 - Properly split up selectors when applying CSS property filters (Closed)
Patch Set: Created Feb. 15, 2016, 5:17 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 | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 function splitSelector(selector)
Sebastian Noack 2016/02/15 17:19:08 This logic has been copied (with some minor change
kzar 2016/02/15 17:30:14 Acknowledged. (Mind filing an issue for that?)
Sebastian Noack 2016/02/15 17:49:31 I attached the patch the same issue: https://coder
2 {
3 if (selector.indexOf(",") == -1)
4 return [selector];
5
6 var selectors = [];
7 var start = 0;
8 var level = 0;
9 var sep = "";
10
11 for (var i = 0; i < selector.length; i++)
12 {
13 var chr = selector[i];
14
15 if (chr == "\\") // ignore escaped characters
16 i++;
17 else if (chr == sep) // don't split within quoted text
18 sep = ""; // e.g. [attr=","]
19 else if (sep == "")
20 {
21 if (chr == '"' || chr == "'")
22 sep = chr;
23 else if (chr == "(") // don't split between parentheses
24 level++; // e.g. :matches(div,span)
25 else if (chr == ")")
26 level = Math.max(0, level - 1);
27 else if (chr == "," && level == 0)
28 {
29 selectors.push(selector.substring(start, i));
30 start = i + 1;
31 }
32 }
33 }
34
35 selectors.push(selector.substring(start));
36 return selectors;
37 }
38
1 function CSSPropertyFilters(window, addSelectorsFunc) { 39 function CSSPropertyFilters(window, addSelectorsFunc) {
2 this.window = window; 40 this.window = window;
3 this.addSelectorsFunc = addSelectorsFunc; 41 this.addSelectorsFunc = addSelectorsFunc;
4 } 42 }
5
6 CSSPropertyFilters.prototype = { 43 CSSPropertyFilters.prototype = {
7 stringifyStyle: function(style) 44 stringifyStyle: function(style)
8 { 45 {
9 var styles = []; 46 var styles = [];
10 for (var i = 0; i < style.length; i++) 47 for (var i = 0; i < style.length; i++)
11 { 48 {
12 var property = style.item(i); 49 var property = style.item(i);
13 var value = style.getPropertyValue(property); 50 var value = style.getPropertyValue(property);
14 var priority = style.getPropertyPriority(property); 51 var priority = style.getPropertyPriority(property);
15 styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";"); 52 styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";");
(...skipping 17 matching lines...) Expand all
33 var style = this.stringifyStyle(rule.style); 70 var style = this.stringifyStyle(rule.style);
34 for (var j = 0; j < this.patterns.length; j++) 71 for (var j = 0; j < this.patterns.length; j++)
35 { 72 {
36 var pattern = this.patterns[j]; 73 var pattern = this.patterns[j];
37 var regexp = pattern.regexp; 74 var regexp = pattern.regexp;
38 75
39 if (typeof regexp == "string") 76 if (typeof regexp == "string")
40 regexp = pattern.regexp = new RegExp(regexp); 77 regexp = pattern.regexp = new RegExp(regexp);
41 78
42 if (regexp.test(style)) 79 if (regexp.test(style))
43 selectors.push(pattern.prefix + rule.selectorText + pattern.suffix); 80 {
81 var subSelectors = splitSelector(rule.selectorText);
82 for (var k = 0; k < subSelectors.length; k++)
83 selectors.push(pattern.prefix + subSelectors[k] + pattern.suffix);
84 }
44 } 85 }
45 } 86 }
46 }, 87 },
47 88
48 addSelectors: function(stylesheets) 89 addSelectors: function(stylesheets)
49 { 90 {
50 var selectors = []; 91 var selectors = [];
51 for (var i = 0; i < stylesheets.length; i++) 92 for (var i = 0; i < stylesheets.length; i++)
52 this.findSelectors(stylesheets[i], selectors); 93 this.findSelectors(stylesheets[i], selectors);
53 this.addSelectorsFunc(selectors); 94 this.addSelectorsFunc(selectors);
(...skipping 24 matching lines...) Expand all
78 apply: function() 119 apply: function()
79 { 120 {
80 if (this.patterns.length > 0) 121 if (this.patterns.length > 0)
81 { 122 {
82 var document = this.window.document; 123 var document = this.window.document;
83 this.addSelectors(document.styleSheets); 124 this.addSelectors(document.styleSheets);
84 document.addEventListener("load", this.onLoad.bind(this), true); 125 document.addEventListener("load", this.onLoad.bind(this), true);
85 } 126 }
86 } 127 }
87 }; 128 };
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld