diff options
| -rw-r--r-- | scenario/location.html | 4 | ||||
| -rw-r--r-- | src/Angular.js | 6 | ||||
| -rw-r--r-- | src/services.js | 12 | ||||
| -rw-r--r-- | test/servicesSpec.js | 2 |
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(){ |
