<!
doctype html>
<
html>
<
head>
<
meta charset=
"utf-8">
<
title>CSSOM - CSSStyleSheet interface</
title>
<
link rel=
"help" href=
"https://drafts.csswg.org/cssom/#the-cssstylesheet-interface">
<
link rel=
"help" href=
"https://drafts.csswg.org/cssom/#legacy-css-style-sheet-members">
<
script src=
"/resources/testharness.js"></
script>
<
script src=
"/resources/testharnessreport.js"></
script>
<
style id=
"my-stylesheet">
body { width: 50%; }
#foo { height: 100px; }
</
style>
<
style id=
"empty-stylesheet"></
style>
<
script>
var styleSheet, emptyStyleSheet;
setup(function() {
styleSheet = document.styleSheets[0];
styleSheet.cssRules[0].randomProperty = 1;
styleSheet.cssRules[1].randomProperty = 2;
emptyStyleSheet = document.styleSheets[1];
});
test(function() {
assert_equals(styleSheet, document.getElementById(
"my-stylesheet").sheet,
"CSSStyleSheet and LinkStyle's sheet attribute");
assert_equals(styleSheet.cssRules.length, 2,
"CSSStyleSheet cssRules attribute");
assert_equals(styleSheet.cssRules[0].cssText,
"body { width: 50%; }",
"CSSStyleSheet cssRules attribute");
assert_equals(styleSheet.cssRules[1].cssText,
"#foo { height: 100px; }",
"CSSStyleSheet cssRules attribute");
assert_equals(styleSheet.cssRules[2], undefined,
"CSSStyleSheet cssRules attribute");
assert_equals(emptyStyleSheet, document.getElementById(
"empty-stylesheet").sheet,
"CSSStyleSheet and LinkStyle's sheet attribute");
assert_equals(emptyStyleSheet.cssRules.length, 0,
"CSSStyleSheet cssRules attribute");
},
"preconditions");
test(function() {
styleSheet.insertRule(
"#bar { margin: 10px; }", 1);
assert_equals(styleSheet.cssRules.length, 3,
"CSSStyleSheet cssRules attribute after insertRule function");
assert_equals(styleSheet.cssRules[0].cssText,
"body { width: 50%; }",
"CSSStyleSheet cssRules attribute");
assert_equals(styleSheet.cssRules[1].cssText,
"#bar { margin: 10px; }",
"CSSStyleSheet cssRules attribute after insertRule function");
assert_equals(styleSheet.cssRules[2].cssText,
"#foo { height: 100px; }",
"CSSStyleSheet cssRules attribute after insertRule function");
assert_equals(styleSheet.cssRules[0].randomProperty, 1,
"[SameObject] cssRules attribute after insertRule function");
assert_equals(styleSheet.cssRules[2].randomProperty, 2,
"[SameObject] cssRules attribute after insertRule function");
},
'insertRule with #bar selector');
test(function() {
assert_throws_js(TypeError, function() { styleSheet.insertRule() });
},
'insertRule with no argument throws');
test(function() {
assert_throws_dom(
"IndexSizeError", function() {
styleSheet.insertRule(
"#bar { margin: 10px; }", styleSheet.cssRules.length + 1)
});
},
'insertRule with index greater than length throws');
test(function() {
styleSheet.deleteRule(1);
assert_equals(styleSheet.cssRules.length, 2,
"CSSStyleSheet cssRules attribute after deleteRule function");
assert_equals(styleSheet.cssRules[0].cssText,
"body { width: 50%; }",
"CSSStyleSheet cssRules attribute after deleteRule function");
assert_equals(styleSheet.cssRules[1].cssText,
"#foo { height: 100px; }",
"CSSStyleSheet cssRules attribute after deleteRule function");
assert_equals(styleSheet.cssRules[2], undefined,
"CSSStyleSheet cssRules attribute after deleteRule function");
assert_equals(styleSheet.cssRules[0].randomProperty, 1,
"[SameObject] cssRules attribute after deleteRule function");
assert_equals(styleSheet.cssRules[1].randomProperty, 2,
"[SameObject] cssRules attribute after deleteRule function");
},
'deleteRule(1)');
test(function() {
assert_throws_js(TypeError, function() { styleSheet.deleteRule() });
},
'deleteRule with no argument throws');
test(function() {
assert_throws_dom(
"IndexSizeError", function() { emptyStyleSheet.deleteRule(0) });
},
'deleteRule on empty style sheet throws');
test(function() {
styleSheet.removeRule();
assert_equals(styleSheet.cssRules.length, 1,
"CSSStyleSheet cssRules attribute after removeRule function");
assert_equals(styleSheet.cssRules[0].cssText,
"#foo { height: 100px; }",
"CSSStyleSheet cssRules attribute after removeRule function");
},
'removeRule with no argument removes first rule');
test(function() {
assert_throws_dom(
"IndexSizeError", function() { emptyStyleSheet.removeRule(0) });
},
'removeRule on empty style sheet throws');
test(function() {
assert_equals(styleSheet.addRule(
"@media all",
"#foo { color: red }"), -1);
assert_equals(styleSheet.cssRules.length, 2,
"CSSStyleSheet cssRules attribute after addRule function");
assert_true(styleSheet.cssRules[1] instanceof CSSMediaRule,
"CSSStyleSheet addRule does some silly string concatenation");
},
'addRule with @media rule');
test(function() {
styleSheet.removeRule(1);
assert_equals(styleSheet.cssRules.length, 1,
"CSSStyleSheet cssRules attribute after removeRule function with index");
assert_equals(styleSheet.cssRules[0].cssText,
"#foo { height: 100px; }",
"CSSStyleSheet cssRules attribute after deleteRule function with index");
},
'removeRule(1)');
test(function() {
assert_equals(styleSheet.addRule(
"#foo",
"color: red"), -1);
assert_equals(styleSheet.cssRules.length, 2,
"CSSStyleSheet cssRules attribute after addRule function with simple selector");
assert_equals(styleSheet.cssRules[1].cssText,
"#foo { color: red; }",
"CSSStyleSheet cssRules attribute after addRule function without index appends to the end");
assert_equals(styleSheet.addRule(
"#foo",
"color: blue", 0), -1);
assert_equals(styleSheet.cssRules.length, 3,
"CSSStyleSheet cssRules attribute after addRule function with simple selector with index");
assert_equals(styleSheet.cssRules[0].cssText,
"#foo { color: blue; }",
"addRule function with index performs an insertion");
},
'addRule with #foo selectors');
test(function() {
assert_equals(styleSheet.addRule(), -1);
assert_equals(styleSheet.cssRules.length, 4,
"CSSStyleSheet cssRules attribute after addRule function without arguments");
assert_equals(styleSheet.cssRules[3].cssText,
"undefined { }",
"addRule arguments default to undefined");
},
'addRule with no argument adds "undefined" selector');
test(function() {
assert_throws_dom(
"IndexSizeError", function() {
styleSheet.addRule(
"#foo",
"color: red", styleSheet.cssRules.length + 1);
});
},
'addRule with index greater than length throws');
test(function() {
assert_equals(styleSheet.cssRules, styleSheet.rules);
},
"cssRules and rules are the same object");
test(function() {
assert_equals(styleSheet.cssRules, styleSheet.cssRules);
},
"cssRules returns the same object twice");
test(function() {
assert_equals(styleSheet.rules, styleSheet.rules);
},
"rules returns the same object twice");
</
script>
</
head>
</
html>