<!DOCTYPE HTML>
<html>
<head>
<script src="../../../../resources/js-test-pre.js"></script>
</head>
<body>
  <div class="p"></div>
  <script type="text/javascript">
    function testInkIsValid(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "1");
      shouldBeEqualToString("declaration.getPropertyValue('-webkit-text-decoration-skip')", "ink");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "ink");
      stylesheet.deleteRule(0);
    }

    function testObjectsIsValid(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "1");
      shouldBeEqualToString("declaration.getPropertyValue('-webkit-text-decoration-skip')", "objects");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "objects");
      stylesheet.deleteRule(0);
    }

    function testEmptyIsObjects(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "0");
      shouldBeEqualToString("declaration.getPropertyValue('-webkit-text-decoration-skip')", "");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "auto");
      stylesheet.deleteRule(0);
    }

    function testInitialIsAuto(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "1");
      shouldBeEqualToString("declaration.getPropertyValue('-webkit-text-decoration-skip')",  "initial");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "auto");
      stylesheet.deleteRule(0);
    }

    function testInvalidRule(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "0");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "auto");
      stylesheet.deleteRule(0);
    }

    function testNoneIsValid(stylesheet, target) {
      cssRule = stylesheet.cssRules.item(0);
      shouldBe("cssRule.type", "cssRule.STYLE_RULE");
      declaration = cssRule.style;
      shouldBe("declaration.length", "1");
      shouldBeEqualToString("declaration.getPropertyValue('-webkit-text-decoration-skip')", "none");
      computedStyle = window.getComputedStyle(target, null);
      shouldBeEqualToString("computedStyle.getPropertyCSSValue('-webkit-text-decoration-skip').cssText", "none");
      stylesheet.deleteRule(0);
    }

    var styleElement = document.createElement("style");
    document.head.appendChild(styleElement);
    stylesheet = styleElement.sheet;
    var target = document.getElementsByClassName("p")[0];

    stylesheet.insertRule(".p { }", 0);
    testEmptyIsObjects(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: initial; }", 0);
    testInitialIsAuto(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: ink; }", 0);
    testInkIsValid(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: ink ink ink ink ink; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: garbage; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: garbage ink; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: ink garbage; }", 0);
    testInvalidRule(stylesheet, target);
    
    stylesheet.insertRule(".p { -webkit-text-decoration-skip: garbage ink garbage; }", 0);
    testInvalidRule(stylesheet, target);
    
    stylesheet.insertRule(".p { -webkit-text-decoration-skip: ink garbage ink; }", 0);
    testInvalidRule(stylesheet, target);
    
    stylesheet.insertRule(".p { -webkit-text-decoration-skip: objects; }", 0);
    testObjectsIsValid(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: objects objects objects objects objects; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: garbage objects; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: objects garbage; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: garbage objects garbage; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: objects garbage objects; }", 0);
    testInvalidRule(stylesheet, target);

    stylesheet.insertRule(".p { -webkit-text-decoration-skip: none; }", 0);
    testNoneIsValid(stylesheet, target);
    
    stylesheet.insertRule(".p { -webkit-text-decoration-skip: ; }", 0);
    testInvalidRule(stylesheet, target);
  </script>
<script src="../../../../resources/js-test-post.js"></script>
</body>
</html>
