diff options
| -rw-r--r-- | src/ng/location.js | 21 | ||||
| -rw-r--r-- | 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 00f21559..7576015c 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 e6ee6604..543232c3 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('<a href="#/view1">v1</a><a href="#/view2">v2</a>')($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(); +      }); +    });    }); | 
