Skip to content

Commit ea36ad5

Browse files
committed
Merge pull request #465 from cvrebert/defensive-copy
copy the passed-in ruleset in verify(); fixes #458
2 parents a274c3d + ed9926f commit ea36ad5

File tree

4 files changed

+20
-1
lines changed

4 files changed

+20
-1
lines changed

Gruntfile.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ module.exports = function(grunt) {
4141
build_dir: "build",
4242
//Parser lib copy for versions that can't use requirejs
4343
parserlib: "node_modules/parserlib/lib/node-parserlib.js",
44+
//clone copy for versions that can't use requirejs
45+
clone: "node_modules/clone/clone.js",
4446
//Core CSSLint files used by most versions
4547
csslint_files: [
4648
"src/core/CSSLint.js",
@@ -51,6 +53,7 @@ module.exports = function(grunt) {
5153
//Core fileset used by most versions
5254
core_files: [
5355
"<%= parserlib %>",
56+
"<%= clone %>",
5457
"<%= csslint_files %>"
5558
],
5659
// Task configuration.
@@ -86,6 +89,7 @@ module.exports = function(grunt) {
8689
node: {
8790
options: {
8891
banner: "<%= banner.full %>\n" +
92+
"var clone = require('clone');\n" +
8993
"var parserlib = require('parserlib');\n",
9094
footer: "\nexports.CSSLint = CSSLint;"
9195
},

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"test": "grunt test"
2727
},
2828
"dependencies": {
29+
"clone": "~0.1.11",
2930
"parserlib": "~0.2.4"
3031
},
3132
"devDependencies": {

src/core/CSSLint.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* @extends parserlib.util.EventTarget
66
*/
77

8-
/* global parserlib, Reporter */
8+
/* global parserlib, clone, Reporter */
99
/* exported CSSLint */
1010

1111
var CSSLint = (function(){
@@ -189,6 +189,8 @@ var CSSLint = (function(){
189189
}
190190

191191
if (embeddedRuleset.test(text)){
192+
//defensively copy so that caller's version does not get modified
193+
ruleset = clone(ruleset);
192194
ruleset = applyEmbeddedRuleset(text, ruleset);
193195
}
194196

tests/core/CSSLint.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@
2525
Assert.areEqual(2, result.ruleset["adjoining-classes"]);
2626
Assert.areEqual(1, result.ruleset["text-indent"]);
2727
Assert.areEqual(0, result.ruleset["box-sizing"]);
28+
},
29+
30+
"Embedded rulesets should not have the side-effect of modifying the ruleset object passed in by the caller of verify()": function(){
31+
var ruleset = {
32+
"text-indent": 1,
33+
"box-sizing": 1
34+
};
35+
CSSLint.verify("/*csslint bogus, adjoining-classes:true, box-sizing:false */\n.foo.bar{}", ruleset);
36+
37+
Assert.areEqual(undefined, ruleset["adjoining-classes"]);
38+
Assert.areEqual(1, ruleset["text-indent"]);
39+
Assert.areEqual(1, ruleset["box-sizing"]);
2840
}
2941

3042
}));

0 commit comments

Comments
 (0)