fix($location): allow navigating outside the original base URL
Previously, if you navigated outside of the current base URL angular crashed with a `Cannot call method 'charAt' of undefined` error. Closes #11302 Closes #4776
This commit is contained in:
committed by
Peter Bacon Darwin
parent
48e1f5605e
commit
6903b5ec4c
+10
-2
@@ -185,7 +185,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
||||
var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
|
||||
var withoutHashUrl;
|
||||
|
||||
if (withoutBaseUrl.charAt(0) === '#') {
|
||||
if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {
|
||||
|
||||
// The rest of the url starts with a hash so we have
|
||||
// got either a hashbang path or a plain hash fragment
|
||||
@@ -199,7 +199,15 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
||||
// There was no hashbang path nor hash fragment:
|
||||
// If we are in HTML5 mode we use what is left as the path;
|
||||
// Otherwise we ignore what is left
|
||||
withoutHashUrl = this.$$html5 ? withoutBaseUrl : '';
|
||||
if (this.$$html5) {
|
||||
withoutHashUrl = withoutBaseUrl;
|
||||
} else {
|
||||
withoutHashUrl = '';
|
||||
if (isUndefined(withoutBaseUrl)) {
|
||||
appBase = url;
|
||||
this.replace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
parseAppUrl(withoutHashUrl, this);
|
||||
|
||||
@@ -2462,6 +2462,14 @@ describe('$location', function() {
|
||||
it('should throw on url(urlString, stateObject)', function() {
|
||||
expectThrowOnStateChange(locationUrl);
|
||||
});
|
||||
|
||||
it('should allow navigating outside the original base URL', function() {
|
||||
locationUrl = new LocationHashbangUrl('http://server/pre/index.html', '#');
|
||||
|
||||
locationUrl.$$parse('http://server/next/index.html');
|
||||
expect(locationUrl.url()).toBe('');
|
||||
expect(locationUrl.absUrl()).toBe('http://server/next/index.html');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user