From d3c486dd6dfa8d5dca32a3e28aa685fb7260c878 Mon Sep 17 00:00:00 2001 From: Thomas Guillory Date: Wed, 6 Nov 2013 15:01:10 +0100 Subject: fix($rootScope): clear phase if an exception is raised by a watcher Add calls to clearPhase() when an exception is raised by a watcher while a digest cycle, in order to not be stuck on `$digest` scope phase --- src/ng/rootScope.js | 2 ++ test/ng/rootScopeSpec.js | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/src/ng/rootScope.js b/src/ng/rootScope.js index 1d8d4e77..13ee4c70 100644 --- a/src/ng/rootScope.js +++ b/src/ng/rootScope.js @@ -562,6 +562,7 @@ function $RootScopeProvider(){ asyncTask = asyncQueue.shift(); asyncTask.scope.$eval(asyncTask.expression); } catch (e) { + clearPhase(); $exceptionHandler(e); } } @@ -594,6 +595,7 @@ function $RootScopeProvider(){ } } } catch (e) { + clearPhase(); $exceptionHandler(e); } } diff --git a/test/ng/rootScopeSpec.js b/test/ng/rootScopeSpec.js index 894c26d2..69447a3c 100644 --- a/test/ng/rootScopeSpec.js +++ b/test/ng/rootScopeSpec.js @@ -127,6 +127,15 @@ describe('Scope', function() { }); }); + it('should clear phase if an exception interrupt $digest cycle', function() { + inject(function($rootScope) { + $rootScope.$watch('a', function() {throw new Error('abc');}); + $rootScope.a = 1; + try { $rootScope.$digest(); } catch(e) { } + expect($rootScope.$$phase).toBeNull(); + }); + }); + it('should fire watches in order of addition', inject(function($rootScope) { // this is not an external guarantee, just our own sanity -- cgit v1.2.3