diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngAnimate/animate.js | 37 | ||||
| -rw-r--r-- | src/ngMock/angular-mocks.js | 21 | 
2 files changed, 51 insertions, 7 deletions
| diff --git a/src/ngAnimate/animate.js b/src/ngAnimate/animate.js index 22a9dde7..0417f18e 100644 --- a/src/ngAnimate/animate.js +++ b/src/ngAnimate/animate.js @@ -248,6 +248,28 @@ angular.module('ngAnimate', ['ng'])     * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.     *     */ +  .factory('$$animateReflow', ['$window', '$timeout', function($window, $timeout) { +    var requestAnimationFrame = $window.requestAnimationFrame       || +                                $window.mozRequestAnimationFrame    || +                                $window.webkitRequestAnimationFrame || +                                function(fn) { +                                  return $timeout(fn, 10, false); +                                }; + +    var cancelAnimationFrame = $window.cancelAnimationFrame       || +                               $window.mozCancelAnimationFrame    || +                               $window.webkitCancelAnimationFrame || +                               function(timer) { +                                 return $timeout.cancel(timer); +                               }; +    return function(fn) { +      var id = requestAnimationFrame(fn); +      return function() { +        cancelAnimationFrame(id); +      }; +    }; +  }]) +    .config(['$provide', '$animateProvider', function($provide, $animateProvider) {      var noop = angular.noop;      var forEach = angular.forEach; @@ -872,7 +894,8 @@ angular.module('ngAnimate', ['ng'])        }      }]); -    $animateProvider.register('', ['$window', '$sniffer', '$timeout', function($window, $sniffer, $timeout) { +    $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow', +                           function($window,   $sniffer,   $timeout,   $$animateReflow) {        // Detect proper transitionend/animationend event names.        var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT; @@ -917,11 +940,13 @@ angular.module('ngAnimate', ['ng'])        var parentCounter = 0;        var animationReflowQueue = [];        var animationElementQueue = []; -      var animationTimer; +      var cancelAnimationReflow;        var closingAnimationTime = 0;        var timeOut = false;        function afterReflow(element, callback) { -        $timeout.cancel(animationTimer); +        if(cancelAnimationReflow) { +          cancelAnimationReflow(); +        }          animationReflowQueue.push(callback); @@ -942,7 +967,7 @@ angular.module('ngAnimate', ['ng'])          //a follow-up animation is midway in its animation          elementData.animationCount = animationCounter; -        animationTimer = $timeout(function() { +        cancelAnimationReflow = $$animateReflow(function() {            forEach(animationReflowQueue, function(fn) {              fn();            }); @@ -963,11 +988,11 @@ angular.module('ngAnimate', ['ng'])            animationReflowQueue = [];            animationElementQueue = []; -          animationTimer = null; +          cancelAnimationReflow = null;            lookupCache = {};            closingAnimationTime = 0;            animationCounter++; -        }, 10, false); +        });        }        function closeAllAnimations(elements, count) { diff --git a/src/ngMock/angular-mocks.js b/src/ngMock/angular-mocks.js index b53b4e02..803cedbd 100644 --- a/src/ngMock/angular-mocks.js +++ b/src/ngMock/angular-mocks.js @@ -756,6 +756,26 @@ angular.mock.TzDate = function (offset, timestamp) {  angular.mock.TzDate.prototype = Date.prototype;  /* jshint +W101 */ +angular.module('ngAnimate').config(['$provide', function($provide) { +  var reflowQueue = []; +  $provide.value('$$animateReflow', function(fn) { +    reflowQueue.push(fn); +    return angular.noop; +  }); +  $provide.decorator('$animate', function($delegate) { +    $delegate.triggerReflow = function() { +      if(reflowQueue.length === 0) { +        throw new Error('No animation reflows present'); +      } +      angular.forEach(reflowQueue, function(fn) { +        fn(); +      }); +      reflowQueue = []; +    }; +    return $delegate; +  }); +}]); +  angular.mock.animate = angular.module('mock.animate', ['ng'])    .config(['$provide', function($provide) { @@ -1913,7 +1933,6 @@ angular.mock.clearDataCache = function() {  }; -  if(window.jasmine || window.mocha) {    var currentSpec = null, | 
