| <!doctype html> |
| <meta charset=utf-8> |
| <script src="../../../resources/testharness.js"></script> |
| <script src="../../../resources/testharnessreport.js"></script> |
| <script src="../resources/testcommon.js"></script> |
| <style> |
| @keyframes abc { |
| to { transform: translate(10px) } |
| } |
| </style> |
| <body> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'abc 100s paused'; |
| var animation = div.getAnimations()[0]; |
| var originalReadyPromise = animation.ready; |
| |
| return animation.ready.then(function() { |
| div.style.animationPlayState = 'running'; |
| assert_not_equals(animation.ready, originalReadyPromise, |
| 'After updating animation-play-state a new ready promise' |
| + ' object is created'); |
| }); |
| }, 'A new ready promise is created when setting animation-play-state: running'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| |
| // Set up pending animation |
| div.style.animation = 'abc 100s'; |
| var animation = div.getAnimations()[0]; |
| assert_true(animation.pending, 'Animation is initially pending'); |
| |
| // Set up listeners on ready promise |
| var retPromise = animation.ready.then(function() { |
| assert_unreached('ready promise is fulfilled'); |
| }).catch(function(err) { |
| assert_equals(err.name, 'AbortError', |
| 'ready promise is rejected with AbortError'); |
| }); |
| |
| // Now cancel the animation and flush styles |
| div.style.animation = ''; |
| getComputedStyle(div).animation; |
| |
| return retPromise; |
| }, 'ready promise is rejected when an animation is canceled by resetting' |
| + ' the animation property'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| |
| // As before, but this time instead of removing all animations, simply update |
| // the list of animations. At least for Firefox, updating is a different |
| // code path. |
| |
| // Set up pending animation |
| div.style.animation = 'abc 100s'; |
| var animation = div.getAnimations()[0]; |
| assert_true(animation.pending, 'Animation is initially pending'); |
| |
| // Set up listeners on ready promise |
| var retPromise = animation.ready.then(function() { |
| assert_unreached('ready promise was fulfilled'); |
| }).catch(function(err) { |
| assert_equals(err.name, 'AbortError', |
| 'ready promise is rejected with AbortError'); |
| }); |
| |
| // Now update the animation and flush styles |
| div.style.animation = 'def 100s'; |
| getComputedStyle(div).animation; |
| |
| return retPromise; |
| }, 'ready promise is rejected when an animation is cancelled by updating' |
| + ' the animation property'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'animation: abc 100s' }); |
| var animation = div.getAnimations()[0]; |
| var originalReadyPromise = animation.ready; |
| |
| return animation.ready.then(function() { |
| div.style.animationPlayState = 'paused'; |
| assert_not_equals(animation.ready, originalReadyPromise, |
| 'A new Promise object is generated when setting' |
| + ' animation-play-state: paused'); |
| }); |
| }, 'A new ready promise is created when setting animation-play-state: paused'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'animation: abc 100s' }); |
| var animation = div.getAnimations()[0]; |
| |
| return animation.ready.then(function() { |
| div.style.animationPlayState = 'paused'; |
| var firstReadyPromise = animation.ready; |
| animation.pause(); |
| assert_equals(animation.ready, firstReadyPromise, |
| 'Ready promise objects are identical after redundant pause'); |
| }); |
| }, 'Pausing twice re-uses the same Promise'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'animation: abc 100s' }); |
| var animation = div.getAnimations()[0]; |
| |
| return animation.ready.then(function() { |
| div.style.animationPlayState = 'paused'; |
| |
| // Flush style and verify we're pending at the same time |
| assert_true(animation.pending, 'Animation is pending'); |
| var pauseReadyPromise = animation.ready; |
| |
| // Now play again immediately |
| div.style.animationPlayState = 'running'; |
| assert_true(animation.pending, 'Animation is still pending'); |
| assert_equals(animation.ready, pauseReadyPromise, |
| 'The pause Promise is re-used when playing while waiting' |
| + ' to pause'); |
| |
| return animation.ready; |
| }).then(function() { |
| assert_true(!animation.pending && animation.playState === 'running', |
| 'Animation is running after aborting a pause'); |
| }); |
| }, 'If a pause operation is interrupted, the ready promise is reused'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'animation: abc 100s' }); |
| var animation = div.getAnimations()[0]; |
| |
| return animation.ready.then(function() { |
| div.style.animationPlayState = 'paused'; |
| return animation.ready; |
| }).then(function(resolvedAnimation) { |
| assert_equals(resolvedAnimation, animation, |
| 'Promise received when ready Promise for a pause operation' |
| + ' is completed is the animation on which the pause was' |
| + ' performed'); |
| }); |
| }, 'When a pause is complete the Promise callback gets the correct animation'); |
| |
| </script> |
| </body> |