mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-01-12 22:45:52 +08:00
fix($location): correctly parse link urls in hashbang mode
This is a fix for a regression that was introduced by 92a2e180
Closes #1037
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user