| <!doctype html> | |
| <meta charset=utf-8> | |
| <title>Element.getAnimations() for CSS transitions</title> | |
| <link rel="help" href="https://drafts.csswg.org/css-transitions-2/#animation-composite-order"> | |
| <!-- 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'; | |
| promise_test(async t => { | |
| const div = addDiv(t); | |
| div.style.left = '0px'; | |
| div.style.top = '0px'; | |
| getComputedStyle(div).transitionProperty; | |
| div.style.transition = 'all 100s'; | |
| div.style.left = '100px'; | |
| div.style.top = '100px'; | |
| assert_equals(div.getAnimations().length, 2); | |
| }, 'getAnimations returns one Animation per transitioning property'); | |
| test(t => { | |
| const div = addDiv(t, { style: 'left: 0px; transition: all 100s' }); | |
| getComputedStyle(div).left; | |
| div.style.left = '100px'; | |
| assert_class_string(div.getAnimations()[0], 'CSSTransition', | |
| 'Interface of returned animation is CSSTransition'); | |
| }, 'getAnimations returns CSSTransition objects for CSS Transitions'); | |
| promise_test(async t => { | |
| const div = addDiv(t); | |
| div.style.left = '0px'; | |
| getComputedStyle(div).left; | |
| div.style.transition = 'all 0.01s'; | |
| div.style.left = '100px'; | |
| const animation = div.getAnimations()[0]; | |
| await animation.finished; | |
| assert_equals(div.getAnimations().length, 0); | |
| }, 'getAnimations does not return finished CSS Transitions'); | |
| test(t => { | |
| const div = addDiv(t); | |
| // animation-duration is not animatable | |
| div.style.animationDuration = '10s'; | |
| getComputedStyle(div).animationDuration; | |
| div.style.transition = 'all 100s'; | |
| div.style.animationDuration = '100s'; | |
| assert_equals(div.getAnimations().length, 0); | |
| }, 'getAnimations does not return a transition for a non-animatable property'); | |
| test(t => { | |
| const div = addDiv(t); | |
| div.style.setProperty('-vendor-unsupported', '0px', ''); | |
| getComputedStyle(div).transitionProperty; | |
| div.style.transition = 'all 100s'; | |
| div.style.setProperty('-vendor-unsupported', '100px', ''); | |
| assert_equals(div.getAnimations().length, 0); | |
| }, 'getAnimations does not return a transition for an unsupposed property'); | |
| test(t => { | |
| const div = addDiv(t, { style: 'transform: translate(0px); ' + | |
| 'opacity: 0; ' + | |
| 'border-width: 0px; ' + // Shorthand | |
| 'border-style: solid' }); | |
| getComputedStyle(div).transform; | |
| div.style.transition = 'all 100s'; | |
| div.style.transform = 'translate(100px)'; | |
| div.style.opacity = '1'; | |
| div.style.borderWidth = '1px'; | |
| const animations = div.getAnimations(); | |
| assert_equals(animations.length, 6, | |
| 'Generated expected number of transitions'); | |
| assert_equals(animations[0].transitionProperty, 'border-bottom-width'); | |
| assert_equals(animations[1].transitionProperty, 'border-left-width'); | |
| assert_equals(animations[2].transitionProperty, 'border-right-width'); | |
| assert_equals(animations[3].transitionProperty, 'border-top-width'); | |
| assert_equals(animations[4].transitionProperty, 'opacity'); | |
| assert_equals(animations[5].transitionProperty, 'transform'); | |
| }, 'getAnimations sorts simultaneous transitions by name'); | |
| test(t => { | |
| const div = addDiv(t, { style: 'transform: translate(0px); ' + | |
| 'opacity: 0' }); | |
| getComputedStyle(div).transform; | |
| div.style.transition = 'all 100s'; | |
| div.style.transform = 'translate(100px)'; | |
| assert_equals(div.getAnimations().length, 1, | |
| 'Initially there is only one (transform) transition'); | |
| div.style.opacity = '1'; | |
| assert_equals(div.getAnimations().length, 2, | |
| 'Then a second (opacity) transition is added'); | |
| const animations = div.getAnimations(); | |
| assert_equals(animations[0].transitionProperty, 'transform'); | |
| assert_equals(animations[1].transitionProperty, 'opacity'); | |
| }, 'getAnimations sorts transitions by when they were generated'); | |
| </script> |