| <!doctype html> |
| <meta charset=utf-8> |
| <title>CSSPseudoElement.getAnimations() for CSS animations</title> |
| <!-- TODO: Add a more specific link for this once it is specified. --> |
| <link rel="help" href="https://drafts.csswg.org/css-animations-2/"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="support/testcommon.js"></script> |
| <style> |
| @keyframes anim1 { } |
| @keyframes anim2 { } |
| .before::before { |
| animation: anim1 10s; |
| content: ''; |
| } |
| .after-with-mix-anims-trans::after { |
| content: ''; |
| animation: anim1 10s, anim2 10s; |
| width: 0px; |
| height: 0px; |
| transition: all 100s; |
| } |
| .after-change::after { |
| width: 100px; |
| height: 100px; |
| content: ''; |
| } |
| </style> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| test(t => { |
| const div = addDiv(t, { class: 'before' }); |
| const pseudoTarget = document.getAnimations()[0].effect.target; |
| assert_equals(pseudoTarget.getAnimations().length, 1, |
| 'Expected number of animations are returned'); |
| assert_equals(pseudoTarget.getAnimations()[0].animationName, 'anim1', |
| 'CSS animation name matches'); |
| }, 'getAnimations returns CSSAnimation objects'); |
| |
| test(t => { |
| const div = addDiv(t, { class: 'after-with-mix-anims-trans' }); |
| // Trigger transitions |
| flushComputedStyle(div); |
| div.classList.add('after-change'); |
| |
| // Create additional animation on the pseudo-element from script |
| const pseudoTarget = document.getAnimations()[0].effect.target; |
| const effect = new KeyframeEffect(pseudoTarget, |
| { background: ["blue", "red"] }, |
| 3 * MS_PER_SEC); |
| const newAnimation = new Animation(effect, document.timeline); |
| newAnimation.id = 'scripted-anim'; |
| newAnimation.play(); |
| |
| // Check order - the script-generated animation should appear later |
| const anims = pseudoTarget.getAnimations(); |
| assert_equals(anims.length, 5, |
| 'Got expected number of animations/trnasitions running on ' + |
| '::after pseudo element'); |
| assert_equals(anims[0].transitionProperty, 'height', |
| '1st animation is the 1st transition sorted by name'); |
| assert_equals(anims[1].transitionProperty, 'width', |
| '2nd animation is the 2nd transition sorted by name '); |
| assert_equals(anims[2].animationName, 'anim1', |
| '3rd animation is the 1st animation in animation-name list'); |
| assert_equals(anims[3].animationName, 'anim2', |
| '4rd animation is the 2nd animation in animation-name list'); |
| assert_equals(anims[4].id, 'scripted-anim', |
| 'Animation added by script appears last'); |
| }, 'getAnimations returns CSS transitions/animations, and script-generated ' + |
| 'animations in the expected order'); |
| |
| </script> |