mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-04-27 02:05:07 +02:00
LibWeb: Account for logical property groups in set_a_declaration
When setting a declaration for a property in a logical property group, it should appear after all other declarations which belong to the same property group but have different mapping logic (are/aren't a logical alias). Gains us 1 WPT pass.
This commit is contained in:
Notes:
github-actions[bot]
2025-07-16 10:18:03 +00:00
Author: https://github.com/Calme1709 Commit: https://github.com/LadybirdBrowser/ladybird/commit/1d3e539c092 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5424 Reviewed-by: https://github.com/AtkinsSJ ✅
@@ -0,0 +1,73 @@
|
||||
<!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>
|
||||
Reference in New Issue
Block a user