<!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>
