fix up the $location encoding

This commit is contained in:
Misko Hevery 2010-07-30 10:56:36 -07:00
parent af1eb6914e
commit cdda664f89
4 changed files with 18 additions and 6 deletions

View file

@ -6,6 +6,10 @@
</head>
<body ng:init="$window.$scope = this">
<pre>$location={{$location}}</pre>
Hash Search:
<ul>
<li ng:repeat="(key, value) in $location.hashSearch"><tt>{{key}}={{value}}</tt></li>
</ul>
<hr/>
href: <input type="text" name="$location.href" size="120"/> <br/>
hash: <input type="text" name="$location.hash" size="120"/> <br/>

View file

@ -352,8 +352,8 @@ function parseKeyValue(keyValue) {
foreach((keyValue || "").split('&'), function(keyValue){
if (keyValue) {
key_value = keyValue.split('=');
key = decodeURIComponent(key_value[0]);
obj[key] = key_value[1] ? decodeURIComponent(key_value[1]) : true;
key = unescape(key_value[0]);
obj[key] = key_value[1] ? unescape(key_value[1]) : true;
}
});
return obj;
@ -362,7 +362,7 @@ function parseKeyValue(keyValue) {
function toKeyValue(obj) {
var parts = [];
foreach(obj, function(value, key){
parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
parts.push(escape(key) + '=' + escape(value));
});
return parts.length ? parts.join('&') : '';
}

View file

@ -26,7 +26,7 @@ angularService("$location", function(browser){
} else {
href = check('href') || check('protocol', '://', 'host', ':', 'port', '', 'path', '?', 'search');
var hash = check('hash');
if (isUndefined(hash)) hash = check('hashPath', '?', 'hashSearch');
if (isUndefined(hash)) hash = checkHashPathSearch();
if (isDefined(hash)) {
href = (href || location.href).split('#')[0];
href+= '#' + hash;
@ -53,6 +53,14 @@ angularService("$location", function(browser){
return same ? undefined : parts.join('');
}
function checkHashPathSearch(){
if (lastLocation.hashPath === location.hashPath &&
equals(lastLocation.hashSearch, location.hashSearch) )
return undefined;
var url = toKeyValue(location.hashSearch);
return escape(location.hashPath) + (url ? '?' + url : '');
}
function parseUrl(url){
if (isDefined(url)) {
var match = URL_MATCH.exec(url);
@ -67,7 +75,7 @@ angularService("$location", function(browser){
if (location.hash)
location.hash = location.hash.substr(1);
match = HASH_MATCH.exec(location.hash);
location.hashPath = match[1] || '';
location.hashPath = unescape(match[1] || '');
location.hashSearch = parseKeyValue(match[3]);
copy(location, lastLocation);

View file

@ -91,7 +91,7 @@ describe("service", function(){
scope.$location.hashPath = 'page=http://path';
scope.$location.hashSearch = {k:'a=b'};
expect(scope.$location.toString()).toEqual('http://host:123/p/a/t/h.html?query=value#page=http://path?k=a%3Db');
expect(scope.$location.toString()).toEqual('http://host:123/p/a/t/h.html?query=value#page%3Dhttp%3A//path?k=a%3Db');
});
it('should parse file://', function(){