Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE html>
<title>Test !important declarations vs. animation effects</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
CSS.registerProperty({
name: "--length-1",
syntax: "<length>",
initialValue: "0px",
inherits: false
});
CSS.registerProperty({
name: "--length-2",
syntax: "<length>",
initialValue: "0px",
inherits: false
});
</script>
<style>
@keyframes bgcolor_animation {
from { background-color: rgb(10, 10, 10); }
to { background-color: rgb(20, 20, 20); }
}
@keyframes color_and_bg_animation {
from { background-color: rgb(10, 10, 10); color: rgb(10, 10, 10); }
to { background-color: rgb(20, 20, 20); color: rgb(20, 20, 20); }
}
a, div, ::before{
animation-duration: 1000s;
animation-delay: -500s;
animation-timing-function: steps(2, end);
}
#target1 {
animation-name: bgcolor_animation;
}
#target2 {
background-color: rgb(0, 128, 0) !important;
animation-name: bgcolor_animation;
}
#target3 {
color: rgb(0, 128, 0) !important;
animation-name: color_and_bg_animation;
}
#target4::before {
color: rgb(0, 128, 0) !important;
animation-name: color_and_bg_animation;
content: " ";
}
#target5 {
animation-name: color_and_bg_animation;
}
#target5:visited {
color: rgb(0, 128, 0) !important;
}
#target6 {
background-color: white;
color: white !important;
}
#target7 {
--length-1: 10px;
--length-2: 10px !important;
}
</style>
<div id="target1"></div>
<div id="target2"></div>
<div id="target3"></div>
<div id="target4"></div>
<a href="" id="target5"></a>
<span id="target6"></span>
<span id="target7"></span>
<script>
test(() => {
assert_equals(getComputedStyle(target1).backgroundColor, 'rgb(15, 15, 15)');
}, 'Interpolated value is observable');
test(() => {
assert_equals(getComputedStyle(target2).backgroundColor, 'rgb(0, 128, 0)');
}, 'Important rules override animations');
test(() => {
assert_equals(getComputedStyle(target3).color, 'rgb(0, 128, 0)');
assert_equals(getComputedStyle(target3).backgroundColor, 'rgb(15, 15, 15)');
}, 'Non-overriden interpolations are observable');
test(() => {
assert_equals(getComputedStyle(target4, '::before').color, 'rgb(0, 128, 0)');
assert_equals(getComputedStyle(target4, '::before').backgroundColor, 'rgb(15, 15, 15)');
}, 'Important rules override animations (::before)');
test(() => {
assert_equals(getComputedStyle(target5).color, 'rgb(15, 15, 15)');
assert_equals(getComputedStyle(target5).backgroundColor, 'rgb(15, 15, 15)');
}, 'Important rules do not override animations on :visited as seen from JS');
test(() => {
getComputedStyle(target6).backgroundColor;
let animation = target6.animate([
{ backgroundColor: 'rgb(10, 10, 10)' },
{ backgroundColor: 'rgb(20, 20, 20)' },
], {
duration: 1000000,
delay: -500000,
easing: 'steps(2, end)'
});
assert_equals(getComputedStyle(target6).backgroundColor, 'rgb(15, 15, 15)');
assert_equals(getComputedStyle(target6).color, 'rgb(255, 255, 255)');
animation.effect.setKeyframes([
{ color: 'rgb(10, 10, 10)' },
{ color: 'rgb(20, 20, 20)' },
]);
assert_equals(getComputedStyle(target6).backgroundColor, 'rgb(255, 255, 255)');
assert_equals(getComputedStyle(target6).color, 'rgb(255, 255, 255)');
}, 'Standard property animations appearing via setKeyframes do not override important declarations');
test(() => {
getComputedStyle(target7).getPropertyValue('--length-1');
let animation = target7.animate([
{ '--length-1': '100px' },
{ '--length-1': '200px' },
], {
duration: 1000000,
delay: -500000,
easing: 'steps(2, end)'
});
assert_equals(getComputedStyle(target7).getPropertyValue('--length-1'), '150px');
assert_equals(getComputedStyle(target7).getPropertyValue('--length-2'), '10px');
animation.effect.setKeyframes([
{ '--length-2': '100px' },
{ '--length-2': '200px' },
]);
assert_equals(getComputedStyle(target7).getPropertyValue('--length-1'), '10px');
assert_equals(getComputedStyle(target7).getPropertyValue('--length-2'), '10px');
}, 'Custom property animations appearing via setKeyframes do not override important declarations');
</script>