From b89584db10b63f346cbfd03f67fb92504e5bf362 Mon Sep 17 00:00:00 2001
From: Matias Niemelä
Date: Thu, 31 Oct 2013 14:09:49 -0700
Subject: fix($animate): avoid hanging animations if the active CSS transition
 class is missing
Closes #4732
Closes #4490
---
 test/ngAnimate/animateSpec.js | 58 +++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 56 insertions(+), 2 deletions(-)
(limited to 'test')
diff --git a/test/ngAnimate/animateSpec.js b/test/ngAnimate/animateSpec.js
index f3523692..3248445a 100644
--- a/test/ngAnimate/animateSpec.js
+++ b/test/ngAnimate/animateSpec.js
@@ -784,6 +784,59 @@ describe("ngAnimate", function() {
       });
 
       describe("Transitions", function() {
+        it("should only apply the fallback transition property unless all properties are being animated",
+          inject(function($compile, $rootScope, $animate, $sniffer, $timeout) {
+
+          if (!$sniffer.animations) return;
+
+          ss.addRule('.all.ng-enter',  '-webkit-transition:1s linear all;' +
+                                               'transition:1s linear all');
+
+          ss.addRule('.one.ng-enter',  '-webkit-transition:1s linear color;' +
+                                               'transition:1s linear color');
+
+          var element = $compile('
')($rootScope);
+          var child = $compile('...
')($rootScope);
+          $rootElement.append(element);
+          var body = jqLite($document[0].body);
+          body.append($rootElement);
+
+          $animate.enter(child, element);
+          $rootScope.$digest();
+          $timeout.flush();
+
+          expect(child.attr('style') || '').not.toContain('transition-property');
+          expect(child.hasClass('ng-animate')).toBe(true);
+          expect(child.hasClass('ng-animate-active')).toBe(true);
+
+          browserTrigger(child,'transitionend', { timeStamp: Date.now() + 1000, elapsedTime: 1000 });
+          $timeout.flush();
+
+          expect(child.hasClass('ng-animate')).toBe(false);
+          expect(child.hasClass('ng-animate-active')).toBe(false);
+
+          child.remove();
+
+          var child2 = $compile('...
')($rootScope);
+
+          $animate.enter(child2, element);
+          $rootScope.$digest();
+          $timeout.flush();
+
+          //IE removes the -ms- prefix when placed on the style
+          var fallbackProperty = $sniffer.msie ? 'zoom' : 'clip';
+          var regExp = new RegExp("transition-property:\\s+color\\s*,\\s*" + fallbackProperty + "\\s*;");
+          expect(child2.attr('style') || '').toMatch(regExp);
+          expect(child2.hasClass('ng-animate')).toBe(true);
+          expect(child2.hasClass('ng-animate-active')).toBe(true);
+
+          browserTrigger(child2,'transitionend', { timeStamp: Date.now() + 1000, elapsedTime: 1000 });
+          $timeout.flush();
+
+          expect(child2.hasClass('ng-animate')).toBe(false);
+          expect(child2.hasClass('ng-animate-active')).toBe(false);
+        }));
+
         it("should skip transitions if disabled and run when enabled",
           inject(function($animate, $rootScope, $compile, $sniffer, $timeout) {
 
@@ -1013,7 +1066,7 @@ describe("ngAnimate", function() {
           $rootScope.$digest();
           $timeout.flush();
 
-          expect(elements[0].attr('style')).toBeFalsy();
+          expect(elements[0].attr('style')).not.toContain('transition-delay');
           expect(elements[1].attr('style')).toMatch(/transition-delay: 2\.1\d*s,\s*4\.1\d*s/);
           expect(elements[2].attr('style')).toMatch(/transition-delay: 2\.2\d*s,\s*4\.2\d*s/);
           expect(elements[3].attr('style')).toMatch(/transition-delay: 2\.3\d*s,\s*4\.3\d*s/);
@@ -1030,7 +1083,7 @@ describe("ngAnimate", function() {
         ss.addRule('.ani.ng-enter, .ani.ng-leave',
           '-webkit-animation:my_animation 1s 1s, your_animation 1s 2s;' + 
           'animation:my_animation 1s 1s, your_animation 1s 2s;' +
-          '-webkit-transition:1s linear all 0s;' + 
+          '-webkit-transition:1s linear all 1s;' + 
           'transition:1s linear all 1s;');
 
         ss.addRule('.ani.ng-enter-stagger, .ani.ng-leave-stagger',
@@ -1731,6 +1784,7 @@ describe("ngAnimate", function() {
     expect(child.css(propertyKey)).toBe('background-color');
     child.remove();
 
+    child = $compile('...
')($rootScope);
     child.attr('class','trans');
     $animate.enter(child, element);
     $rootScope.$digest();
-- 
cgit v1.2.3