From 7774381486bbd9efc15b8d7d524751d71991fd0b Mon Sep 17 00:00:00 2001 From: Sebastian K Date: Fri, 22 Nov 2013 14:33:19 +0100 Subject: [PATCH] fix($location): $location.path() behaviour when $locationChangeStart is triggered by the browser Fixed inconsistency in $location.path() behaviour on the $locationChangeStart event when using back/forward buttons in the browser or manually changing the url in the address bar. $location.path() now returns the target url in these cases. Closes #4989 --- src/ng/location.js | 13 +++++++------ test/ng/locationSpec.js | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index f06a5f811a7d..d55f5075c619 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -612,16 +612,17 @@ function $LocationProvider(){ // update $location when $browser url changes $browser.onUrlChange(function(newUrl) { if ($location.absUrl() != newUrl) { - if ($rootScope.$broadcast('$locationChangeStart', newUrl, - $location.absUrl()).defaultPrevented) { - $browser.url($location.absUrl()); - return; - } $rootScope.$evalAsync(function() { var oldUrl = $location.absUrl(); $location.$$parse(newUrl); - afterLocationChange(oldUrl); + if ($rootScope.$broadcast('$locationChangeStart', newUrl, + oldUrl).defaultPrevented) { + $location.$$parse(oldUrl); + $browser.url(oldUrl); + } else { + afterLocationChange(oldUrl); + } }); if (!$rootScope.$$phase) $rootScope.$digest(); } diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index ad565772f8bb..eba1b1b39626 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -1377,6 +1377,31 @@ describe('$location', function() { dealoc($rootElement); }); }); + + it('should return the same $location.path() when $locationChangeStart event occurs no matter the cause of url change', function() { + inject(function($location, $rootScope, $browser, $window) { + var log = '', + base = $browser.url(); + + $rootScope.$on('$locationChangeStart', function() { + log += $location.path(); + }); + + // change through $location service + $location.path('/b'); + $rootScope.$apply(); + + // reset location + $location.path(''); + $rootScope.$apply(); + + // change through $browser + $browser.url(base + '#/b'); + $browser.poll(); + + expect(log).toEqual('/b//b'); + }); + }); }); describe('LocationHtml5Url', function() {