gecko-dev/testing/web-platform/tests/animation-worklet/worklet-animation-pause.https.html
Majid Valipour 2d8023aa3d Bug 1526728 [wpt PR 15279] - [animation-worklet] Basic pause implementation (reland), a=testonly
Automatic update from web-platform-tests
[animation-worklet] Basic pause implementation (reland)

Pausing worklet animation now holds the time. This works as expected for main
thread animations. Implementing this for composited worklet animations will be
done in a follow up patch.

Major changes:
 - Add and expose pause() method pausing the animation.
 - Introduce hold_time that is used when animation is paused.
 - Rework how current time is computed, it is now closer to
   regular animations i.e., we either compute it based on "start time and
   timeline.currentTime" or use "hold time".
 - Instead of setting start time we now set the current time
   which then works backward to compute either the start time or the hold time
   based on the animation state.
 - When transitioning animation play state, we now always set
   the current time. Previously this was adhoc and inconsistent.
 - Introduce has_started_ to differentiate when playing an
   animation for the first time vs playing it from pause.
 - Update playback_rate related calculation to use new logic.

Relanding: Original CL was reverted here [1]. Took the following steps to
address this:

  - Address flakiness in unit test by using more accurate error
    value matching other tests.
  - Fix flakiness in layout test (worklet-animation-pause.https.html)
    by using startTime and waiting for time to actually advance working around
    pre-existing animation clock issue [2]. Also got rid of an invalid state
    transition from pause->idle.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/1434815
[2] http://crbug.com/785940

TEST:

  - wpt/animation-worklet/worklet-animation-pause.https.html: js test for basic
    current time calculations
  - wpt/animation-worklet/worklet-animation-pause-immediately.https.html:
    reftest for basic pause
  - wpt/animation-worklet/worklet-animation-pause-result.https.html: reftest for
    pause/resume.
  - WorkletAnimationTest.PausePlay: unit test for basic state
    transition and time calc

Bug: 821910,
Change-Id: I11fd2960443081be81055904d6d56a2abc3282f5
Reviewed-on: https://chromium-review.googlesource.com/c/1456640
Reviewed-by: Majid Valipour <majidvp@chromium.org>
Reviewed-by: Yi Gu <yigu@chromium.org>
Commit-Queue: Majid Valipour <majidvp@chromium.org>
Cr-Commit-Position: refs/heads/master@{#630548}

--

wpt-commits: 345300fad3945a5f1441fb2b2001109ca48f36e8
wpt-pr: 15279
2019-02-26 12:05:21 +00:00

60 lines
2 KiB
HTML

<!DOCTYPE html>
<title>Verify that currentTime and playState are correct when animation is paused</title>
<link rel="help" href="https://drafts.css-houdini.org/css-animationworklet/">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/web-animations/testcommon.js"></script>
<script src="common.js"></script>
<div id="box"></div>
<script>
setup(setupAndRegisterTests, {explicit_done: true});
function createAnimation() {
const box = document.getElementById('box');
const effect = new KeyframeEffect(box,
{ transform: ['translateY(100px)', 'translateY(200px)'] },
{ duration: 100, iterations: 1 }
);
return new WorkletAnimation('passthrough', effect);
}
async function setupAndRegisterTests() {
await registerPassthroughAnimator();
promise_test(async t => {
const animation = createAnimation();
animation.play();
// Immediately pausing animation should freeze the current time at 0.
animation.pause();
assert_equals(animation.currentTime, 0);
assert_equals(animation.playState, "paused");
// Wait some time to ensure a paused animation actually freezes.
await waitForNextFrame();
assert_equals(animation.currentTime, 0);
assert_equals(animation.playState, "paused");
}, 'pausing an animation freezes its current time');
promise_test(async t => {
const animation = createAnimation();
animation.pause();
animation.play();
// Allow one async animation frame to pass so that animation is running.
await waitForAsyncAnimationFrames(1);
assert_equals(animation.playState, "running");
// Allow time to advance so that we have a non-zero current time.
await waitForDocumentTimelineAdvance();
const timelineTime = document.timeline.currentTime;
assert_greater_than(animation.currentTime, 0);
assert_times_equal(animation.currentTime, (timelineTime - animation.startTime));
}, 'playing a paused animation should resume it');
done();
}
</script>