diff options
| -rw-r--r-- | src/Angular.js | 25 | ||||
| -rw-r--r-- | test/AngularSpec.js | 6 |
2 files changed, 28 insertions, 3 deletions
diff --git a/src/Angular.js b/src/Angular.js index 50d7d76c..839a5a77 100644 --- a/src/Angular.js +++ b/src/Angular.js @@ -822,16 +822,35 @@ function startingTag(element) { ///////////////////////////////////////////////// /** + * Tries to decode the URI component without throwing an exception. + * + * @private + * @param str value potential URI component to check. + * @returns {boolean} True if `value` can be decoded + * with the decodeURIComponent function. + */ +function tryDecodeURIComponent(value) { + try { + return decodeURIComponent(value); + } catch(e) { + // Ignore any invalid uri component + } +} + + +/** * Parses an escaped url query string into key-value pairs. * @returns Object.<(string|boolean)> */ function parseKeyValue(/**string*/keyValue) { var obj = {}, key_value, key; forEach((keyValue || "").split('&'), function(keyValue){ - if (keyValue) { + if ( keyValue ) { key_value = keyValue.split('='); - key = decodeURIComponent(key_value[0]); - obj[key] = isDefined(key_value[1]) ? decodeURIComponent(key_value[1]) : true; + key = tryDecodeURIComponent(key_value[0]); + if ( isDefined(key) ) { + obj[key] = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true; + } } }); return obj; diff --git a/test/AngularSpec.js b/test/AngularSpec.js index 7c004eb1..6384302c 100644 --- a/test/AngularSpec.js +++ b/test/AngularSpec.js @@ -312,6 +312,12 @@ describe('angular', function() { expect(parseKeyValue('flag1&key=value&flag2')). toEqual({flag1: true, key: 'value', flag2: true}); }); + it('should ignore key values that are not valid URI components', function() { + expect(function() { parseKeyValue('%'); }).not.toThrow(); + expect(parseKeyValue('%')).toEqual({}); + expect(parseKeyValue('invalid=%')).toEqual({ invalid: undefined }); + expect(parseKeyValue('invalid=%&valid=good')).toEqual({ invalid: undefined, valid: 'good' }); + }); }); describe('toKeyValue', function() { |
