| <!doctype html> |
| <meta charset=utf-8> |
| <title>CSSAnimation.effect</title> |
| <meta name="timeout" content="long"> |
| <!-- TODO: Add a more specific link for this once it is specified. --> |
| <link rel="help" href="https://drafts.csswg.org/css-animations-2/#cssanimation"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="support/testcommon.js"></script> |
| <style> |
| @keyframes anim { |
| from { |
| margin-left: 0px; |
| } |
| to { |
| margin-left: 100px; |
| } |
| } |
| </style> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| promise_test(async t => { |
| const div = addDiv(t); |
| div.style.animation = 'anim 100s'; |
| |
| const watcher = new EventWatcher(t, div, [ 'animationend', |
| 'animationcancel' ]); |
| const animation = div.getAnimations()[0]; |
| await animation.ready; |
| |
| animation.currentTime = 50 * MS_PER_SEC; |
| animation.effect = null; |
| assert_equals(animation.playState, 'finished'); |
| assert_equals(getComputedStyle(div).marginLeft, '0px'); |
| await watcher.wait_for('animationend'); |
| }, 'Setting a null effect on a running animation fires an animationend event'); |
| |
| promise_test(async t => { |
| const div = addDiv(t); |
| div.style.animation = 'anim 100s'; |
| |
| const animation = div.getAnimations()[0]; |
| await animation.ready; |
| |
| animation.currentTime = 50 * MS_PER_SEC; |
| animation.effect = new KeyframeEffect(div, |
| { left: [ '0px' , '100px'] }, |
| 100 * MS_PER_SEC); |
| assert_equals(getComputedStyle(div).marginLeft, '0px'); |
| assert_equals(getComputedStyle(div).left, '50px'); |
| }, 'Replacing an animation\'s effect with an effect that targets a different ' + |
| 'property should update both properties'); |
| |
| promise_test(async t => { |
| const div = addDiv(t); |
| div.style.animation = 'anim 100s'; |
| |
| const animation = div.getAnimations()[0]; |
| await animation.ready; |
| |
| animation.currentTime = 50 * MS_PER_SEC; |
| animation.effect = new KeyframeEffect(div, |
| { left: [ '0px' , '100px'] }, |
| 20 * MS_PER_SEC); |
| assert_equals(animation.playState, 'finished'); |
| }, 'Replacing an animation\'s effect with a shorter one that should have ' + |
| 'already finished, the animation finishes immediately'); |
| |
| promise_test(async t => { |
| const div = addDiv(t); |
| div.style.animation = 'anim 100s'; |
| |
| const animation = div.getAnimations()[0]; |
| assert_true(animation.pending); |
| |
| animation.effect = new KeyframeEffect(div, |
| { left: [ '0px' , '100px'] }, |
| 100 * MS_PER_SEC); |
| assert_true(animation.pending); |
| |
| await animation.ready; |
| |
| assert_false(animation.pending); |
| }, 'A play-pending animation\'s effect whose effect is replaced still exits ' + |
| 'the pending state'); |
| |
| promise_test(async t => { |
| const div1 = addDiv(t); |
| const div2 = addDiv(t); |
| |
| const watcher1 = new EventWatcher(t, div1, 'animationstart'); |
| // Watch |div2| as well to ensure it does *not* get events. |
| const watcher2 = new EventWatcher(t, div2, 'animationstart'); |
| |
| div1.style.animation = 'anim 100s'; |
| |
| const animation = div1.getAnimations()[0]; |
| animation.effect = new KeyframeEffect(div2, |
| { left: [ '0px', '100px' ] }, |
| 100 * MS_PER_SEC); |
| |
| await watcher1.wait_for('animationstart'); |
| |
| assert_equals(animation.effect.target, div2); |
| |
| // Then wait a couple of frames and check that no event was dispatched. |
| await waitForAnimationFrames(2); |
| }, 'CSS animation events are dispatched at the original element even after' |
| + ' setting an effect with a different target element'); |
| |
| promise_test(async t => { |
| const div = addDiv(t); |
| const watcher = new EventWatcher(t, div, [ 'animationstart', |
| 'animationend', |
| 'animationcancel' ]); |
| div.style.animation = 'anim 100s'; |
| const animation = div.getAnimations()[0]; |
| animation.finish(); |
| |
| await watcher.wait_for([ 'animationstart', 'animationend' ]); |
| // Set a longer effect |
| animation.effect = new KeyframeEffect(div, |
| { left: [ '0px', '100px' ] }, |
| 200 * MS_PER_SEC); |
| await watcher.wait_for('animationstart'); |
| }, 'After replacing a finished animation\'s effect with a longer one ' + |
| 'it fires an animationstart event'); |
| |
| </script> |