mirror of
https://github.com/zhigang1992/angular.js.git
synced 2026-04-24 03:55:49 +08:00
fix($location): revert erroneous logic and backport refactorings from master
Backport of 22948807e3 without enforcing the `<base>` tag and without the new handling for links that only contain hash fragments.
Related to #6162
Closes #8492
This commit is contained in:
@@ -127,21 +127,26 @@ function LocationHtml5Url(appBase, basePrefix) {
|
||||
this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
|
||||
};
|
||||
|
||||
this.$$rewrite = function(url) {
|
||||
this.$$parseLinkUrl = function(url, relHref) {
|
||||
var appUrl, prevAppUrl;
|
||||
var rewrittenUrl;
|
||||
|
||||
if ( (appUrl = beginsWith(appBase, url)) !== undefined ) {
|
||||
prevAppUrl = appUrl;
|
||||
if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) {
|
||||
return appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
|
||||
rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
|
||||
} else {
|
||||
return appBase + prevAppUrl;
|
||||
rewrittenUrl = appBase + prevAppUrl;
|
||||
}
|
||||
} else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) {
|
||||
return appBaseNoFile + appUrl;
|
||||
rewrittenUrl = appBaseNoFile + appUrl;
|
||||
} else if (appBaseNoFile == url + '/') {
|
||||
return appBaseNoFile;
|
||||
rewrittenUrl = appBaseNoFile;
|
||||
}
|
||||
if (rewrittenUrl) {
|
||||
this.$$parse(rewrittenUrl);
|
||||
}
|
||||
return !!rewrittenUrl;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -231,10 +236,12 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
||||
this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
|
||||
};
|
||||
|
||||
this.$$rewrite = function(url) {
|
||||
this.$$parseLinkUrl = function(url, relHref) {
|
||||
if(stripHash(appBase) == stripHash(url)) {
|
||||
return url;
|
||||
this.$$parse(url);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -254,16 +261,21 @@ function LocationHashbangInHtml5Url(appBase, hashPrefix) {
|
||||
|
||||
var appBaseNoFile = stripFile(appBase);
|
||||
|
||||
this.$$rewrite = function(url) {
|
||||
this.$$parseLinkUrl = function(url, relHref) {
|
||||
var rewrittenUrl;
|
||||
var appUrl;
|
||||
|
||||
if ( appBase == stripHash(url) ) {
|
||||
return url;
|
||||
rewrittenUrl = url;
|
||||
} else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) {
|
||||
return appBase + hashPrefix + appUrl;
|
||||
rewrittenUrl = appBase + hashPrefix + appUrl;
|
||||
} else if ( appBaseNoFile === url + '/') {
|
||||
return appBaseNoFile;
|
||||
rewrittenUrl = appBaseNoFile;
|
||||
}
|
||||
if (rewrittenUrl) {
|
||||
this.$$parse(rewrittenUrl);
|
||||
}
|
||||
return !!rewrittenUrl;
|
||||
};
|
||||
|
||||
this.$$compose = function() {
|
||||
@@ -636,7 +648,7 @@ function $LocationProvider(){
|
||||
LocationMode = LocationHashbangUrl;
|
||||
}
|
||||
$location = new LocationMode(appBase, '#' + hashPrefix);
|
||||
$location.$$parse($location.$$rewrite(initialUrl));
|
||||
$location.$$parseLinkUrl(initialUrl, initialUrl);
|
||||
|
||||
var IGNORE_URI_REGEXP = /^\s*(javascript|mailto):/i;
|
||||
|
||||
@@ -655,6 +667,9 @@ function $LocationProvider(){
|
||||
}
|
||||
|
||||
var absHref = elm.prop('href');
|
||||
// get the actual href attribute - see
|
||||
// http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
|
||||
var relHref = elm.attr('href') || elm.attr('xlink:href');
|
||||
|
||||
if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {
|
||||
// SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
|
||||
@@ -665,50 +680,15 @@ function $LocationProvider(){
|
||||
// Ignore when url is started with javascript: or mailto:
|
||||
if (IGNORE_URI_REGEXP.test(absHref)) return;
|
||||
|
||||
// Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)
|
||||
// The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or
|
||||
// somewhere#anchor or http://example.com/somewhere
|
||||
if (LocationMode === LocationHashbangInHtml5Url) {
|
||||
// get the actual href attribute - see
|
||||
// http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
|
||||
var href = elm.attr('href') || elm.attr('xlink:href');
|
||||
|
||||
if (href && href.indexOf('://') < 0) { // Ignore absolute URLs
|
||||
var prefix = '#' + hashPrefix;
|
||||
if (href[0] == '/') {
|
||||
// absolute path - replace old path
|
||||
absHref = appBase + prefix + href;
|
||||
} else if (href[0] == '#') {
|
||||
// local anchor
|
||||
absHref = appBase + prefix + ($location.path() || '/') + href;
|
||||
} else {
|
||||
// relative path - join with current path
|
||||
var stack = $location.path().split("/"),
|
||||
parts = href.split("/");
|
||||
if (stack.length === 2 && !stack[1]) stack.length = 1;
|
||||
for (var i=0; i<parts.length; i++) {
|
||||
if (parts[i] == ".")
|
||||
continue;
|
||||
else if (parts[i] == "..")
|
||||
stack.pop();
|
||||
else if (parts[i].length)
|
||||
stack.push(parts[i]);
|
||||
}
|
||||
absHref = appBase + prefix + stack.join('/');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var rewrittenUrl = $location.$$rewrite(absHref);
|
||||
|
||||
if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
|
||||
event.preventDefault();
|
||||
if (rewrittenUrl != $browser.url()) {
|
||||
if (absHref && !elm.attr('target') && !event.isDefaultPrevented()) {
|
||||
if ($location.$$parseLinkUrl(absHref, relHref)) {
|
||||
event.preventDefault();
|
||||
// update location manually
|
||||
$location.$$parse(rewrittenUrl);
|
||||
$rootScope.$apply();
|
||||
// hack to work around FF6 bug 684208 when scenario runner clicks on links
|
||||
window.angular['ff-684208-preventDefault'] = true;
|
||||
if ($location.absUrl() != $browser.url()) {
|
||||
$rootScope.$apply();
|
||||
// hack to work around FF6 bug 684208 when scenario runner clicks on links
|
||||
window.angular['ff-684208-preventDefault'] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user