LibWeb: Parse the position-area property

This commit is contained in:
Tim Ledbetter 2025-09-28 23:10:51 +01:00 committed by Jelle Raaijmakers
parent 12bb266bf2
commit eb571a1a46
Notes: github-actions[bot] 2025-09-29 07:54:33 +00:00
12 changed files with 2733 additions and 0 deletions

View file

@ -234,6 +234,7 @@ All properties associated with getComputedStyle(document.body):
"padding-right",
"padding-top",
"position",
"position-area",
"r",
"right",
"rotate",

View file

@ -630,6 +630,8 @@ All supported properties and their default values exposed from CSSStylePropertie
'pointerEvents': 'auto'
'pointer-events': 'auto'
'position': 'static'
'positionArea': 'none'
'position-area': 'none'
'quotes': 'auto'
'r': '0px'
'right': 'auto'

View file

@ -232,6 +232,7 @@ padding-left: 0px
padding-right: 0px
padding-top: 0px
position: static
position-area: none
r: 0px
right: auto
rotate: none

View file

@ -0,0 +1,47 @@
Harness status: OK
Found 42 tests
42 Pass
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (-0.3) should be [none]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (0) should be [none]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (0.3) should be [none]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass CSS Transitions with transition-behavior:allow-discrete: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (-0.3) should be [none]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (0) should be [none]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (0.3) should be [none]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass CSS Transitions with transition-property:all and transition-behavor:allow-discrete: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (-0.3) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (0) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (0.3) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass CSS Transitions: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (-0.3) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (0) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (0.3) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass CSS Transitions with transition: all: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (-0.3) should be [none]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (0) should be [none]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (0.3) should be [none]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass CSS Animations: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (-0.3) should be [none]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (0) should be [none]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (0.3) should be [none]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (0.5) should be [span-all left]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (0.6) should be [span-all left]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (1) should be [span-all left]
Pass Web Animations: property <position-area> from [none] to [span-all left] at (1.5) should be [span-all left]

View file

@ -0,0 +1,14 @@
<!DOCTYPE html>
<title>CSS Anchor Positioning: position-area interpolation</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position/#position-area">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../css/support/interpolation-testcommon.js"></script>
<body>
<script>
test_no_interpolation({
property: "position-area",
from: "none",
to: "span-all left"
});
</script>

View file

@ -0,0 +1,180 @@
<!DOCTYPE html>
<title>CSS Anchor Positioning: position-area parsing</title>
<link rel="help" href="https://drafts.csswg.org/css-anchor-position/#position-area">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../css/support/parsing-testcommon.js"></script>
<body>
<script>
function test_valid_single_position_area_values(valid_keywords) {
for (const keyword of valid_keywords) {
test_valid_value("position-area", keyword);
}
};
function test_valid_position_area_value_pairs(valid_keywords1,
valid_keywords2,
flip_order) {
for (const keyword1 of valid_keywords1) {
for (const keyword2 of valid_keywords2) {
if (keyword1 === keyword2) {
test_valid_value("position-area", keyword1 + " " + keyword2, keyword1);
} else {
test_valid_value("position-area", keyword1 + " " + keyword2,
flip_order ? keyword2 + " " + keyword1 : keyword1 + " " + keyword2);
}
}
}
};
function test_valid_position_area_value_pairs_with_span_all_center(
valid_keywords, flip_order) {
for (const keyword of valid_keywords) {
test_valid_value("position-area", keyword + " center",
flip_order ? "center " + keyword : keyword + " center");
test_valid_value("position-area", "center " + keyword,
flip_order ? "center " + keyword : keyword + " center");
test_valid_value("position-area", keyword + " span-all", keyword);
test_valid_value("position-area", "span-all " + keyword, keyword);
}
};
function test_valid_position_area_value_start_end_pairs_with_span_all_center(
valid_keywords) {
for (const keyword of valid_keywords) {
test_valid_value("position-area", keyword + " center");
test_valid_value("position-area", "center " + keyword);
test_valid_value("position-area", keyword + " span-all");
test_valid_value("position-area", "span-all " + keyword);
}
}
function test_invalid_position_area_value_pairs(valid_keywords1,
valid_keywords2) {
for (const keyword1 of valid_keywords1) {
for (const keyword2 of valid_keywords2) {
test_invalid_value("position-area", keyword1 + " " + keyword2);
test_invalid_value("position-area", keyword2 + " " + keyword1);
}
}
};
function test_invalid_position_area_value_equal_pairs(valid_keywords) {
for (const keyword of valid_keywords) {
test_invalid_value("position-area", keyword + " " + keyword);
}
};
const horizontal = [ "left", "right", "span-left", "span-right", "x-start",
"x-end", "span-x-start", "span-x-end", "x-self-start",
"x-self-end", "span-x-self-start", "span-x-self-end" ];
const vertical = [ "top", "bottom", "span-top", "span-bottom", "y-start",
"y-end", "span-y-start", "span-y-end", "y-self-start",
"y-self-end", "span-y-self-start", "span-y-self-end" ];
const inline = [ "inline-start", "inline-end", "span-inline-start",
"span-inline-end" ];
const block = [ "block-start", "block-end", "span-block-start",
"span-block-end" ];
const self_inline = [ "self-inline-start", "self-inline-end",
"span-self-inline-start", "span-self-inline-end" ];
const self_block = [ "self-block-start", "self-block-end",
"span-self-block-start", "span-self-block-end" ];
const start_end = [ "start", "end", "span-start", "span-end" ];
const self_start_end = [ "self-start", "self-end", "span-self-start",
"span-self-end" ];
// Test initial value 'none'
test_valid_value("position-area", "none");
test_invalid_value("position-area", "none none");
test_invalid_value("position-area", "start none");
test_invalid_value("position-area", "none start");
test_invalid_value("position-area", "top left top");
// Test keywords allowed in all axes
test_valid_value("position-area", "center");
test_valid_value("position-area", "center center", "center")
test_valid_value("position-area", "span-all");
test_valid_value("position-area", "span-all span-all", "span-all");
test_valid_value("position-area", "center span-all");
test_valid_value("position-area", "span-all center");
test_valid_single_position_area_values(horizontal);
test_valid_single_position_area_values(vertical);
test_valid_single_position_area_values(inline);
test_valid_single_position_area_values(block);
test_valid_single_position_area_values(self_inline);
test_valid_single_position_area_values(self_block);
test_valid_single_position_area_values(start_end);
test_valid_single_position_area_values(self_start_end);
// Used if the sets of valid keywords are serialized in a different order than
// the argument order
const flip_order = true;
// Test all valid combinations in both orders
test_valid_position_area_value_pairs(horizontal, vertical);
test_valid_position_area_value_pairs(vertical, horizontal, flip_order);
test_valid_position_area_value_pairs(block, inline);
test_valid_position_area_value_pairs(inline, block, flip_order);
test_valid_position_area_value_pairs(self_block, self_inline);
test_valid_position_area_value_pairs(self_inline, self_block, flip_order);
test_valid_position_area_value_pairs(start_end, start_end);
test_valid_position_area_value_pairs(self_start_end, self_start_end);
// Test all valid combinations with 'span-all' and 'center' in both orders
test_valid_position_area_value_pairs_with_span_all_center(horizontal);
test_valid_position_area_value_pairs_with_span_all_center(vertical, flip_order);
test_valid_position_area_value_pairs_with_span_all_center(block);
test_valid_position_area_value_pairs_with_span_all_center(inline, flip_order);
test_valid_position_area_value_pairs_with_span_all_center(self_block);
test_valid_position_area_value_pairs_with_span_all_center(self_inline, flip_order);
test_valid_position_area_value_start_end_pairs_with_span_all_center(start_end);
test_valid_position_area_value_start_end_pairs_with_span_all_center(self_start_end);
// Test all invalid combinations with incompatible axes in both orders
test_invalid_position_area_value_pairs(horizontal, inline);
test_invalid_position_area_value_pairs(horizontal, block);
test_invalid_position_area_value_pairs(horizontal, self_inline);
test_invalid_position_area_value_pairs(horizontal, self_block);
test_invalid_position_area_value_pairs(horizontal, start_end);
test_invalid_position_area_value_pairs(horizontal, self_start_end);
test_invalid_position_area_value_pairs(vertical, inline);
test_invalid_position_area_value_pairs(vertical, block);
test_invalid_position_area_value_pairs(vertical, self_inline);
test_invalid_position_area_value_pairs(vertical, self_block);
test_invalid_position_area_value_pairs(vertical, start_end);
test_invalid_position_area_value_pairs(vertical, self_start_end);
test_invalid_position_area_value_pairs(inline, self_inline);
test_invalid_position_area_value_pairs(inline, self_block);
test_invalid_position_area_value_pairs(inline, start_end);
test_invalid_position_area_value_pairs(inline, self_start_end);
test_invalid_position_area_value_pairs(block, self_inline);
test_invalid_position_area_value_pairs(block, self_block);
test_invalid_position_area_value_pairs(block, start_end);
test_invalid_position_area_value_pairs(block, self_start_end);
test_invalid_position_area_value_pairs(start_end, self_start_end);
// Test all invalid combinations of same axis
test_invalid_position_area_value_equal_pairs(horizontal);
test_invalid_position_area_value_equal_pairs(vertical);
test_invalid_position_area_value_equal_pairs(inline);
test_invalid_position_area_value_equal_pairs(block);
test_invalid_position_area_value_equal_pairs(self_inline);
test_invalid_position_area_value_equal_pairs(self_block);
// Test one invalid keyword
test_invalid_value("position-area", "foobar");
test_invalid_value("position-area", "visible");
test_invalid_value("position-area", "hidden");
// Test one valid and one invalid keyword
test_invalid_value("position-area", "start foobar");
test_invalid_value("position-area", "end visible");
test_invalid_value("position-area", "block-start hidden");
test_invalid_value("position-area", "hidden inline-end");
// Test two invalid keywords
test_invalid_value("position-area", "foo bar");
test_invalid_value("position-area", "visible hidden");
test_invalid_value("position-area", "hidden visible");
</script>