| <!DOCTYPE HTML> |
| <html lang=en> |
| <title>CSSGroupingRule Conditional Rules Test</title> |
| <link rel="author" title="L. David Baron" href="https://dbaron.org/"> |
| <link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> |
| <link rel="author" title="Mozilla Corporation" href="http://mozilla.com/" /> |
| <link rel="help" href="http://www.w3.org/TR/css3-conditional/#the-cssgroupingrule-interface"> |
| <meta name="assert" content="requirements in definition of insertRule"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| |
| <style id="style"> |
| @media unsupported { /* tests need to work even if condition is false */ } |
| @supports (unsupported: value) { } |
| </style> |
| <div id=log></div> |
| <div id="test"></div> |
| <script> |
| |
| var rules = document.getElementById("style").sheet.cssRules; |
| var rule_names = ["@media", "@supports"]; |
| var rule_types = [CSSRule.MEDIA_RULE, CSSRule.SUPPORTS_RULE] |
| var rule_nums = [4, 12] |
| |
| for (let i = 0; i < 2; i++) { |
| var grouping_rule = rules[i]; |
| var rule_name = rule_names[i]; |
| |
| test(function() { |
| assert_true(grouping_rule instanceof CSSGroupingRule, |
| rule_name + " instanceof CSSGroupingRule"); |
| }, |
| rule_name + " is CSSGroupingRule"); |
| |
| test(function() { |
| assert_equals(grouping_rule.type, rule_types[i], |
| "Rule type of " + rule_name + " rule"); |
| assert_equals(grouping_rule.type, rule_nums[i], |
| "Rule number of " + rule_name + " rule"); |
| }, |
| rule_name + " rule type"); |
| |
| test(function() { |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Starting cssRules.length of " + rule_name + " rule"); |
| }, |
| "Empty " + rule_name + " rule length"); |
| |
| test(function() { |
| assert_throws_dom("HIERARCHY_REQUEST_ERR", |
| function() { |
| grouping_rule.insertRule("@import url(foo.css);", 0); |
| }, |
| "inserting a disallowed rule should throw HIERARCHY_REQUEST_ERR"); |
| }, |
| "insertRule of @import into " + rule_name); |
| |
| test(function() { |
| assert_throws_dom("INDEX_SIZE_ERR", |
| function() { |
| grouping_rule.insertRule("p { color: green }", 1); |
| }, |
| "inserting at a bad index throws INDEX_SIZE_ERR"); |
| }, |
| "insertRule into empty " + rule_name + " at bad index"); |
| |
| test(function() { |
| grouping_rule.insertRule("p { color: green }", 0); |
| assert_equals(grouping_rule.cssRules.length, 1, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| grouping_rule.insertRule("p { color: blue }", 1); |
| assert_equals(grouping_rule.cssRules.length, 2, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| grouping_rule.insertRule("p { color: aqua }", 1); |
| assert_equals(grouping_rule.cssRules.length, 3, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| assert_throws_dom("INDEX_SIZE_ERR", |
| function() { |
| grouping_rule.insertRule("p { color: green }", 4); |
| }, |
| "inserting at a bad index throws INDEX_SIZE_ERR"); |
| assert_equals(grouping_rule.cssRules.length, 3, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule into " + rule_name + " updates length"); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| grouping_rule.insertRule("@media print {}", 0); |
| assert_equals(grouping_rule.cssRules.length, 1, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| assert_equals(grouping_rule.cssRules[0].type, CSSRule.MEDIA_RULE, |
| "inserting syntactically correct media rule succeeds"); |
| }, |
| "insertRule of valid @media into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| grouping_rule.insertRule("p { color: yellow }", 0); |
| assert_equals(grouping_rule.cssRules.length, 1, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| assert_equals(grouping_rule.cssRules[0].type, CSSRule.STYLE_RULE, |
| "inserting syntactically correct style rule succeeds"); |
| }, |
| "insertRule of valid style rule into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("@media bad syntax;", 0); |
| }, |
| "inserting syntactically invalid rule throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of invalid @media into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("", 0); |
| }, |
| "inserting empty rule throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of empty string into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("@media print {} foo", 0); |
| }, |
| "inserting rule with garbage afterwards throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of valid @media rule followed by garbage into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("p { color: yellow } foo", 0); |
| }, |
| "inserting rule with garbage afterwards throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of valid style rule followed by garbage into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("@media print {} @media print {}", 0); |
| }, |
| "inserting multiple rules throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of mutiple valid @media into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("p { color: yellow } @media print {}", 0); |
| }, |
| "inserting multiple rules throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of valid style rulle followed by valid @media into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("@media print {} p { color: yellow }", 0); |
| }, |
| "inserting multiple rules throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of valid style rule followed by valid @media into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| assert_throws_dom("SYNTAX_ERR", |
| function() { |
| grouping_rule.insertRule("p { color: yellow } p { color: yellow }", 0); |
| }, |
| "inserting multiple rules throws syntax error"); |
| assert_equals(grouping_rule.cssRules.length, 0, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "insertRule of two valid style rules into " + rule_name); |
| |
| test(function() { |
| while (grouping_rule.cssRules.length > 0) { |
| grouping_rule.deleteRule(0); |
| } |
| var res = grouping_rule.insertRule("p { color: green }", 0); |
| assert_equals(res, 0, "return value should be index"); |
| assert_equals(grouping_rule.cssRules.length, 1, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| res = grouping_rule.insertRule("p { color: green }", 0); |
| assert_equals(res, 0, "return value should be index"); |
| assert_equals(grouping_rule.cssRules.length, 2, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| res = grouping_rule.insertRule("p { color: green }", 2); |
| assert_equals(res, 2, "return value should be index"); |
| assert_equals(grouping_rule.cssRules.length, 3, |
| "Modified cssRules.length of " + rule_name + " rule"); |
| }, |
| "Return value of insertRule into " + rule_name); |
| } |
| </script> |
| </body> |
| </html> |