From 74fa65ecb7c4e2df966a179952b35700912e065f Mon Sep 17 00:00:00 2001 From: Misko Hevery Date: Mon, 11 Jun 2012 21:24:23 -0700 Subject: [PATCH] fix($location): correctly parse link urls in hashbang mode This is a fix for a regression that was introduced by 92a2e180 Closes #1037 --- src/ng/location.js | 21 +++++++++++++-------- test/ng/locationSpec.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/ng/location.js b/src/ng/location.js index 00f21559a950..7576015c5d5e 100644 --- a/src/ng/location.js +++ b/src/ng/location.js @@ -476,12 +476,14 @@ function $LocationProvider(){ this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', function( $rootScope, $browser, $sniffer, $rootElement) { var $location, - basePath = $browser.baseHref() || '/', - pathPrefix = pathPrefixFromBase(basePath), + basePath, + pathPrefix, initUrl = $browser.url(), absUrlPrefix; if (html5Mode) { + basePath = $browser.baseHref() || '/'; + pathPrefix = pathPrefixFromBase(basePath); if ($sniffer.history) { $location = new LocationUrl( convertToHtml5Url(initUrl, basePath, hashPrefix), @@ -491,14 +493,14 @@ function $LocationProvider(){ convertToHashbangUrl(initUrl, basePath, hashPrefix), hashPrefix); } + // link rewriting + absUrlPrefix = composeProtocolHostPort( + $location.protocol(), $location.host(), $location.port()) + pathPrefix; } else { $location = new LocationHashbangUrl(initUrl, hashPrefix); + absUrlPrefix = $location.absUrl().split('#')[0]; } - // link rewriting - absUrlPrefix = composeProtocolHostPort( - $location.protocol(), $location.host(), $location.port()) + pathPrefix; - $rootElement.bind('click', function(event) { // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser) // currently we open nice url link and redirect then @@ -512,7 +514,8 @@ function $LocationProvider(){ elm = elm.parent(); } - var absHref = elm.prop('href'); + var absHref = elm.prop('href'), + href; if (!absHref || elm.attr('target') || @@ -521,7 +524,9 @@ function $LocationProvider(){ } // update location with href without the prefix - $location.url(absHref.substr(absUrlPrefix.length)); + href = absHref.substr(absUrlPrefix.length); + if (href.charAt(0) == '#') href = href.substr(1); + $location.url(href); $rootScope.$apply(); event.preventDefault(); // hack to work around FF6 bug 684208 when scenario runner clicks on links diff --git a/test/ng/locationSpec.js b/test/ng/locationSpec.js index e6ee660464b6..543232c3a70f 100644 --- a/test/ng/locationSpec.js +++ b/test/ng/locationSpec.js @@ -968,6 +968,37 @@ describe('$location', function() { ); }); } + + + it('should not mess up hash urls when clicking on links in hashbang mode', function() { + var base; + module(function() { + return function($browser) { + window.location.hash = 'someHash'; + base = window.location.href + $browser.url(base); + base = base.split('#')[0]; + } + }); + inject(function($rootScope, $compile, $browser, $rootElement, $document, $location) { + // we need to do this otherwise we can't simulate events + $document.find('body').append($rootElement); + + var element = $compile('v1v2')($rootScope); + $rootElement.append(element); + var av1 = $rootElement.find('a').eq(0); + var av2 = $rootElement.find('a').eq(1); + + + browserTrigger(av1, 'click'); + expect($browser.url()).toEqual(base + '#/view1'); + + browserTrigger(av2, 'click'); + expect($browser.url()).toEqual(base + '#/view2'); + + $rootElement.remove(); + }); + }); });