blob: 702b38fef061c497f25fd095da9b5280f2d8959f [file] [log] [blame]
<!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>