| <!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 anim1 { |
| to { left: 100px } |
| } |
| @keyframes anim2 { } |
| </style> |
| <body> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'anim1 100s'; |
| var originalAnimation = div.getAnimations()[0]; |
| var originalStartTime; |
| var originalCurrentTime; |
| |
| // Wait a moment so we can confirm the startTime doesn't change (and doesn't |
| // simply reflect the current time). |
| return originalAnimation.ready.then(function() { |
| originalStartTime = originalAnimation.startTime; |
| originalCurrentTime = originalAnimation.currentTime; |
| |
| // Wait a moment so we can confirm the startTime doesn't change (and |
| // doesn't simply reflect the current time). |
| return waitForNextFrame(); |
| }).then(function() { |
| div.style.animationDuration = '200s'; |
| var animation = div.getAnimations()[0]; |
| assert_equals(animation, originalAnimation, |
| 'The same Animation is returned after updating' |
| + ' animation duration'); |
| assert_equals(animation.startTime, originalStartTime, |
| 'Animations returned by getAnimations preserve' |
| + ' their startTime even when they are updated'); |
| // Sanity check |
| assert_not_equals(animation.currentTime, originalCurrentTime, |
| 'Animation.currentTime has updated in next' |
| + ' requestAnimationFrame callback'); |
| }); |
| }, 'Animations preserve their startTime when changed'); |
| |
| test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'anim1 100s, anim1 100s'; |
| |
| // Store original state |
| var animations = div.getAnimations(); |
| var animation1 = animations[0]; |
| var animation2 = animations[1]; |
| |
| // Update first in list |
| div.style.animationDuration = '200s, 100s'; |
| animations = div.getAnimations(); |
| assert_equals(animations[0], animation1, |
| 'First Animation is in same position after update'); |
| assert_equals(animations[1], animation2, |
| 'Second Animation is in same position after update'); |
| }, 'Updated Animations maintain their order in the list'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'anim1 200s, anim1 100s'; |
| |
| // Store original state |
| var animations = div.getAnimations(); |
| var animation1 = animations[0]; |
| var animation2 = animations[1]; |
| |
| // Wait before continuing so we can compare start times (otherwise the |
| // new Animation objects and existing Animation objects will all have the same |
| // start time). |
| return waitForAllAnimations(animations).then(waitForFrame).then(function() { |
| // Swap duration of first and second in list and prepend animation at the |
| // same time |
| div.style.animation = 'anim1 100s, anim1 100s, anim1 200s'; |
| animations = div.getAnimations(); |
| assert_true(animations[0] !== animation1 && animations[0] !== animation2, |
| 'New Animation is prepended to start of list'); |
| assert_equals(animations[1], animation1, |
| 'First Animation is in second position after update'); |
| assert_equals(animations[2], animation2, |
| 'Second Animation is in third position after update'); |
| assert_equals(animations[1].startTime, animations[2].startTime, |
| 'Old Animations have the same start time'); |
| // TODO: Check that animations[0].startTime === null |
| return animations[0].ready; |
| }).then(function() { |
| assert_greater_than(animations[0].startTime, animations[1].startTime, |
| 'New Animation has later start time'); |
| }); |
| }, 'Only the startTimes of existing animations are preserved'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'anim1 100s, anim1 100s'; |
| var secondAnimation = div.getAnimations()[1]; |
| |
| // Wait before continuing so we can compare start times |
| return secondAnimation.ready.then(waitForNextFrame).then(function() { |
| // Trim list of animations |
| div.style.animationName = 'anim1'; |
| var animations = div.getAnimations(); |
| assert_equals(animations.length, 1, 'List of Animations was trimmed'); |
| assert_equals(animations[0], secondAnimation, |
| 'Remaining Animation is the second one in the list'); |
| assert_equals(typeof(animations[0].startTime), 'number', |
| 'Remaining Animation has resolved startTime'); |
| assert_less_than(animations[0].startTime, |
| animations[0].timeline.currentTime, |
| 'Remaining Animation preserves startTime'); |
| }); |
| }, 'Animations are removed from the start of the list while preserving' |
| + ' the state of existing Animations'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t); |
| div.style.animation = 'anim1 100s'; |
| var firstAddedAnimation = div.getAnimations()[0], |
| secondAddedAnimation, |
| animations; |
| |
| // Wait and add second Animation |
| return firstAddedAnimation.ready.then(waitForFrame).then(function() { |
| div.style.animation = 'anim1 100s, anim1 100s'; |
| secondAddedAnimation = div.getAnimations()[0]; |
| |
| // Wait again and add another Animation |
| return secondAddedAnimation.ready.then(waitForFrame); |
| }).then(function() { |
| div.style.animation = 'anim1 100s, anim2 100s, anim1 100s'; |
| animations = div.getAnimations(); |
| assert_not_equals(firstAddedAnimation, secondAddedAnimation, |
| 'New Animations are added to start of the list'); |
| assert_equals(animations[0], secondAddedAnimation, |
| 'Second Animation remains in same position after' |
| + ' interleaving'); |
| assert_equals(animations[2], firstAddedAnimation, |
| 'First Animation remains in same position after' |
| + ' interleaving'); |
| return animations[1].ready; |
| }).then(function() { |
| assert_greater_than(animations[1].startTime, animations[0].startTime, |
| 'Interleaved animation starts later than existing ' + |
| 'animations'); |
| assert_greater_than(animations[0].startTime, animations[2].startTime, |
| 'Original animations retain their start time'); |
| }); |
| }, 'Animation state is preserved when interleaving animations in list'); |
| |
| </script> |
| </body> |