<!DOCTYPE html>
<html>
 <head>
  <title>CSS Test: Inline CSSStyleDeclaration</title>
  <link rel="author" title="Bear Travis" href="mailto:betravis@adobe.com">
  <link rel="help" href="http://www.w3.org/TR/cssom-1/#elementcssinlinestyle">
  <meta name="flags" content="dom">
  <meta name="assert" content="Inline CSSStyleDeclaration is properly initialized and can be modified through its interface">
  <script src="/resources/testharness.js" type="text/javascript"></script>
  <script src="/resources/testharnessreport.js" type="text/javascript"></script>
 </head>
 <body>
 <noscript>Test not run - javascript required.</noscript>
 <div id="log"></div>
 <div id="test" style="margin-left: 5px;"></div>
 <script type="text/javascript">
    // Can access CSSStyleDeclaration through style property
    test(function() {
        var test = document.getElementById("test");
        assert_idl_attribute(test, "style");
        declaration = test.style;
    }, "CSSStyleDeclaration_accessible");

    // initial property values are correct
    test(function() {
        assert_equals(declaration.cssText, "margin-left: 5px;");
        assert_equals(declaration.getPropertyValue("margin-left"), "5px");
    }, "read");

    // setting cssText adds new properties
    // setting cssText removes existing properties
    // properties set through cssText are reflected in the computed style
    test(function() {
        declaration.cssText = "margin-left: 10px; padding-left: 10px;";
        assert_equals(declaration.cssText, "margin-left: 10px; padding-left: 10px;");
        assert_equals(declaration.length, 2);
        assert_equals(declaration.item(0), "margin-left");
        assert_equals(declaration.item(1), "padding-left");
        assert_equals(declaration.getPropertyValue("margin-left"), "10px");
        assert_equals(declaration.getPropertyValue("padding-left"), "10px");

        var computedStyle = window.getComputedStyle(document.getElementById("test"));
        assert_equals(computedStyle.getPropertyValue("margin-left"), "10px");
        assert_equals(computedStyle.getPropertyValue("padding-left"), "10px");
    }, "csstext_write");

    // setProperty adds new properties
    // properties set through setProperty are reflected in the computed style
    test(function() {
        while(declaration.length > 0)
            declaration.removeProperty(declaration.item(0));
        declaration.setProperty("margin-left", "15px");
        declaration.setProperty("padding-left", "15px");

        assert_equals(declaration.length, 2);
        assert_equals(declaration.item(0), "margin-left");
        assert_equals(declaration.item(1), "padding-left");
        assert_equals(declaration.getPropertyValue("margin-left"), "15px");
        assert_equals(declaration.getPropertyValue("padding-left"), "15px");

        var computedStyle = window.getComputedStyle(document.getElementById("test"));
        assert_equals(computedStyle.getPropertyValue("margin-left"), "15px");
        assert_equals(computedStyle.getPropertyValue("padding-left"), "15px");
    }, "property_write");

    // shorthand property is expanded
    test(function() {
        while(declaration.length > 0)
            declaration.removeProperty(declaration.item(0));
        declaration.cssText = "margin: 20px";
        assert_equals(declaration.getPropertyValue("margin-top"), "20px");
        assert_equals(declaration.getPropertyValue("margin-right"), "20px");
        assert_equals(declaration.getPropertyValue("margin-bottom"), "20px");
        assert_equals(declaration.getPropertyValue("margin-left"), "20px");
    }, "shorthand_properties");
 </script>
 </body>
</html>
