diff options
| -rw-r--r-- | src/ng/raf.js | 24 | ||||
| -rw-r--r-- | test/ng/rafSpec.js | 32 | 
2 files changed, 48 insertions, 8 deletions
| diff --git a/src/ng/raf.js b/src/ng/raf.js index f4eb31c0..e07adbfe 100644 --- a/src/ng/raf.js +++ b/src/ng/raf.js @@ -1,7 +1,7 @@  'use strict';  function $$RAFProvider(){ //rAF -  this.$get = ['$window', function($window) { +  this.$get = ['$window', '$timeout', function($window, $timeout) {      var requestAnimationFrame = $window.requestAnimationFrame ||                                  $window.webkitRequestAnimationFrame ||                                  $window.mozRequestAnimationFrame; @@ -10,14 +10,22 @@ function $$RAFProvider(){ //rAF                                 $window.webkitCancelAnimationFrame ||                                 $window.mozCancelAnimationFrame; -    var raf = function(fn) { -      var id = requestAnimationFrame(fn); -      return function() { -        cancelAnimationFrame(id); -      }; -    }; +    var rafSupported = !!requestAnimationFrame; +    var raf = rafSupported +      ? function(fn) { +          var id = requestAnimationFrame(fn); +          return function() { +            cancelAnimationFrame(id); +          }; +        } +      : function(fn) { +          var timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666 +          return function() { +            $timeout.cancel(timer); +          }; +        }; -    raf.supported = !!requestAnimationFrame; +    raf.supported = rafSupported;      return raf;    }]; diff --git a/test/ng/rafSpec.js b/test/ng/rafSpec.js index 6c15e2d2..8bf76efd 100644 --- a/test/ng/rafSpec.js +++ b/test/ng/rafSpec.js @@ -31,6 +31,38 @@ describe('$$rAF', function() {      expect(present).toBe(true);    })); +  describe('$timeout fallback', function() { +    it("it should use a $timeout incase native rAF isn't suppored", function() { +      var timeoutSpy = jasmine.createSpy('callback'); + +      //we need to create our own injector to work around the ngMock overrides +      var injector = createInjector(['ng', function($provide) { +        $provide.value('$timeout', timeoutSpy); +        $provide.decorator('$window', function($delegate) { +          $delegate.requestAnimationFrame = false; +          $delegate.webkitRequestAnimationFrame = false; +          $delegate.mozRequestAnimationFrame = false; +          return $delegate; +        }); +      }]); + +      var $$rAF = injector.get('$$rAF'); +      expect($$rAF.supported).toBe(false); + +      var message; +      $$rAF(function() { +        message = 'on'; +      }); + +      expect(message).toBeUndefined(); +      expect(timeoutSpy).toHaveBeenCalled(); + +      timeoutSpy.mostRecentCall.args[0](); + +      expect(message).toBe('on'); +    }); +  }); +    describe('mocks', function() {      it('should throw an error if no frames are present', inject(function($$rAF) {        if($$rAF.supported) { | 
