| <!DOCTYPE html> |
| <title>CSSOM test: order of declarations 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> |
| <script> |
| function generateCSSDeclBlock(props) { |
| let elem = document.createElement("div"); |
| let cssText = props.map(([prop, value]) => `${prop}: ${value};`).join(" "); |
| elem.setAttribute("style", cssText); |
| return elem.style; |
| } |
| function checkOrder(block, props, msg) { |
| assert_array_equals(Array.from(block), props, `Property order should match ${msg}`); |
| } |
| function arrayWithItemsAtEnd(array, items) { |
| let result = array.filter(item => !items.includes(item)); |
| return result.concat(items); |
| } |
| |
| const SUBPROPS = { |
| "margin": ["margin-top", "margin-right", "margin-bottom", "margin-left"], |
| "padding": ["padding-top", "padding-right", "padding-bottom", "padding-left"], |
| }; |
| |
| test(function() { |
| let block = generateCSSDeclBlock([ |
| ["top", "1px"], |
| ["bottom", "2px"], |
| ["left", "3px"], |
| ["right", "4px"], |
| ]); |
| let expectedOrder = ["top", "bottom", "left", "right"]; |
| checkOrder(block, expectedOrder, "in initial block"); |
| |
| block.setProperty("top", "5px"); |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["top"]); |
| checkOrder(block, expectedOrder, "after setting existing property"); |
| |
| block.setProperty("bottom", "2px"); |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["bottom"]); |
| checkOrder(block, expectedOrder, "after setting existing property with identical value"); |
| }, "setProperty with existing longhand should change order"); |
| |
| test(function() { |
| let block = generateCSSDeclBlock([ |
| ["top", "1px"], |
| ["bottom", "2px"], |
| ["left", "3px"], |
| ["right", "4px"], |
| ]); |
| let expectedOrder = ["top", "bottom", "left", "right"]; |
| checkOrder(block, expectedOrder, "in initial block"); |
| |
| block.top = "5px"; |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["top"]); |
| checkOrder(block, expectedOrder, "after setting existing property"); |
| |
| block.bottom = "2px"; |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["bottom"]); |
| checkOrder(block, expectedOrder, "after setting existing property with identical value"); |
| }, "invoke property setter with existing longhand should change order"); |
| |
| test(function() { |
| let block = generateCSSDeclBlock([ |
| ["margin", "1px"], |
| ["top", "2px"], |
| ["padding", "3px"], |
| ]); |
| let expectedOrder = SUBPROPS["margin"].concat(["top"]).concat(SUBPROPS["padding"]); |
| checkOrder(block, expectedOrder, "in initial block"); |
| |
| block.setProperty("margin", "4px"); |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, SUBPROPS["margin"]); |
| checkOrder(block, expectedOrder, "after setting an existing shorthand"); |
| |
| block.setProperty("padding", "3px"); |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, SUBPROPS["padding"]); |
| checkOrder(block, expectedOrder, "after setting an existing shorthand with identical value"); |
| |
| block.setProperty("margin-bottom", "5px"); |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["margin-bottom"]); |
| checkOrder(block, expectedOrder, "after setting a longhand in an existing shorthand"); |
| }, "setProperty with existing shorthand should change order"); |
| |
| test(function() { |
| let block = generateCSSDeclBlock([ |
| ["margin", "1px"], |
| ["top", "2px"], |
| ["padding", "3px"], |
| ]); |
| let expectedOrder = SUBPROPS["margin"].concat(["top"]).concat(SUBPROPS["padding"]); |
| checkOrder(block, expectedOrder, "in initial block"); |
| |
| block.margin = "4px"; |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, SUBPROPS["margin"]); |
| checkOrder(block, expectedOrder, "after setting an existing shorthand"); |
| |
| block.padding = "3px"; |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, SUBPROPS["padding"]); |
| checkOrder(block, expectedOrder, "after setting an existing shorthand with identical value"); |
| |
| block.marginBottom = "5px"; |
| expectedOrder = arrayWithItemsAtEnd(expectedOrder, ["margin-bottom"]); |
| checkOrder(block, expectedOrder, "after setting a longhand in an existing shorthand"); |
| }, "invoke property setter with existing shorthand should change order"); |
| </script> |