aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ngAnimate/animate.js10
-rw-r--r--test/ngAnimate/animateSpec.js43
2 files changed, 50 insertions, 3 deletions
diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js
index 26d48012..fde8a7fa 100644
--- a/src/ngAnimate/animate.js
+++ b/src/ngAnimate/animate.js
@@ -1032,7 +1032,10 @@ angular.module('ngAnimate', ['ng'])
}
function unblockKeyframeAnimations(element) {
- element[0].style[ANIMATION_PROP] = '';
+ var node = element[0], prop = ANIMATION_PROP;
+ if(node.style[prop] && node.style[prop].length > 0) {
+ element[0].style[prop] = '';
+ }
}
function animateRun(element, className, activeAnimationComplete) {
@@ -1063,8 +1066,6 @@ angular.module('ngAnimate', ['ng'])
appliedStyles.push(CSS_PREFIX + 'transition-property');
appliedStyles.push(CSS_PREFIX + 'transition-duration');
}
- } else {
- unblockKeyframeAnimations(element);
}
if(ii > 0) {
@@ -1167,6 +1168,7 @@ angular.module('ngAnimate', ['ng'])
var cancel = preReflowCancellation;
afterReflow(function() {
unblockTransitions(element);
+ unblockKeyframeAnimations(element);
//once the reflow is complete then we point cancel to
//the new cancellation function which will remove all of the
//animation properties from the active animation
@@ -1232,6 +1234,7 @@ angular.module('ngAnimate', ['ng'])
if(cancellationMethod) {
afterReflow(function() {
unblockTransitions(element);
+ unblockKeyframeAnimations(element);
animationCompleted();
});
return cancellationMethod;
@@ -1248,6 +1251,7 @@ angular.module('ngAnimate', ['ng'])
if(cancellationMethod) {
afterReflow(function() {
unblockTransitions(element);
+ unblockKeyframeAnimations(element);
animationCompleted();
});
return cancellationMethod;
diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js
index c585e72b..9f324562 100644
--- a/test/ngAnimate/animateSpec.js
+++ b/test/ngAnimate/animateSpec.js
@@ -2771,4 +2771,47 @@ describe("ngAnimate", function() {
expect(node.style[animationKey]).not.toContain('none');
}));
+
+ it('should block and unblock keyframe animations before the followup JS animation occurs', function() {
+ module(function($animateProvider) {
+ $animateProvider.register('.special', function($sniffer, $window) {
+ var prop = $sniffer.vendorPrefix == 'Webkit' ? 'WebkitAnimation' : 'animation';
+ return {
+ beforeAddClass : function(element, className, done) {
+ expect(element[0].style[prop]).not.toContain('none');
+ expect($window.getComputedStyle(element[0])[prop + 'Duration']).toBe('1s');
+ done();
+ },
+ addClass : function(element, className, done) {
+ expect(element[0].style[prop]).not.toContain('none');
+ expect($window.getComputedStyle(element[0])[prop + 'Duration']).toBe('1s');
+ done();
+ }
+ }
+ });
+ });
+ inject(function($rootScope, $compile, $rootElement, $document, $animate, $sniffer, $timeout, $window) {
+ if (!$sniffer.animations) return;
+
+ $animate.enabled(true);
+
+ ss.addRule('.special', '-webkit-animation:1s special_animation;' +
+ 'animation:1s special_animation;');
+
+ var capturedProperty = 'none';
+
+ var element = $compile('<div class="special"></div>')($rootScope);
+ $rootElement.append(element);
+ jqLite($document[0].body).append($rootElement);
+
+ $animate.addClass(element, 'some-klass');
+
+ var prop = $sniffer.vendorPrefix == 'Webkit' ? 'WebkitAnimation' : 'animation';
+
+ expect(element[0].style[prop]).toContain('none');
+ expect($window.getComputedStyle(element[0])[prop + 'Duration']).toBe('0s');
+
+ $timeout.flush();
+ });
+ });
});