File: onfinish.html

package info (click to toggle)
firefox 144.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 4,637,504 kB
  • sloc: cpp: 7,576,692; javascript: 6,430,831; ansic: 3,748,119; python: 1,398,978; xml: 628,810; asm: 438,679; java: 186,194; sh: 63,212; makefile: 19,159; objc: 13,086; perl: 12,986; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (140 lines) | stat: -rw-r--r-- 4,436 bytes parent folder | download | duplicates (5)
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
<!DOCTYPE html>
<meta charset=utf-8>
<title>Animation.onfinish</title>
<link rel="help" href="https://drafts.csswg.org/web-animations/#dom-animation-onfinish">
<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';

async_test(t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);
  let finishedTimelineTime;
  animation.finished.then(() => {
    finishedTimelineTime = animation.timeline.currentTime;
  });

  animation.onfinish = t.step_func_done(event => {
    assert_equals(event.currentTime, 0,
      'event.currentTime should be zero');
    assert_times_equal(event.timelineTime, finishedTimelineTime,
      'event.timelineTime should equal to the animation timeline ' +
      'when finished promise is resolved');
  });

  animation.playbackRate = -1;
}, 'onfinish event is fired when the currentTime < 0 and ' +
   'the playbackRate < 0');

async_test(t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);

  let finishedTimelineTime;
  animation.finished.then(() => {
    finishedTimelineTime = animation.timeline.currentTime;
  });

  animation.onfinish = t.step_func_done(event => {
    assert_times_equal(event.currentTime, 100 * MS_PER_SEC,
      'event.currentTime should be the effect end');
    assert_times_equal(event.timelineTime, finishedTimelineTime,
      'event.timelineTime should equal to the animation timeline ' +
      'when finished promise is resolved');
  });

  animation.currentTime = 100 * MS_PER_SEC;
}, 'onfinish event is fired when the currentTime > 0 and ' +
   'the playbackRate > 0');

async_test(t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);

  let finishedTimelineTime;
  animation.finished.then(() => {
    finishedTimelineTime = animation.timeline.currentTime;
  });

  animation.onfinish = t.step_func_done(event => {
    assert_times_equal(event.currentTime, 100 * MS_PER_SEC,
      'event.currentTime should be the effect end');
    assert_times_equal(event.timelineTime, finishedTimelineTime,
      'event.timelineTime should equal to the animation timeline ' +
      'when finished promise is resolved');
  });

  animation.finish();
}, 'onfinish event is fired when animation.finish() is called');

promise_test(async t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);

  animation.onfinish = event => {
    assert_unreached('onfinish event should not be fired');
  };

  animation.currentTime = 100 * MS_PER_SEC / 2;
  animation.pause();

  await animation.ready;
  animation.currentTime = 100 * MS_PER_SEC;
  await waitForAnimationFrames(2);
}, 'onfinish event is not fired when paused');

promise_test(async t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);
  animation.onfinish = event => {
    assert_unreached('onfinish event should not be fired');
  };

  await animation.ready;
  animation.playbackRate = 0;
  animation.currentTime = 100 * MS_PER_SEC;
  await waitForAnimationFrames(2);
}, 'onfinish event is not fired when the playbackRate is zero');

promise_test(async t => {
  const div = createDiv(t);
  const animation = div.animate({}, 100 * MS_PER_SEC);

  animation.onfinish = event => {
    assert_unreached('onfinish event should not be fired');
  };

  await animation.ready;
  animation.currentTime = 100 * MS_PER_SEC;
  animation.currentTime = 100 * MS_PER_SEC / 2;
  await waitForAnimationFrames(2);
}, 'onfinish event is not fired when the animation falls out ' +
   'finished state immediately');

promise_test(async t => {
  const div = createDiv(t);
  const animation = div.animate({ opacity: [1, 0]}, 100 * MS_PER_SEC);
  const restart_after_finish_promise =
      new Promise(async (resolve) => {
    let results = [];
    animation.onfinish = () => {
      animation.play();
      animation.ready.then(() => {
        results.push(animation.ready);
        resolve(results);
      });
    };
    await animation.ready;
    results.push(animation.ready);
    animation.finish();
  });
  const results = await restart_after_finish_promise;
  assert_not_equals(results[0], results[1],
                    'Play created a new ready promise');
}, 'Animation can be restarted from the onfinish event');
</script>
</body>