Skip to content

Commit e38b87d

Browse files
committed
Implemented rule to avoid unqualified attribute selectors (fixes 218)
1 parent 95e5d18 commit e38b87d

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Rule: Don't use unqualified attribute selectors because they're just like universal selectors.
3+
*/
4+
/*global CSSLint*/
5+
CSSLint.addRule({
6+
7+
//rule information
8+
id: "unqualified-attributes",
9+
name: "Disallow unqualified attribute selectors",
10+
desc: "Unqualified attribute selectors are known to be slow.",
11+
browsers: "All",
12+
13+
//initialization
14+
init: function(parser, reporter){
15+
var rule = this;
16+
17+
parser.addListener("startrule", function(event){
18+
19+
var selectors = event.selectors,
20+
selector,
21+
part,
22+
modifier,
23+
i, j, k;
24+
25+
for (i=0; i < selectors.length; i++){
26+
selector = selectors[i];
27+
28+
part = selector.parts[selector.parts.length-1];
29+
if (part.type == parser.SELECTOR_PART_TYPE){
30+
for (k=0; k < part.modifiers.length; k++){
31+
modifier = part.modifiers[k];
32+
if (modifier.type == "attribute" && (!modifier.elementName || modifier.elementName == "*")){
33+
reporter.report(rule.desc, modifier.line, modifier.col, rule);
34+
}
35+
}
36+
}
37+
38+
}
39+
});
40+
}
41+
42+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
(function(){
2+
3+
/*global YUITest, CSSLint*/
4+
var Assert = YUITest.Assert;
5+
6+
YUITest.TestRunner.add(new YUITest.TestCase({
7+
8+
name: "Unqualified Attributes Errors",
9+
10+
"Using an unqualified attribute selector alone should result in a warning": function(){
11+
var result = CSSLint.verify("[type=text] { font-size: 10px; }", {"unqualified-attributes": 1 });
12+
Assert.areEqual(1, result.messages.length);
13+
Assert.areEqual("warning", result.messages[0].type);
14+
Assert.areEqual("Unqualified attribute selectors are known to be slow.", result.messages[0].message);
15+
},
16+
17+
"Using an unqualified attribute selector as the right-most part should result in a warning": function(){
18+
var result = CSSLint.verify("p div [type=text] { font-size: 10px; }", {"unqualified-attributes": 1 });
19+
Assert.areEqual(1, result.messages.length);
20+
Assert.areEqual("warning", result.messages[0].type);
21+
Assert.areEqual("Unqualified attribute selectors are known to be slow.", result.messages[0].message);
22+
},
23+
24+
"Using an unqualified attribute selector in the middle should not result in a warning": function(){
25+
var result = CSSLint.verify("[type=text] .foo { font-size: 10px; } ", {"unqualified-attributes": 1 });
26+
Assert.areEqual(0, result.messages.length);
27+
}
28+
29+
}));
30+
31+
})();

0 commit comments

Comments
 (0)