Skip to content

Commit 6b6de70

Browse files
jonathantnealNV
authored andcommitted
Add CSSGroupingRule and CSSConditionRule
1 parent 97bee09 commit 6b6de70

File tree

9 files changed

+134
-18
lines changed

9 files changed

+134
-18
lines changed

lib/CSSConditionRule.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
//.CommonJS
2+
var CSSOM = {
3+
CSSRule: require("./CSSRule").CSSRule,
4+
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule
5+
};
6+
///CommonJS
7+
8+
9+
/**
10+
* @constructor
11+
* @see https://www.w3.org/TR/css-conditional-3/#the-cssconditionrule-interface
12+
*/
13+
CSSOM.CSSConditionRule = function CSSConditionRule() {
14+
CSSOM.CSSGroupingRule.call(this);
15+
this.cssRules = [];
16+
};
17+
18+
CSSOM.CSSConditionRule.prototype = new CSSOM.CSSGroupingRule();
19+
CSSOM.CSSConditionRule.prototype.constructor = CSSOM.CSSConditionRule;
20+
CSSOM.CSSConditionRule.prototype.conditionText = ''
21+
CSSOM.CSSConditionRule.prototype.cssText = ''
22+
23+
//.CommonJS
24+
exports.CSSConditionRule = CSSOM.CSSConditionRule;
25+
///CommonJS

lib/CSSGroupingRule.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//.CommonJS
2+
var CSSOM = {
3+
CSSRule: require("./CSSRule").CSSRule
4+
};
5+
///CommonJS
6+
7+
8+
/**
9+
* @constructor
10+
* @see https://drafts.csswg.org/cssom/#the-cssgroupingrule-interface
11+
*/
12+
CSSOM.CSSGroupingRule = function CSSGroupingRule() {
13+
CSSOM.CSSRule.call(this);
14+
this.cssRules = [];
15+
};
16+
17+
CSSOM.CSSGroupingRule.prototype = new CSSOM.CSSRule();
18+
CSSOM.CSSGroupingRule.prototype.constructor = CSSOM.CSSGroupingRule;
19+
20+
21+
/**
22+
* Used to insert a new CSS rule to a list of CSS rules.
23+
*
24+
* @example
25+
* cssGroupingRule.cssText
26+
* -> "body{margin:0;}"
27+
* cssGroupingRule.insertRule("img{border:none;}", 1)
28+
* -> 1
29+
* cssGroupingRule.cssText
30+
* -> "body{margin:0;}img{border:none;}"
31+
*
32+
* @param {string} rule
33+
* @param {number} [index]
34+
* @see https://www.w3.org/TR/cssom-1/#dom-cssgroupingrule-insertrule
35+
* @return {number} The index within the grouping rule's collection of the newly inserted rule.
36+
*/
37+
CSSOM.CSSGroupingRule.prototype.insertRule = function insertRule(rule, index) {
38+
if (index < 0 || index > this.cssRules.length) {
39+
throw new RangeError("INDEX_SIZE_ERR");
40+
}
41+
var cssRule = CSSOM.parse(rule).cssRules[0];
42+
cssRule.parentRule = this;
43+
this.cssRules.splice(index, 0, cssRule);
44+
return index;
45+
};
46+
47+
/**
48+
* Used to delete a rule from the grouping rule.
49+
*
50+
* cssGroupingRule.cssText
51+
* -> "img{border:none;}body{margin:0;}"
52+
* cssGroupingRule.deleteRule(0)
53+
* cssGroupingRule.cssText
54+
* -> "body{margin:0;}"
55+
*
56+
* @param {number} index within the grouping rule's rule list of the rule to remove.
57+
* @see https://www.w3.org/TR/cssom-1/#dom-cssgroupingrule-deleterule
58+
*/
59+
CSSOM.CSSGroupingRule.prototype.deleteRule = function deleteRule(index) {
60+
if (index < 0 || index >= this.cssRules.length) {
61+
throw new RangeError("INDEX_SIZE_ERR");
62+
}
63+
this.cssRules.splice(index, 1)[0].parentRule = null;
64+
};
65+
66+
//.CommonJS
67+
exports.CSSGroupingRule = CSSOM.CSSGroupingRule;
68+
///CommonJS

lib/CSSMediaRule.js

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
//.CommonJS
22
var CSSOM = {
33
CSSRule: require("./CSSRule").CSSRule,
4+
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
5+
CSSConditionRule: require("./CSSConditionRule").CSSConditionRule,
46
MediaList: require("./MediaList").MediaList
57
};
68
///CommonJS
@@ -12,26 +14,36 @@ var CSSOM = {
1214
* @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSMediaRule
1315
*/
1416
CSSOM.CSSMediaRule = function CSSMediaRule() {
15-
CSSOM.CSSRule.call(this);
17+
CSSOM.CSSConditionRule.call(this);
1618
this.media = new CSSOM.MediaList();
17-
this.cssRules = [];
1819
};
1920

20-
CSSOM.CSSMediaRule.prototype = new CSSOM.CSSRule();
21+
CSSOM.CSSMediaRule.prototype = new CSSOM.CSSConditionRule();
2122
CSSOM.CSSMediaRule.prototype.constructor = CSSOM.CSSMediaRule;
2223
CSSOM.CSSMediaRule.prototype.type = 4;
23-
//FIXME
24-
//CSSOM.CSSMediaRule.prototype.insertRule = CSSStyleSheet.prototype.insertRule;
25-
//CSSOM.CSSMediaRule.prototype.deleteRule = CSSStyleSheet.prototype.deleteRule;
2624

27-
// http://opensource.apple.com/source/WebCore/WebCore-658.28/css/CSSMediaRule.cpp
28-
Object.defineProperty(CSSOM.CSSMediaRule.prototype, "cssText", {
29-
get: function() {
30-
var cssTexts = [];
31-
for (var i=0, length=this.cssRules.length; i < length; i++) {
32-
cssTexts.push(this.cssRules[i].cssText);
33-
}
34-
return "@media " + this.media.mediaText + " {" + cssTexts.join("") + "}";
25+
// https://opensource.apple.com/source/WebCore/WebCore-7611.1.21.161.3/css/CSSMediaRule.cpp
26+
Object.defineProperties(CSSOM.CSSMediaRule.prototype, {
27+
"conditionText": {
28+
get: function() {
29+
return this.media.mediaText;
30+
},
31+
set: function(value) {
32+
this.media.mediaText = value;
33+
},
34+
configurable: true,
35+
enumerable: true
36+
},
37+
"cssText": {
38+
get: function() {
39+
var cssTexts = [];
40+
for (var i=0, length=this.cssRules.length; i < length; i++) {
41+
cssTexts.push(this.cssRules[i].cssText);
42+
}
43+
return "@media " + this.media.mediaText + " {" + cssTexts.join("") + "}";
44+
},
45+
configurable: true,
46+
enumerable: true
3547
}
3648
});
3749

lib/CSSSupportsRule.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
//.CommonJS
22
var CSSOM = {
33
CSSRule: require("./CSSRule").CSSRule,
4+
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
5+
CSSConditionRule: require("./CSSConditionRule").CSSConditionRule
46
};
57
///CommonJS
68

@@ -10,12 +12,10 @@ var CSSOM = {
1012
* @see https://drafts.csswg.org/css-conditional-3/#the-csssupportsrule-interface
1113
*/
1214
CSSOM.CSSSupportsRule = function CSSSupportsRule() {
13-
CSSOM.CSSRule.call(this);
14-
this.conditionText = '';
15-
this.cssRules = [];
15+
CSSOM.CSSConditionRule.call(this);
1616
};
1717

18-
CSSOM.CSSSupportsRule.prototype = new CSSOM.CSSRule();
18+
CSSOM.CSSSupportsRule.prototype = new CSSOM.CSSConditionRule();
1919
CSSOM.CSSSupportsRule.prototype.constructor = CSSOM.CSSSupportsRule;
2020
CSSOM.CSSSupportsRule.prototype.type = 12;
2121

lib/clone.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
//.CommonJS
22
var CSSOM = {
33
CSSStyleSheet: require("./CSSStyleSheet").CSSStyleSheet,
4+
CSSRule: require("./CSSRule").CSSRule,
45
CSSStyleRule: require("./CSSStyleRule").CSSStyleRule,
6+
CSSGroupingRule: require("./CSSGroupingRule").CSSGroupingRule,
7+
CSSConditionRule: require("./CSSConditionRule").CSSConditionRule,
58
CSSMediaRule: require("./CSSMediaRule").CSSMediaRule,
69
CSSSupportsRule: require("./CSSSupportsRule").CSSSupportsRule,
710
CSSStyleDeclaration: require("./CSSStyleDeclaration").CSSStyleDeclaration,

lib/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
exports.CSSStyleDeclaration = require('./CSSStyleDeclaration').CSSStyleDeclaration;
44
exports.CSSRule = require('./CSSRule').CSSRule;
5+
exports.CSSGroupingRule = require('./CSSGroupingRule').CSSGroupingRule;
6+
exports.CSSConditionRule = require('./CSSConditionRule').CSSConditionRule;
57
exports.CSSStyleRule = require('./CSSStyleRule').CSSStyleRule;
68
exports.MediaList = require('./MediaList').MediaList;
79
exports.CSSMediaRule = require('./CSSMediaRule').CSSMediaRule;

lib/parse.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,9 @@ exports.parse = CSSOM.parse;
451451
CSSOM.CSSStyleSheet = require("./CSSStyleSheet").CSSStyleSheet;
452452
CSSOM.CSSStyleRule = require("./CSSStyleRule").CSSStyleRule;
453453
CSSOM.CSSImportRule = require("./CSSImportRule").CSSImportRule;
454+
CSSOM.CSSGroupingRule = require("./CSSGroupingRule").CSSGroupingRule;
454455
CSSOM.CSSMediaRule = require("./CSSMediaRule").CSSMediaRule;
456+
CSSOM.CSSConditionRule = require("./CSSConditionRule").CSSConditionRule;
455457
CSSOM.CSSSupportsRule = require("./CSSSupportsRule").CSSSupportsRule;
456458
CSSOM.CSSFontFaceRule = require("./CSSFontFaceRule").CSSFontFaceRule;
457459
CSSOM.CSSHostRule = require("./CSSHostRule").CSSHostRule;

spec/parse.spec.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,8 @@ var TESTS = [
728728
0: "(min-width: 768px)",
729729
length: 1
730730
},
731+
// This is currently incorrect.
732+
// conditionText: "(min-width: 768px)",
731733
cssRules: [
732734
{
733735
media: {

src/files.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ exports.files = [
22
"CSSStyleDeclaration",
33
"CSSRule",
44
"CSSStyleRule",
5+
"CSSGroupingRule",
6+
"CSSConditionRule",
57
"MediaList",
68
"CSSMediaRule",
79
"CSSSupportsRule",

0 commit comments

Comments
 (0)