aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorNoam Lewis2013-12-30 20:10:23 -0500
committerJeff Cross2014-01-13 09:53:38 -0800
commit2cd09c9f0e7766bcd191662841b7b1ffc3b6dc3f (patch)
treea4cd4eebf7376ebd9370fe96f2cabb28f74e74eb /test
parent34fee06ca7db16549764f53c0382f2b6e2482201 (diff)
downloadangular.js-2cd09c9f0e7766bcd191662841b7b1ffc3b6dc3f.tar.bz2
fix($rootScope): prevent infinite $digest by checking if asyncQueue is empty when decrementing ttl
An infinite $digest loop can be caused by expressions that invoke a promise. The problem is that $digest does not decrement ttl unless it finds dirty changes; it should check also if asyncQueue is empty. Generally the condition for decrementing ttl should be the same as the condition for terminating the $digest loop. Fixes #2622
Diffstat (limited to 'test')
-rw-r--r--test/ng/rootScopeSpec.js25
1 files changed, 25 insertions, 0 deletions
diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js
index e47111e2..f9cf9412 100644
--- a/test/ng/rootScopeSpec.js
+++ b/test/ng/rootScopeSpec.js
@@ -258,6 +258,31 @@ describe('Scope', function() {
}));
+ it('should prevent infinite loop when creating and resolving a promise in a watched expression', function() {
+ module(function($rootScopeProvider) {
+ $rootScopeProvider.digestTtl(10);
+ });
+ inject(function($rootScope, $q) {
+ var d = $q.defer();
+
+ d.resolve('Hello, world.');
+ $rootScope.$watch(function () {
+ var $d2 = $q.defer();
+ $d2.resolve('Goodbye.');
+ $d2.promise.then(function () { });
+ return d.promise;
+ }, function () { return 0; });
+
+ expect(function() {
+ $rootScope.$digest();
+ }).toThrowMinErr('$rootScope', 'infdig', '10 $digest() iterations reached. Aborting!\n'+
+ 'Watchers fired in the last 5 iterations: []');
+
+ expect($rootScope.$$phase).toBeNull();
+ });
+ });
+
+
it('should not fire upon $watch registration on initial $digest', inject(function($rootScope) {
var log = '';
$rootScope.a = 1;