From c7493654a8875bba763c614312e18eef3df62df7 Mon Sep 17 00:00:00 2001 From: Rado Kirov Date: Fri, 21 Sep 2012 18:57:22 -0700 Subject: [PATCH] Fix($location): Reset $locaiton.$$replace with every watch call. fixes: 1111 --- src/ng/location.js | 5 +++-- test/ng/locationSpec.js | 15 +++++++++++++++ test/ng/routeSpec.js | 13 ++++--------- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index cf50952d53c3..73ef7f7b1db7 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -590,6 +590,7 @@ function $LocationProvider(){ var changeCounter = 0; $rootScope.$watch(function $locationWatch() { var oldUrl = $browser.url(); + var currentReplace = $location.$$replace; if (!changeCounter || oldUrl != $location.absUrl()) { changeCounter++; @@ -598,12 +599,12 @@ function $LocationProvider(){ defaultPrevented) { $location.$$parse(oldUrl); } else { - $browser.url($location.absUrl(), $location.$$replace); - $location.$$replace = false; + $browser.url($location.absUrl(), currentReplace); afterLocationChange(oldUrl); } }); } + $location.$$replace = false; return changeCounter; }); diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index 17ae13f35440..1caf9a1f53f7 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -447,6 +447,21 @@ describe('$location', function() { expect($browserUrl).toHaveBeenCalledOnce(); expect($browserUrl.mostRecentCall.args).toEqual(['http://new.com/a/b#!/n/url', true]); + expect($location.$$replace).toBe(false); + })); + + it('should always reset replace flag after running watch', + inject(function($rootScope, $location, $browser) { + + // triggers $evalAsync. + $location.replace(); + $rootScope.$apply(); + expect($location.$$replace).toBe(false); + + // doesn't trigger $evalAsync. + $location.replace(); + $rootScope.$apply(); + expect($location.$$replace).toBe(false); })); diff --git a/test/ng/routeSpec.js b/test/ng/routeSpec.js index 0e98be5fef94..52fffa406b69 100644 --- a/test/ng/routeSpec.js +++ b/test/ng/routeSpec.js @@ -560,20 +560,15 @@ describe('$route', function() { $routeProvider.when('/bar/:id', {templateUrl: 'bar.html'}); $routeProvider.when('/foo/:id/:extra', {redirectTo: '/bar/:id'}); }); - inject(function($route, $location, $rootScope) { - var replace; - - $rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) { - if (oldUrl == 'http://server/#/foo/id3/eId') { - replace = $location.$$replace; - } - }); + inject(function($browser, $route, $location, $rootScope) { + var $browserUrl = spyOnlyCallsWithArgs($browser, 'url').andCallThrough(); $location.path('/foo/id3/eId'); $rootScope.$digest(); expect($location.path()).toEqual('/bar/id3'); - expect(replace).toBe(true); + expect($browserUrl.mostRecentCall.args) + .toEqual(['http://server/#/bar/id3?extra=eId', true]); }); }); });