| <!DOCTYPE html> | 
 | <title>CSSOM test: declaration block after setting via CSSOM</title> | 
 | <link rel="help" href="https://drafts.csswg.org/cssom/#set-a-css-declaration-value"> | 
 | <script src="/resources/testharness.js"></script> | 
 | <script src="/resources/testharnessreport.js"></script> | 
 | <div id="log"></div> | 
 | <div id="test"></div> | 
 | <script> | 
 |   test(function() { | 
 |     const PHYSICAL_PROPS = ["padding-top", "padding-right", | 
 |                             "padding-bottom", "padding-left"]; | 
 |     const LOGICAL_PROPS = ["padding-block-start", "padding-block-end", | 
 |                            "padding-inline-start", "padding-inline-end"]; | 
 |     let elem = document.getElementById("test"); | 
 |     let decls = new Map; | 
 |  | 
 |     { | 
 |       let css = [] | 
 |       let i = 0; | 
 |       for (let name of [...PHYSICAL_PROPS, ...LOGICAL_PROPS]) { | 
 |         let value = `${i++}px`; | 
 |         css.push(`${name}: ${value};`); | 
 |         decls.set(name, value); | 
 |       } | 
 |       elem.setAttribute("style", css.join(" ")); | 
 |     } | 
 |  | 
 |     let style = elem.style; | 
 |     function indexOfProperty(prop) { | 
 |       return Array.prototype.indexOf.apply(style, [prop]); | 
 |     } | 
 |     function assertPropAfterProps(prop, props, msg) { | 
 |       let index = indexOfProperty(prop); | 
 |       for (let p of props) { | 
 |         assert_less_than(indexOfProperty(p), index, `${prop} should be after ${p} ${msg}`); | 
 |       } | 
 |     } | 
 |     // We are not changing any value in this test, just order. | 
 |     function assertValueUnchanged() { | 
 |       for (let [name, value] of decls.entries()) { | 
 |         assert_equals(style.getPropertyValue(name), value, | 
 |                       `value of ${name} shouldn't be changed`); | 
 |       } | 
 |     } | 
 |  | 
 |     assertValueUnchanged(); | 
 |     // Check that logical properties are all after physical properties | 
 |     // at the beginning. | 
 |     for (let p of LOGICAL_PROPS) { | 
 |       assertPropAfterProps(p, PHYSICAL_PROPS, "initially"); | 
 |     } | 
 |  | 
 |     // Try setting a longhand. | 
 |     style.setProperty("padding-top", "0px"); | 
 |     assertValueUnchanged(); | 
 |     // Check that padding-top is after logical properties, but other | 
 |     // physical properties are still before logical properties. | 
 |     assertPropAfterProps("padding-top", LOGICAL_PROPS, "after setting padding-top"); | 
 |     for (let p of LOGICAL_PROPS) { | 
 |       assertPropAfterProps(p, PHYSICAL_PROPS.filter(prop => prop != "padding-top"), | 
 |                            "after setting padding-top"); | 
 |     } | 
 |  | 
 |     // Try setting a shorthand. | 
 |     style.setProperty("padding", "0px 1px 2px 3px"); | 
 |     assertValueUnchanged(); | 
 |     // Check that all physical properties are now after logical properties. | 
 |     for (let p of PHYSICAL_PROPS) { | 
 |       assertPropAfterProps(p, LOGICAL_PROPS, "after setting padding shorthand"); | 
 |     } | 
 |   }, "newly set declaration should be after all declarations " + | 
 |   "in the same logical property group but have different logical kind"); | 
 | </script> |