summaryrefslogtreecommitdiffstats
path: root/dom/animation/test/css-animations/file_animation-cancel.html
blob: 85499addfd899b53c7fbe15c577ea4188089d114 (plain)
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
<!doctype html>
<meta charset=utf-8>
<script src="../testcommon.js"></script>
<style>
@keyframes translateAnim {
  to { transform: translate(100px) }
}
@keyframes marginLeftAnim {
  to { margin-left: 100px }
}
@keyframes marginLeftAnim100To200 {
  from { margin-left: 100px }
  to { margin-left: 200px }
}
</style>
<body>
<script>
'use strict';

promise_test(function(t) {
  var div = addDiv(t, { style: 'animation: translateAnim 100s' });
  var animation = div.getAnimations()[0];

  return animation.ready.then(function() {
    assert_not_equals(getComputedStyle(div).transform, 'none',
                      'transform style is animated before cancelling');
    animation.cancel();
    assert_equals(getComputedStyle(div).transform, 'none',
                  'transform style is no longer animated after cancelling');
  });
}, 'Animated style is cleared after cancelling a running CSS animation');

promise_test(function(t) {
  var div = addDiv(t, { style: 'animation: translateAnim 100s forwards' });
  var animation = div.getAnimations()[0];
  animation.finish();

  return animation.ready.then(function() {
    assert_not_equals(getComputedStyle(div).transform, 'none',
                      'transform style is filling before cancelling');
    animation.cancel();
    assert_equals(getComputedStyle(div).transform, 'none',
                  'fill style is cleared after cancelling');
  });
}, 'Animated style is cleared after cancelling a filling CSS animation');

promise_test(function(t) {
  var div = addDiv(t, { style: 'animation: translateAnim 100s' });
  var animation = div.getAnimations()[0];
  div.addEventListener('animationend', t.step_func(function() {
    assert_unreached('Got unexpected end event on cancelled animation');
  }));

  return animation.ready.then(function() {
    // Seek to just before the end then cancel
    animation.currentTime = 99.9 * 1000;
    animation.cancel();

    // Then wait a couple of frames and check that no event was dispatched
    return waitForAnimationFrames(2);
  });
}, 'Cancelled CSS animations do not dispatch events');

test(function(t) {
  var div = addDiv(t, { style: 'animation: marginLeftAnim 100s linear' });
  var animation = div.getAnimations()[0];
  animation.cancel();

  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after cancelling');

  animation.currentTime = 50 * 1000;
  assert_equals(getComputedStyle(div).marginLeft, '50px',
                'margin-left style is updated when cancelled animation is'
                + ' seeked');
}, 'After cancelling an animation, it can still be seeked');

promise_test(function(t) {
  var div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  var animation = div.getAnimations()[0];

  return animation.ready.then(function() {
    animation.cancel();
    assert_equals(getComputedStyle(div).marginLeft, '0px',
                  'margin-left style is not animated after cancelling');
    animation.play();
    assert_equals(getComputedStyle(div).marginLeft, '100px',
                  'margin-left style is animated after re-starting animation');
    return animation.ready;
  }).then(function() {
    assert_equals(animation.playState, 'running',
                  'Animation succeeds in running after being re-started');
  });
}, 'After cancelling an animation, it can still be re-used');

test(function(t) {
  var div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  var animation = div.getAnimations()[0];
  animation.cancel();
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after cancelling');

  // Trigger a change to some animation properties and check that this
  // doesn't cause the animation to become live again
  div.style.animationDuration = '200s';
  flushComputedStyle(div);
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is still not animated after updating'
                + ' animation-duration');
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after updating animation-duration');
}, 'After cancelling an animation, updating animation properties doesn\'t make'
   + ' it live again');

test(function(t) {
  var div =
    addDiv(t, { style: 'animation: marginLeftAnim100To200 100s linear' });
  var animation = div.getAnimations()[0];
  animation.cancel();
  assert_equals(getComputedStyle(div).marginLeft, '0px',
                'margin-left style is not animated after cancelling');

  // Make some changes to animation-play-state and check that the
  // animation doesn't become live again. This is because it should be
  // possible to cancel an animation from script such that all future
  // changes to style are ignored.

  // Redundant change
  div.style.animationPlayState = 'running';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after a redundant change to'
                + ' animation-play-state');

  // Pause
  div.style.animationPlayState = 'paused';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after setting'
                + ' animation-play-state: paused');

  // Play
  div.style.animationPlayState = 'running';
  assert_equals(animation.playState, 'idle',
                'Animation is still idle after re-setting'
                + ' animation-play-state: running');

}, 'After cancelling an animation, updating animation-play-state doesn\'t'
   + ' make it live again');

done();
</script>
</body>
</html>