1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
<!doctype html>
<meta charset=utf-8>
<title>The effect value of a keyframe effect: Overlapping keyframes</title>
<link rel="help" href="https://drafts.csswg.org/web-animations/#the-effect-value-of-a-keyframe-animation-effect">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<body>
<div id="log"></div>
<script>
'use strict';
function assert_opacity_value(opacity, expected, description) {
return assert_approx_equals(
parseFloat(opacity),
expected,
0.0001,
description
);
}
promise_test(async t => {
const div = createDiv(t);
div.style.opacity = '0.1';
const animA = div.animate(
{ opacity: 0.2 },
{ duration: 1, fill: 'forwards' }
);
const animB = div.animate(
{ opacity: 0.3 },
{ duration: 1, fill: 'forwards' }
);
await animA.finished;
// Sanity check
assert_equals(animA.replaceState, 'removed');
assert_equals(animB.replaceState, 'active');
// animA is now removed so if we cancel animB, we should go back to the
// underlying value
animB.cancel();
assert_opacity_value(
getComputedStyle(div).opacity,
0.1,
'Opacity should be the un-animated value'
);
}, 'Removed animations do not contribute to animated style');
promise_test(async t => {
const div = createDiv(t);
div.style.opacity = '0.1';
const animA = div.animate(
{ opacity: 0.2 },
{ duration: 1, fill: 'forwards' }
);
const animB = div.animate(
{ opacity: 0.3, composite: 'add' },
{ duration: 1, fill: 'forwards' }
);
await animA.finished;
// Sanity check
assert_equals(animA.replaceState, 'removed');
assert_equals(animB.replaceState, 'active');
// animA has been removed so the final result should be 0.1 + 0.3 = 0.4.
// (If animA were not removed it would be 0.2 + 0.3 = 0.5.)
assert_opacity_value(
getComputedStyle(div).opacity,
0.4,
'Opacity value should not include the removed animation'
);
}, 'Removed animations do not contribute to the effect stack');
promise_test(async t => {
const div = createDiv(t);
div.style.opacity = '0.1';
const animA = div.animate(
{ opacity: 0.2 },
{ duration: 1, fill: 'forwards' }
);
const animB = div.animate(
{ opacity: 0.3 },
{ duration: 1, fill: 'forwards' }
);
await animA.finished;
animA.persist();
animB.cancel();
assert_opacity_value(
getComputedStyle(div).opacity,
0.2,
"Opacity should be the persisted animation's value"
);
}, 'Persisted animations contribute to animated style');
promise_test(async t => {
const div = createDiv(t);
div.style.opacity = '0.1';
const animA = div.animate(
{ opacity: 0.2 },
{ duration: 1, fill: 'forwards' }
);
const animB = div.animate(
{ opacity: 0.3, composite: 'add' },
{ duration: 1, fill: 'forwards' }
);
await animA.finished;
assert_opacity_value(
getComputedStyle(div).opacity,
0.4,
'Opacity value should NOT include the contribution of the removed animation'
);
animA.persist();
assert_opacity_value(
getComputedStyle(div).opacity,
0.5,
'Opacity value should include the contribution of the persisted animation'
);
}, 'Persisted animations contribute to the effect stack');
promise_test(async t => {
const div = createDiv(t);
div.style.opacity = '0.1';
const animA = div.animate(
{ opacity: 0.2 },
{ duration: 1, fill: 'forwards' }
);
// Persist the animation before it finishes (and before it would otherwise be
// removed).
animA.persist();
const animB = div.animate(
{ opacity: 0.3, composite: 'add' },
{ duration: 1, fill: 'forwards' }
);
await animA.finished;
assert_opacity_value(
getComputedStyle(div).opacity,
0.5,
'Opacity value should include the contribution of the persisted animation'
);
}, 'Animations persisted before they would be removed contribute to the'
+ ' effect stack');
</script>
</body>
|