| <!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( |
| new TypeError(), |
| () => { |
| animation.currentTime = null; |
| }, |
| 'Expect TypeError exception on trying to set Animation.currentTime to null' |
| ); |
| }, 'Setting currentTime to null on a CSS transition throws'); |
| |
| </script> |