[Web Animations] Update WPT tests related to Web Animations and remove imported Mozil...
[WebKit-https.git] / LayoutTests / imported / w3c / web-platform-tests / css / css-animations / CSSAnimation-pausing.tentative.html
1 <!doctype html>
2 <meta charset=utf-8>
3 <title>Pausing a CSSAnimation</title>
4 <link rel="help"
5       href="https://drafts.csswg.org/css-animations-2/#animation-play-state">
6 <script src="/resources/testharness.js"></script>
7 <script src="/resources/testharnessreport.js"></script>
8 <script src="support/testcommon.js"></script>
9 <style>
10 @keyframes anim {
11   0% { margin-left: 0px }
12   100% { margin-left: 10000px }
13 }
14 </style>
15 <div id="log"></div>
16 <script>
17 'use strict';
18
19 const getMarginLeft = cs => parseFloat(cs.marginLeft);
20
21 promise_test(async t => {
22   const div = addDiv(t);
23   const cs = getComputedStyle(div);
24   div.style.animation = 'anim 1000s paused';
25   const animation = div.getAnimations()[0];
26   assert_equals(getMarginLeft(cs), 0,
27                 'Initial value of margin-left is zero');
28   animation.play();
29
30   await animation.ready;
31   await waitForNextFrame();
32
33   assert_greater_than(getMarginLeft(cs), 0,
34                       'Playing value of margin-left is greater than zero');
35 }, 'play() overrides animation-play-state');
36
37 promise_test(async t => {
38   const div = addDiv(t);
39   const cs = getComputedStyle(div);
40   div.style.animation = 'anim 1000s paused';
41   const animation = div.getAnimations()[0];
42   assert_equals(getMarginLeft(cs), 0,
43                 'Initial value of margin-left is zero');
44
45   animation.pause();
46   div.style.animationPlayState = 'running';
47
48   await animation.ready;
49   await waitForNextFrame();
50
51   assert_equals(cs.animationPlayState, 'running',
52                 'animation-play-state is running');
53   assert_equals(getMarginLeft(cs), 0,
54                 'Paused value of margin-left is zero');
55 }, 'pause() overrides animation-play-state');
56
57 promise_test(async t => {
58   const div = addDiv(t);
59   const cs = getComputedStyle(div);
60   div.style.animation = 'anim 1000s paused';
61   const animation = div.getAnimations()[0];
62   assert_equals(getMarginLeft(cs), 0,
63                 'Initial value of margin-left is zero');
64   animation.play();
65
66   await animation.ready;
67
68   div.style.animationPlayState = 'running';
69   cs.animationPlayState; // Trigger style resolution
70   await waitForNextFrame();
71
72   assert_equals(cs.animationPlayState, 'running',
73                 'animation-play-state is running');
74   div.style.animationPlayState = 'paused';
75   await animation.ready;
76
77   assert_equals(cs.animationPlayState, 'paused',
78                 'animation-play-state is paused');
79   const previousAnimVal = getMarginLeft(cs);
80   await waitForNextFrame();
81
82   assert_equals(getMarginLeft(cs), previousAnimVal,
83                 'Animated value of margin-left does not change when'
84                 + ' paused by style');
85 }, 'play() is overridden by later setting "animation-play-state: paused"');
86
87 promise_test(async t => {
88   const div = addDiv(t);
89   const cs = getComputedStyle(div);
90   div.style.animation = 'anim 1000s';
91   const animation = div.getAnimations()[0];
92   assert_equals(getMarginLeft(cs), 0,
93                 'Initial value of margin-left is zero');
94
95   // Set the specified style first. If implementations fail to
96   // apply the style changes first, they will ignore the redundant
97   // call to play() and fail to correctly override the pause style.
98   div.style.animationPlayState = 'paused';
99   animation.play();
100   const previousAnimVal = getMarginLeft(cs);
101
102   await animation.ready;
103   await waitForNextFrame();
104
105   assert_equals(cs.animationPlayState, 'paused',
106                 'animation-play-state is paused');
107   assert_greater_than(getMarginLeft(cs), previousAnimVal,
108                       'Playing value of margin-left is increasing');
109 }, 'play() flushes pending changes to animation-play-state first');
110
111 promise_test(async t => {
112   const div = addDiv(t);
113   const cs = getComputedStyle(div);
114   div.style.animation = 'anim 1000s paused';
115   const animation = div.getAnimations()[0];
116   assert_equals(getMarginLeft(cs), 0,
117                 'Initial value of margin-left is zero');
118
119   // Unlike the previous test for play(), since calling pause() is sticky,
120   // we'll apply it even if the underlying style also says we're paused.
121   //
122   // We would like to test that implementations flush styles before running
123   // pause() but actually there's no style we can currently set that will
124   // change the behavior of pause(). That may change in the future
125   // (e.g. if we introduce animation-timeline or animation-playback-rate etc.).
126   //
127   // For now this just serves as a sanity check that we do the same thing
128   // even if we set style before calling the API.
129   div.style.animationPlayState = 'running';
130   animation.pause();
131   const previousAnimVal = getMarginLeft(cs);
132
133   await animation.ready;
134   await waitForNextFrame();
135
136   assert_equals(cs.animationPlayState, 'running',
137                 'animation-play-state is running');
138   assert_equals(getMarginLeft(cs), previousAnimVal,
139                 'Paused value of margin-left does not change');
140 }, 'pause() applies pending changes to animation-play-state first');
141 // (Note that we can't actually test for this; see comment above, in test-body.)
142
143 promise_test(async t => {
144   const div = addDiv(t, { style: 'animation: anim 1000s' });
145   const animation = div.getAnimations()[0];
146   let readyPromiseRun = false;
147
148   await animation.ready;
149
150   div.style.animationPlayState = 'paused';
151   assert_true(animation.pending && animation.playState === 'paused',
152               'Animation is pause-pending');
153
154   // Set current time
155   animation.currentTime = 5 * MS_PER_SEC;
156   assert_equals(animation.playState, 'paused',
157                 'Animation is paused immediately after setting currentTime');
158   assert_equals(animation.startTime, null,
159                 'Animation startTime is unresolved immediately after ' +
160                 'setting currentTime');
161   assert_equals(animation.currentTime, 5 * MS_PER_SEC,
162                 'Animation currentTime does not change when forcing a ' +
163                 'pause operation to complete');
164
165   // The ready promise should now be resolved. If it's not then test will
166   // probably time out before anything else happens that causes it to resolve.
167   await animation.ready;
168 }, 'Setting the current time completes a pending pause');
169
170 </script>