<!doctype html> <meta charset=utf-8> <title>CSSTransition.currentTime</title> <!-- TODO: Add a more specific link for this once it is specified. --> <link rel="help" href="https://drafts.csswg.org/css-transitions-2/#csstransition"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="support/helper.js"></script> <div id="log"></div> <script> 'use strict'; const marginLeft = div => parseFloat(getComputedStyle(div).marginLeft); promise_test(async t => { const div = addDiv(t, { style: 'margin-left: 100px; transition: margin-left 100s linear 100s', }); getComputedStyle(div).marginLeft; div.style.marginLeft = '200px'; const animation = div.getAnimations()[0]; assert_equals( animation.currentTime, 0, 'currentTime should initially be zero' ); await animation.ready; const seekTime = 150 * MS_PER_SEC; animation.currentTime = seekTime; assert_time_equals_literal( animation.currentTime, seekTime, 'currentTime is updated' ); assert_equals(getComputedStyle(div).marginLeft, '150px'); }, 'currentTime can be used to seek a CSS transition'); promise_test(async t => { const div = addDiv(t, { style: 'margin-left: 100px; transition: margin-left 100s linear 100s', }); const eventWatcher = new EventWatcher(t, div, 'transitionend'); getComputedStyle(div).marginLeft; div.style.marginLeft = '200px'; const animation = div.getAnimations()[0]; await animation.ready; const marginLeft = () => parseFloat(getComputedStyle(div).marginLeft); assert_equals(marginLeft(div), 100); animation.currentTime = 100 * MS_PER_SEC; assert_equals(marginLeft(div), 100); animation.currentTime = 150 * MS_PER_SEC; assert_equals(marginLeft(div), 150); animation.currentTime = 200 * MS_PER_SEC; await eventWatcher.wait_for('transitionend'); assert_equals(marginLeft(div), 200); }, 'Skipping forwards through transition'); promise_test(async t => { const div = addDiv(t, { style: 'margin-left: 100px; transition: margin-left 100s linear 100s', }); const eventWatcher = new EventWatcher(t, div, 'transitionend'); getComputedStyle(div).marginLeft; div.style.marginLeft = '200px'; const animation = div.getAnimations()[0]; await animation.ready; // Unlike in the case of CSS animations, we cannot skip to the end and skip // backwards since when we reach the end the transition effect is removed and // changes to the Animation object no longer affect the element. For // this reason we only skip forwards as far as the 50% through point. animation.currentTime = 150 * MS_PER_SEC; assert_equals(marginLeft(div), 150); animation.currentTime = 100 * MS_PER_SEC; assert_equals(marginLeft(div), 100); }, 'Skipping backwards through transition'); promise_test(async t => { const div = addDiv(t, { style: 'margin-left: 100px; transition: margin-left 100s linear 100s', }); getComputedStyle(div).marginLeft; div.style.marginLeft = '200px'; const animation = div.getAnimations()[0]; await animation.ready; assert_throws_js( TypeError, () => { animation.currentTime = null; }, 'Expect TypeError exception on trying to set Animation.currentTime to null' ); }, 'Setting currentTime to null on a CSS transition throws'); test(t => { const div = addDiv(t); div.style.left = '0px'; getComputedStyle(div).transitionProperty; div.style.transition = 'left 100s ease-in'; div.style.left = '100px'; const transition = div.getAnimations()[0]; // Seek to the middle. Note, this is not equivalent to 50% progress since the // timing-function is non-linear. transition.currentTime = 50 * MS_PER_SEC; const portion = transition.effect.getComputedTiming().progress; // Reverse the transition. div.style.left = '0px'; const reversedTransition = div.getAnimations()[0]; // If the transition reversing behavior does not advance the previous // transition to the time set by currentTime, start and end values will both // be 0px and no transition will be produced. assert_not_equals(reversedTransition, undefined, "A reversed transition is produced"); const expectedDuration = 100 * MS_PER_SEC * portion; assert_approx_equals( reversedTransition.effect.getComputedTiming().activeDuration, expectedDuration, 1, "The reversed transition has correctly reduced duration" ); }, "Transition reversing behavior respects currentTime and uses the " + "transition's current position."); </script>