| <!doctype html> |
| <meta charset=utf-8> |
| <script src="../../../resources/testharness.js"></script> |
| <script src="../../../resources/testharnessreport.js"></script> |
| <script src="../resources/testcommon.js"></script> |
| <body> |
| <div id="log"></div> |
| <script> |
| 'use strict'; |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(waitForFrame).then(function() { |
| assert_not_equals(getComputedStyle(div).marginLeft, '1000px', |
| 'transform style is animated before cancelling'); |
| transition.cancel(); |
| assert_equals(getComputedStyle(div).marginLeft, div.style.marginLeft, |
| 'transform style is no longer animated after cancelling'); |
| }); |
| }, 'Animated style is cleared after cancelling a running CSS transition'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| transition.cancel(); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px', |
| 'margin-left style is not animated after cancelling'); |
| transition.play(); |
| assert_equals(getComputedStyle(div).marginLeft, '0px', |
| 'margin-left style is animated after re-starting transition'); |
| return transition.ready; |
| }).then(function() { |
| assert_equals(transition.playState, 'running', |
| 'Transition succeeds in running after being re-started'); |
| }); |
| }, 'After canceling a transition, it can still be re-used'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| transition.finish(); |
| transition.cancel(); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px', |
| 'margin-left style is not animated after cancelling'); |
| transition.play(); |
| assert_equals(getComputedStyle(div).marginLeft, '0px', |
| 'margin-left style is animated after re-starting transition'); |
| return transition.ready; |
| }).then(function() { |
| assert_equals(transition.playState, 'running', |
| 'Transition succeeds in running after being re-started'); |
| }); |
| }, 'After cancelling a finished transition, it can still be re-used'); |
| |
| test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| transition.cancel(); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px', |
| 'margin-left style is not animated after cancelling'); |
| |
| // Trigger a change to a transition property and check that this |
| // doesn't cause the animation to become live again |
| div.style.transitionDuration = '200s'; |
| flushComputedStyle(div); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px', |
| 'margin-left style is still not animated after updating' |
| + ' transition-duration'); |
| assert_equals(transition.playState, 'idle', |
| 'Transition is still idle after updating transition-duration'); |
| }, 'After cancelling a transition, updating transition properties doesn\'t make' |
| + ' it live again'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| div.style.display = 'none'; |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px'); |
| }); |
| }, 'Setting display:none on an element cancels its transitions'); |
| |
| promise_test(function(t) { |
| var parentDiv = addDiv(t); |
| var childDiv = document.createElement('div'); |
| parentDiv.appendChild(childDiv); |
| childDiv.setAttribute('style', 'margin-left: 0px'); |
| |
| flushComputedStyle(childDiv); |
| |
| childDiv.style.transition = 'margin-left 100s'; |
| childDiv.style.marginLeft = '1000px'; |
| |
| var transition = childDiv.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| parentDiv.style.display = 'none'; |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| assert_equals(getComputedStyle(childDiv).marginLeft, '1000px'); |
| }); |
| }, 'Setting display:none cancels transitions on a child element'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| // Set an unrecognized property value |
| div.style.transitionProperty = 'none'; |
| flushComputedStyle(div); |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px'); |
| }); |
| }, 'Removing a property from transition-property cancels transitions on that '+ |
| 'property'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| div.style.transition = 'margin-top 10s -10s'; // combined duration is zero |
| flushComputedStyle(div); |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| assert_equals(getComputedStyle(div).marginLeft, '1000px'); |
| }); |
| }, 'Setting zero combined duration'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| div.style.marginLeft = '2000px'; |
| flushComputedStyle(div); |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| }); |
| }, 'Changing style to another interpolable value cancels the original ' + |
| 'transition'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| div.style.marginLeft = 'auto'; |
| flushComputedStyle(div); |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(div.getAnimations().length, 0, |
| 'There should be no transitions'); |
| assert_equals(transition.playState, 'idle'); |
| }); |
| }, 'An after-change style value can\'t be interpolated'); |
| |
| promise_test(function(t) { |
| var div = addDiv(t, { style: 'margin-left: 0px' }); |
| flushComputedStyle(div); |
| |
| div.style.transition = 'margin-left 100s'; |
| div.style.marginLeft = '1000px'; |
| |
| var transition = div.getAnimations()[0]; |
| return transition.ready.then(function() { |
| assert_equals(transition.playState, 'running'); |
| div.style.marginLeft = '0px'; |
| flushComputedStyle(div); |
| return waitForFrame(); |
| }).then(function() { |
| assert_equals(transition.playState, 'idle'); |
| }); |
| }, 'Reversing a running transition cancels the original transition'); |
| |
| </script> |
| </body> |