gecko-dev/testing/web-platform/tests/css/css-properties-values-api/determine-registration.html
Anders Hartvoll Ruud 7487c399d3 Bug 1632168 [wpt PR 23167] - [@property] Improve test coverage for valid/invalid rules, a=testonly
Automatic update from web-platform-tests
[@property] Improve test coverage for valid/invalid rules

This adds new tests that verify that invalid rules are ignored,
and don't affect other valid rules.

I also rewrote this test file to use utils.js more liberally. It makes
individual tests harder to understand for the uninitiated, but it
scales so much better as the number of test functions increases.

Bug: 973830
Change-Id: Ie19d85042a0475180cc4bbee4ad202ea08adba73
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2161005
Commit-Queue: Anders Hartvoll Ruud <andruud@chromium.org>
Reviewed-by: Ian Kilpatrick <ikilpatrick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#761969}

--

wpt-commits: 594e55b48c52c20ab5806b9e60b8cfcc742c5ae6
wpt-pr: 23167
2020-04-28 11:41:10 +00:00

232 lines
5.9 KiB
HTML

<!DOCTYPE html>
<link rel="help" href="https://drafts.css-houdini.org/css-properties-values-api-1/#determining-registration">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="./resources/utils.js"></script>
<div id=outer>
<div id=div></div>
</div>
<script>
test_with_at_property({
syntax: '"<length>"',
inherits: false,
initialValue: '1px'
}, (name) => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
}, '@property determines the registration when uncontested');
test_with_at_property({
syntax: '"<length>"',
inherits: false,
initialValue: '2px'
}, (name) => {
CSS.registerProperty({
name: name,
syntax: '<color>',
inherits: false,
initialValue: 'green'
});
assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)');
}, 'CSS.registerProperty wins over @property');
test_with_at_property({
syntax: '"<length>"',
inherits: false,
initialValue: '3px'
}, (name1) => {
with_at_property({
name: name1,
syntax: '"<integer>"',
inherits: false,
initialValue: '6'
}, (name2) => {
assert_equals(name1, name2);
assert_equals(getComputedStyle(div).getPropertyValue(name2), '6');
});
}, '@property later in document order wins');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 4px;
}
@property ${name} {
syntax: "<color>";
inherits: false;
initial-value: red;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(255, 0, 0)');
});
}, '@property later in stylesheet wins');
test(() => {
let name = generate_name();
CSS.registerProperty({
name: name,
syntax: '<color>',
inherits: false,
initialValue: 'green'
});
assert_equals(getComputedStyle(div).getPropertyValue(name), 'rgb(0, 128, 0)');
}, 'CSS.registerProperty determines the registration when uncontested');
test(() => {
let name = generate_name();
// ${name} is initially not registered, hence has no initial value.
assert_equals(getComputedStyle(div).getPropertyValue(name), '');
with_at_property({
name: name,
syntax: '"<length>"',
inherits: false,
initialValue: '10px'
}, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '10px');
});
// When the style node is removed, ${name} should be unregistered again.
assert_equals(getComputedStyle(div).getPropertyValue(name), '');
}, '@property registrations are cleared when rule removed');
test(() => {
let name = generate_name();
with_style_node(`div { ${name}: calc(1px + 1px); }`, () => {
// ${name} should be a token sequence at this point.
assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)');
with_at_property({
name: name,
syntax: '"<length>"',
inherits: false,
initialValue: '0px'
}, () => {
// ${name} is now a <length>, hence the calc() should be simplified.
assert_equals(getComputedStyle(div).getPropertyValue(name), '2px');
});
// ${name} should be a token sequence again.
assert_equals(getComputedStyle(div).getPropertyValue(name), ' calc(1px + 1px)');
});
}, 'Computed value becomes token sequence when @property is removed');
test(() => {
let name = generate_name();
with_style_node(`#outer { ${name}: 10px; }`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px');
with_at_property({
name: name,
syntax: '"<length>"',
inherits: false,
initialValue: '0px'
}, () => {
// ${name} is no longer inherited
assert_equals(getComputedStyle(div).getPropertyValue(name), '0px');
});
assert_equals(getComputedStyle(div).getPropertyValue(name), ' 10px');
});
}, 'Inherited status is reflected in computed styles when @property is removed');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 1px;
}
@property ${name} {
inherits: false;
initial-value: green;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
}, 'Invalid @property rule (missing syntax) does not overwrite previous valid rule');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 1px;
}
@property ${name} {
syntax: "<color>";
initial-value: green;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
}, 'Invalid @property rule (missing inherits descriptor) does not overwrite previous valid rule');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 1px;
}
@property ${name} {
syntax: "<color>";
inherits: false;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
}, 'Invalid @property rule (missing initial-value) does not overwrite previous valid rule');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<color>";
inherits: false;
}
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 1px;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
}, 'Previous invalid rule does not prevent valid rule from causing registration');
test(() => {
let name = generate_name();
with_style_node(`
@property ${name} {
syntax: "<length>";
inherits: false;
initial-value: 1px;
quite-unknown: 200;
}
`, () => {
assert_equals(getComputedStyle(div).getPropertyValue(name), '1px');
});
}, 'Unknown descriptors are ignored and do not invalidate rule');
</script>