mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-09-25 18:58:56 +00:00
Tests: Import some custom-property tests
To make it easier to track progress and regressions in subsequent changes.
This commit is contained in:
parent
a6ff088984
commit
59f2c8df7a
Notes:
github-actions[bot]
2025-07-09 15:46:45 +00:00
Author: https://github.com/AtkinsSJ
Commit: 59f2c8df7a
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/5226
Reviewed-by: https://github.com/tcl3 ✅
6 changed files with 844 additions and 0 deletions
|
@ -0,0 +1,14 @@
|
|||
Harness status: OK
|
||||
|
||||
Found 8 tests
|
||||
|
||||
3 Pass
|
||||
5 Fail
|
||||
Pass e.style['width'] = "var(--x)" should set the property value
|
||||
Pass e.style['width'] = "var(--x,)" should set the property value
|
||||
Pass e.style['width'] = "var(--x, )" should set the property value
|
||||
Fail e.style['width'] = "var(--x ())" should not set the property value
|
||||
Fail e.style['width'] = "var(--x () )" should not set the property value
|
||||
Fail e.style['width'] = "var(--x() )" should not set the property value
|
||||
Fail e.style['width'] = "var(--x (),)" should not set the property value
|
||||
Fail e.style['width'] = "var(--x(),)" should not set the property value
|
|
@ -0,0 +1,36 @@
|
|||
Harness status: OK
|
||||
|
||||
Found 30 tests
|
||||
|
||||
2 Pass
|
||||
28 Fail
|
||||
Pass `initial` as a value for an unregistered custom property
|
||||
Fail `inherit` as a value for an unregistered custom property
|
||||
Fail `unset` as a value for an unregistered custom property
|
||||
Fail `revert` as a value for an unregistered custom property
|
||||
Fail `revert-layer` as a value for an unregistered custom property
|
||||
Fail `initial` as a value for a non-inheriting registered custom property
|
||||
Fail `initial` as a value for an inheriting registered custom property
|
||||
Fail `inherit` as a value for a non-inheriting registered custom property
|
||||
Fail `inherit` as a value for an inheriting registered custom property
|
||||
Fail `unset` as a value for a non-inheriting registered custom property
|
||||
Fail `unset` as a value for an inheriting registered custom property
|
||||
Fail `revert` as a value for a non-inheriting registered custom property
|
||||
Fail `revert` as a value for an inheriting registered custom property
|
||||
Fail `revert-layer` as a value for a non-inheriting registered custom property
|
||||
Fail `revert-layer` as a value for an inheriting registered custom property
|
||||
Pass `initial` as a `var()` fallback for an unregistered custom property
|
||||
Fail `inherit` as a `var()` fallback for an unregistered custom property
|
||||
Fail `unset` as a `var()` fallback for an unregistered custom property
|
||||
Fail `revert` as a `var()` fallback for an unregistered custom property
|
||||
Fail `revert-layer` as a `var()` fallback for an unregistered custom property
|
||||
Fail `initial` as a `var()` fallback for a non-inheriting registered custom property
|
||||
Fail `initial` as a `var()` fallback for an inheriting registered custom property
|
||||
Fail `inherit` as a `var()` fallback for a non-inheriting registered custom property
|
||||
Fail `inherit` as a `var()` fallback for an inheriting registered custom property
|
||||
Fail `unset` as a `var()` fallback for a non-inheriting registered custom property
|
||||
Fail `unset` as a `var()` fallback for an inheriting registered custom property
|
||||
Fail `revert` as a `var()` fallback for a non-inheriting registered custom property
|
||||
Fail `revert` as a `var()` fallback for an inheriting registered custom property
|
||||
Fail `revert-layer` as a `var()` fallback for a non-inheriting registered custom property
|
||||
Fail `revert-layer` as a `var()` fallback for an inheriting registered custom property
|
|
@ -0,0 +1,17 @@
|
|||
Harness status: OK
|
||||
|
||||
Found 11 tests
|
||||
|
||||
1 Pass
|
||||
10 Fail
|
||||
Fail Self-cycle
|
||||
Fail Simple a/b cycle
|
||||
Fail Three-var cycle
|
||||
Fail Cycle that starts in the middle of a chain
|
||||
Fail Cycle with extra edge
|
||||
Fail Cycle with extra edge (2)
|
||||
Fail Cycle with extra edge (3)
|
||||
Fail Cycle with secondary cycle
|
||||
Fail Cycle with overlapping secondary cycle
|
||||
Fail Cycle with deeper secondary cycle
|
||||
Pass Cycle in unused fallback
|
|
@ -0,0 +1,21 @@
|
|||
<!DOCTYPE html>
|
||||
<title>CSS Custom Properties: var() parsing</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-variables">
|
||||
<script src="../../resources/testharness.js"></script>
|
||||
<script src="../../resources/testharnessreport.js"></script>
|
||||
<script src="../../css/support/parsing-testcommon.js"></script>
|
||||
<div id="target"></div>
|
||||
|
||||
<script>
|
||||
|
||||
test_valid_value('width', 'var(--x)');
|
||||
test_valid_value('width', 'var(--x,)');
|
||||
test_valid_value('width', 'var(--x, )');
|
||||
|
||||
test_invalid_value('width', 'var(--x ())');
|
||||
test_invalid_value('width', 'var(--x () )');
|
||||
test_invalid_value('width', 'var(--x() )');
|
||||
test_invalid_value('width', 'var(--x (),)');
|
||||
test_invalid_value('width', 'var(--x(),)');
|
||||
|
||||
</script>
|
|
@ -0,0 +1,331 @@
|
|||
<!DOCTYPE html>
|
||||
<head>
|
||||
<title>CSS Custom Properties: Using CSS-wide keywords</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-variables/#defining-variables">
|
||||
<meta name="assert" content="The CSS-wide keywords can be used in custom properties, with the same meaning as in any another property." />
|
||||
<script src="../../resources/testharness.js"></script>
|
||||
<script src="../../resources/testharnessreport.js"></script>
|
||||
<style>
|
||||
body {
|
||||
--is-initial: initial;
|
||||
|
||||
--should-not-inherit: tomato;
|
||||
--should-inherit: lightgreen;
|
||||
|
||||
--registered-inherits-should-not-inherit: tomato;
|
||||
--registered-should-not-inherit: tomato;
|
||||
--registered-inherits-should-inherit: lightgreen;
|
||||
--registered-should-inherit: lightgreen;
|
||||
--registered-should-revert: tomato;
|
||||
--registered-inherits-should-revert: tomato;
|
||||
}
|
||||
@property --registered-inherits-should-not-inherit {
|
||||
syntax: '<color>';
|
||||
initial-value: lightgreen;
|
||||
inherits: true;
|
||||
}
|
||||
@property --registered-should-not-inherit {
|
||||
syntax: '<color>';
|
||||
initial-value: lightgreen;
|
||||
inherits: false;
|
||||
}
|
||||
@property --registered-inherits-should-inherit {
|
||||
syntax: '<color>';
|
||||
initial-value: tomato;
|
||||
inherits: true;
|
||||
}
|
||||
@property --registered-should-inherit {
|
||||
syntax: '<color>';
|
||||
initial-value: tomato;
|
||||
inherits: false;
|
||||
}
|
||||
@property --registered-should-revert {
|
||||
syntax: '<color>';
|
||||
initial-value: orange;
|
||||
inherits: false;
|
||||
}
|
||||
@property --registered-inherits-should-revert {
|
||||
syntax: '<color>';
|
||||
initial-value: orange;
|
||||
inherits: true;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Tests for values of unregistered custom properties -->
|
||||
<div class="test" style="
|
||||
background: var(--should-not-inherit, lightgreen);
|
||||
--should-not-inherit: initial;
|
||||
">
|
||||
`initial` as a value for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: inherit;
|
||||
">
|
||||
`inherit` as a value for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: unset;
|
||||
">
|
||||
`unset` as a value for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: revert;
|
||||
">
|
||||
`revert` as a value for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#regular-revert-layer {
|
||||
@layer {
|
||||
--should-not-inherit: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--should-not-inherit: revert-layer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="regular-revert-layer" style="
|
||||
background: var(--should-not-inherit);
|
||||
">
|
||||
`revert-layer` as a value for an unregistered custom property
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Tests for values of registered custom properties -->
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: initial;
|
||||
">
|
||||
`initial` as a value for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-not-inherit);
|
||||
--registered-inherits-should-not-inherit: initial;
|
||||
">
|
||||
`initial` as a value for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-inherit);
|
||||
--registered-should-inherit: inherit;
|
||||
">
|
||||
`inherit` as a value for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: inherit;
|
||||
">
|
||||
`inherit` as a value for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: unset;
|
||||
">
|
||||
`unset` as a value for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: unset;
|
||||
">
|
||||
`unset` as a value for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: revert;
|
||||
">
|
||||
`revert` as a value for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: revert;
|
||||
">
|
||||
`revert` as a value for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#registered-revert-layer {
|
||||
@layer {
|
||||
--registered-should-revert: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--registered-should-revert: revert-layer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="registered-revert-layer" style="
|
||||
background: var(--registered-should-revert);
|
||||
">
|
||||
`revert-layer` as a value for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#registered-revert-layer-inherits {
|
||||
@layer {
|
||||
--registered-inherits-should-revert: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--registered-inherits-should-revert: revert-layer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="registered-revert-layer-inherits" style="
|
||||
background: var(--registered-inherits-should-revert);
|
||||
">
|
||||
`revert-layer` as a value for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Tests for `var()` fallbacks of unregistered custom properties -->
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-not-inherit, lightgreen);
|
||||
--should-not-inherit: var(--is-initial, initial);
|
||||
">
|
||||
`initial` as a `var()` fallback for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: var(--is-initial, inherit);
|
||||
">
|
||||
`inherit` as a `var()` fallback for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: var(--is-initial, unset);
|
||||
">
|
||||
`unset` as a `var()` fallback for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--should-inherit, tomato);
|
||||
--should-inherit: var(--is-initial, unset);
|
||||
">
|
||||
`revert` as a `var()` fallback for an unregistered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#regular-fallback-revert-layer {
|
||||
@layer {
|
||||
--should-not-inherit: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--should-not-inherit: var(--is-initial, revert-layer);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="regular-fallback-revert-layer" style="
|
||||
background: var(--should-not-inherit);
|
||||
">
|
||||
`revert-layer` as a `var()` fallback for an unregistered custom property
|
||||
</div>
|
||||
|
||||
|
||||
<!-- Tests for `var()` fallbacks of registered custom properties -->
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: var(--is-initial, initial);
|
||||
">
|
||||
`initial` as a `var()` fallback for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-not-inherit);
|
||||
--registered-inherits-should-not-inherit: var(--is-initial, initial);
|
||||
">
|
||||
`initial` as a `var()` fallback for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-inherit);
|
||||
--registered-should-inherit: var(--is-initial, inherit);
|
||||
">
|
||||
`inherit` as a `var()` fallback for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: var(--is-initial, inherit);
|
||||
">
|
||||
`inherit` as a `var()` fallback for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: var(--is-initial, unset);
|
||||
">
|
||||
`unset` as a `var()` fallback for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: var(--is-initial, unset);
|
||||
">
|
||||
`unset` as a `var()` fallback for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-should-not-inherit);
|
||||
--registered-should-not-inherit: var(--is-initial, revert);
|
||||
">
|
||||
`revert` as a `var()` fallback for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<div class="test" style="
|
||||
background: var(--registered-inherits-should-inherit);
|
||||
--registered-inherits-should-inherit: var(--is-initial, revert);
|
||||
">
|
||||
`revert` as a `var()` fallback for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#registered-fallback-revert-layer {
|
||||
@layer {
|
||||
--registered-should-revert: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--registered-should-revert: var(--is-initial, revert-layer);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="registered-fallback-revert-layer" style="
|
||||
background: var(--registered-should-revert);
|
||||
">
|
||||
`revert-layer` as a `var()` fallback for a non-inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<style>
|
||||
#registered-fallback-revert-layer-inherits {
|
||||
@layer {
|
||||
--registered-inherits-should-revert: lightgreen;
|
||||
}
|
||||
@layer {
|
||||
--registered-inherits-should-revert: var(--is-initial, revert-layer);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<div class="test" id="registered-fallback-revert-layer-inherits" style="
|
||||
background: var(--registered-inherits-should-revert);
|
||||
">
|
||||
`revert-layer` as a `var()` fallback for an inheriting registered custom property
|
||||
</div>
|
||||
|
||||
<pre id="out"></pre>
|
||||
<script>
|
||||
[...document.querySelectorAll('.test')].map(el => test(() => assert_equals(getComputedStyle(el).getPropertyValue('background-color'), 'rgb(144, 238, 144)'), el.textContent.trim()));
|
||||
</script>
|
|
@ -0,0 +1,425 @@
|
|||
<!DOCTYPE html>
|
||||
<meta charset="utf8">
|
||||
<title>Test that custom property cycles behave correctly</title>
|
||||
<link rel="help" href="https://drafts.csswg.org/css-variables/#cycles">
|
||||
<script src="../../resources/testharness.js"></script>
|
||||
<script src="../../resources/testharnessreport.js"></script>
|
||||
<main id=main></main>
|
||||
<script>
|
||||
|
||||
// Test that, for the given list of |declarations|, the computed values
|
||||
// of properties listed in |expected_invalid| are invalid (i.e. empty string),
|
||||
// and the computed values listed in |expected_valid| are *not* invalid
|
||||
// (i.e. not the empty string).
|
||||
function test_cycles(declarations, expected_invalid, expected_valid, description) {
|
||||
test(() => {
|
||||
let element = document.createElement('div');
|
||||
|
||||
try {
|
||||
declarations.push('--sanity:valid');
|
||||
element.style = declarations.join(';');
|
||||
main.append(element);
|
||||
let cs = getComputedStyle(element);
|
||||
|
||||
for (let e of expected_invalid)
|
||||
assert_equals(cs.getPropertyValue(e), '', `${e}`);
|
||||
for (let e of expected_valid)
|
||||
assert_not_equals(cs.getPropertyValue(e), '', `${e}`);
|
||||
|
||||
assert_equals(cs.getPropertyValue('--sanity'), 'valid', '--sanity');
|
||||
|
||||
} finally {
|
||||
element.remove();
|
||||
}
|
||||
}, description);
|
||||
}
|
||||
|
||||
// (Diagrams produced with graph-easy).
|
||||
|
||||
// ┌───┐
|
||||
// │ │ ───┐
|
||||
// │ a │ │
|
||||
// │ │ ◀──┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
['--a:var(--a)'],
|
||||
['--a'],
|
||||
[],
|
||||
'Self-cycle');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ b │ ─┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--a:var(--b)',
|
||||
'--b:var(--a)',
|
||||
],
|
||||
['--a', '--b'],
|
||||
[],
|
||||
'Simple a/b cycle');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ b │ │
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ ─┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle)',
|
||||
'--c:var(--a, cycle)',
|
||||
],
|
||||
['--a', '--b', '--c'],
|
||||
[],
|
||||
'Three-var cycle');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ y │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ b │ │
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ ─┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--y, valid)',
|
||||
'--y:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle)',
|
||||
'--c:var(--a, cycle)',
|
||||
],
|
||||
['--a', '--b', '--c'],
|
||||
['--x', '--y'],
|
||||
'Cycle that starts in the middle of a chain');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ b │ │
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ ─┘
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ y │
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle)',
|
||||
'--c:var(--a, cycle) var(--y)',
|
||||
'--y:valid'
|
||||
],
|
||||
['--a', '--b', '--c'],
|
||||
['--x', '--y'],
|
||||
'Cycle with extra edge');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ ┌───┐ │
|
||||
// │ y │ ◀── │ b │ │
|
||||
// └───┘ └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ ─┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle) var(--y)',
|
||||
'--c:var(--a, cycle)',
|
||||
'--y:valid'
|
||||
],
|
||||
['--a', '--b', '--c'],
|
||||
['--x', '--y'],
|
||||
'Cycle with extra edge (2)');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ b │ │
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ ─┘
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ y │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ z │
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle)',
|
||||
'--c:var(--a, cycle) var(--y)',
|
||||
'--y:var(--z)',
|
||||
'--z:valid'
|
||||
],
|
||||
['--a', '--b', '--c'],
|
||||
['--x', '--y', '--z'],
|
||||
'Cycle with extra edge (3)');
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// ┌▶ │ b │ ─┘
|
||||
// │ └───┘
|
||||
// │ │
|
||||
// │ │
|
||||
// │ ▼
|
||||
// │ ┌───┐
|
||||
// │ │ c │
|
||||
// │ └───┘
|
||||
// │ │
|
||||
// │ │
|
||||
// │ ▼
|
||||
// │ ┌───┐
|
||||
// └─ │ d │
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle) var(--a, cycle)',
|
||||
'--c:var(--d, cycle)',
|
||||
'--d:var(--b, cycle)',
|
||||
],
|
||||
['--a', '--b', '--c', '--d'],
|
||||
['--x'],
|
||||
'Cycle with secondary cycle');
|
||||
|
||||
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ a │ ◀┐
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// ┌▶ │ b │ │
|
||||
// │ └───┘ │
|
||||
// │ │ │
|
||||
// │ │ │
|
||||
// │ ▼ │
|
||||
// │ ┌───┐ │
|
||||
// │ │ c │ ─┘
|
||||
// │ └───┘
|
||||
// │ │
|
||||
// │ │
|
||||
// │ ▼
|
||||
// │ ┌───┐
|
||||
// └─ │ d │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// │ y │
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle)',
|
||||
'--b:var(--c, cycle)',
|
||||
'--c:var(--d, cycle) var(--a, cycle)',
|
||||
'--d:var(--b, cycle) var(--y)',
|
||||
'--y:valid'
|
||||
],
|
||||
['--a', '--b', '--c', '--d'],
|
||||
['--x', '--y'],
|
||||
'Cycle with overlapping secondary cycle');
|
||||
|
||||
|
||||
// ┌──────────────┐
|
||||
// │ │
|
||||
// │ ┌───┐ │
|
||||
// │ │ x │ │
|
||||
// │ └───┘ │
|
||||
// │ │ │
|
||||
// │ │ │
|
||||
// │ ▼ ▼
|
||||
// ┌───┐ ┌────────┐ ┌───┐
|
||||
// │ b │ ◀── │ a │ ──▶ │ y │
|
||||
// └───┘ └────────┘ └───┘
|
||||
// │ ▲
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ c │ │
|
||||
// └───┘ │
|
||||
// │ │
|
||||
// │ │
|
||||
// ▼ │
|
||||
// ┌───┐ │
|
||||
// │ d │ ─┘
|
||||
// └───┘
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--b, cycle) var(--y, valid) var(--c, cycle)',
|
||||
'--b:var(--a, cycle) ',
|
||||
'--c:var(--d, cycle)',
|
||||
'--d:var(--a, cycle)',
|
||||
'--y:valid',
|
||||
],
|
||||
['--a', '--b', '--c', '--d'],
|
||||
['--x', '--y'],
|
||||
'Cycle with deeper secondary cycle');
|
||||
|
||||
|
||||
// If we cared about cycles in unused fallbacks,
|
||||
// then --a/--b/--c would be in a cycle in this case:
|
||||
//
|
||||
// ┌───┐
|
||||
// │ x │
|
||||
// └───┘
|
||||
// │
|
||||
// │
|
||||
// ▼
|
||||
// ┌───┐
|
||||
// ┌─────▶ │ a │ ─┐
|
||||
// │ └───┘ │
|
||||
// │ │ │
|
||||
// │ │ │
|
||||
// │ ▼ │
|
||||
// │ ┌───┐ │
|
||||
// │ ┌─ │ b │ │
|
||||
// │ │ └───┘ │
|
||||
// │ │ │ │
|
||||
// │ │ │ │
|
||||
// │ │ ▼ │
|
||||
// │ │ ┌───┐ │
|
||||
// └────┼─ │ c │ │
|
||||
// │ └───┘ │
|
||||
// │ │ │
|
||||
// │ │ │
|
||||
// │ ▼ │
|
||||
// │ ┌───┐ │
|
||||
// └▶ │ y │ ◀┘
|
||||
// └───┘
|
||||
//
|
||||
// However, as of https://github.com/w3c/csswg-drafts/issues/11500,
|
||||
// we no longer care about such cycles.
|
||||
test_cycles(
|
||||
[
|
||||
'--x:var(--a, valid)',
|
||||
'--a:var(--y, var(--b, cycle))',
|
||||
'--b:var(--y, var(--c, cycle))',
|
||||
'--c:var(--y, var(--a, cycle))',
|
||||
'--y:valid'
|
||||
],
|
||||
[], // Nothing is invalid.
|
||||
['--a', '--b', '--c', '--x', '--y'],
|
||||
'Cycle in unused fallback');
|
||||
|
||||
</script>
|
Loading…
Add table
Add a link
Reference in a new issue