aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMisko Hevery2010-07-30 10:56:36 -0700
committerMisko Hevery2010-07-30 10:56:36 -0700
commitcdda664f8990351453baa26fc3dcd53329e72e68 (patch)
tree77cb533770c67d2a032a259bd093c3fa3a16899d
parentaf1eb6914e6e4b72e6baabb075138b7716184ff7 (diff)
downloadangular.js-cdda664f8990351453baa26fc3dcd53329e72e68.tar.bz2
fix up the $location encoding
-rw-r--r--scenario/location.html4
-rw-r--r--src/Angular.js6
-rw-r--r--src/services.js12
-rw-r--r--test/servicesSpec.js2
4 files changed, 18 insertions, 6 deletions
diff --git a/scenario/location.html b/scenario/location.html
index a162636b..75041615 100644
--- a/scenario/location.html
+++ b/scenario/location.html
@@ -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/>
diff --git a/src/Angular.js b/src/Angular.js
index 33bf86ea..a6fc28b3 100644
--- a/src/Angular.js
+++ b/src/Angular.js
@@ -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('&') : '';
}
diff --git a/src/services.js b/src/services.js
index 3dd7df09..6a52d25a 100644
--- a/src/services.js
+++ b/src/services.js
@@ -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);
diff --git a/test/servicesSpec.js b/test/servicesSpec.js
index cb5c9b30..ffd01267 100644
--- a/test/servicesSpec.js
+++ b/test/servicesSpec.js
@@ -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(){