1test(function() { 2 var params = new URLSearchParams(); 3 assert_equals(params + '', ''); 4 params = new URLSearchParams(''); 5 assert_equals(params + '', ''); 6 params = new URLSearchParams('a=b'); 7 assert_equals(params + '', 'a=b'); 8 params = new URLSearchParams(params); 9 assert_equals(params + '', 'a=b'); 10}, 'Basic URLSearchParams construction'); 11 12test(function() { 13 var params = new URLSearchParams() 14 assert_equals(params.toString(), "") 15}, "URLSearchParams constructor, no arguments") 16 17test(function () { 18 var params = new URLSearchParams("?a=b") 19 assert_equals(params.toString(), "a=b") 20}, 'URLSearchParams constructor, remove leading "?"') 21 22test(() => { 23 var params = new URLSearchParams(DOMException); 24 assert_equals(params.toString(), "INDEX_SIZE_ERR=1&DOMSTRING_SIZE_ERR=2&HIERARCHY_REQUEST_ERR=3&WRONG_DOCUMENT_ERR=4&INVALID_CHARACTER_ERR=5&NO_DATA_ALLOWED_ERR=6&NO_MODIFICATION_ALLOWED_ERR=7&NOT_FOUND_ERR=8&NOT_SUPPORTED_ERR=9&INUSE_ATTRIBUTE_ERR=10&INVALID_STATE_ERR=11&SYNTAX_ERR=12&INVALID_MODIFICATION_ERR=13&NAMESPACE_ERR=14&INVALID_ACCESS_ERR=15&VALIDATION_ERR=16&TYPE_MISMATCH_ERR=17&SECURITY_ERR=18&NETWORK_ERR=19&ABORT_ERR=20&URL_MISMATCH_ERR=21"A_EXCEEDED_ERR=22&TIMEOUT_ERR=23&INVALID_NODE_TYPE_ERR=24&DATA_CLONE_ERR=25") 25 assert_throws_js(TypeError, () => new URLSearchParams(DOMException.prototype), 26 "Constructing a URLSearchParams from DOMException.prototype should throw due to branding checks"); 27}, "URLSearchParams constructor, DOMException as argument") 28 29test(() => { 30 var params = new URLSearchParams(''); 31 assert_true(params != null, 'constructor returned non-null value.'); 32 assert_equals(Object.getPrototypeOf(params), URLSearchParams.prototype, 'expected URLSearchParams.prototype as prototype.'); 33}, "URLSearchParams constructor, empty string as argument") 34 35test(() => { 36 var params = new URLSearchParams({}); 37 assert_equals(params + '', ""); 38}, 'URLSearchParams constructor, {} as argument'); 39 40test(function() { 41 var params = new URLSearchParams('a=b'); 42 assert_true(params != null, 'constructor returned non-null value.'); 43 assert_true(params.has('a'), 'Search params object has name "a"'); 44 assert_false(params.has('b'), 'Search params object has not got name "b"'); 45 46 params = new URLSearchParams('a=b&c'); 47 assert_true(params != null, 'constructor returned non-null value.'); 48 assert_true(params.has('a'), 'Search params object has name "a"'); 49 assert_true(params.has('c'), 'Search params object has name "c"'); 50 51 params = new URLSearchParams('&a&&& &&&&&a+b=& c&m%c3%b8%c3%b8'); 52 assert_true(params != null, 'constructor returned non-null value.'); 53 assert_true(params.has('a'), 'Search params object has name "a"'); 54 assert_true(params.has('a b'), 'Search params object has name "a b"'); 55 assert_true(params.has(' '), 'Search params object has name " "'); 56 assert_false(params.has('c'), 'Search params object did not have the name "c"'); 57 assert_true(params.has(' c'), 'Search params object has name " c"'); 58 assert_true(params.has('møø'), 'Search params object has name "møø"'); 59 60 params = new URLSearchParams('id=0&value=%'); 61 assert_true(params != null, 'constructor returned non-null value.'); 62 assert_true(params.has('id'), 'Search params object has name "id"'); 63 assert_true(params.has('value'), 'Search params object has name "value"'); 64 assert_equals(params.get('id'), '0'); 65 assert_equals(params.get('value'), '%'); 66 67 params = new URLSearchParams('b=%2sf%2a'); 68 assert_true(params != null, 'constructor returned non-null value.'); 69 assert_true(params.has('b'), 'Search params object has name "b"'); 70 assert_equals(params.get('b'), '%2sf*'); 71 72 params = new URLSearchParams('b=%2%2af%2a'); 73 assert_true(params != null, 'constructor returned non-null value.'); 74 assert_true(params.has('b'), 'Search params object has name "b"'); 75 assert_equals(params.get('b'), '%2*f*'); 76 77 params = new URLSearchParams('b=%%2a'); 78 assert_true(params != null, 'constructor returned non-null value.'); 79 assert_true(params.has('b'), 'Search params object has name "b"'); 80 assert_equals(params.get('b'), '%*'); 81}, 'URLSearchParams constructor, string.'); 82 83test(function() { 84 var seed = new URLSearchParams('a=b&c=d'); 85 var params = new URLSearchParams(seed); 86 assert_true(params != null, 'constructor returned non-null value.'); 87 assert_equals(params.get('a'), 'b'); 88 assert_equals(params.get('c'), 'd'); 89 assert_false(params.has('d')); 90 // The name-value pairs are copied when created; later updates 91 // should not be observable. 92 seed.append('e', 'f'); 93 assert_false(params.has('e')); 94 params.append('g', 'h'); 95 assert_false(seed.has('g')); 96}, 'URLSearchParams constructor, object.'); 97 98test(function() { 99 var formData = new FormData() 100 formData.append('a', 'b') 101 formData.append('c', 'd') 102 var params = new URLSearchParams(formData); 103 assert_true(params != null, 'constructor returned non-null value.'); 104 assert_equals(params.get('a'), 'b'); 105 assert_equals(params.get('c'), 'd'); 106 assert_false(params.has('d')); 107 // The name-value pairs are copied when created; later updates 108 // should not be observable. 109 formData.append('e', 'f'); 110 assert_false(params.has('e')); 111 params.append('g', 'h'); 112 assert_false(formData.has('g')); 113}, 'URLSearchParams constructor, FormData.'); 114 115test(function() { 116 var params = new URLSearchParams('a=b+c'); 117 assert_equals(params.get('a'), 'b c'); 118 params = new URLSearchParams('a+b=c'); 119 assert_equals(params.get('a b'), 'c'); 120}, 'Parse +'); 121 122test(function() { 123 const testValue = '+15555555555'; 124 const params = new URLSearchParams(); 125 params.set('query', testValue); 126 var newParams = new URLSearchParams(params.toString()); 127 128 assert_equals(params.toString(), 'query=%2B15555555555'); 129 assert_equals(params.get('query'), testValue); 130 assert_equals(newParams.get('query'), testValue); 131}, 'Parse encoded +'); 132 133test(function() { 134 var params = new URLSearchParams('a=b c'); 135 assert_equals(params.get('a'), 'b c'); 136 params = new URLSearchParams('a b=c'); 137 assert_equals(params.get('a b'), 'c'); 138}, 'Parse space'); 139 140test(function() { 141 var params = new URLSearchParams('a=b%20c'); 142 assert_equals(params.get('a'), 'b c'); 143 params = new URLSearchParams('a%20b=c'); 144 assert_equals(params.get('a b'), 'c'); 145}, 'Parse %20'); 146 147test(function() { 148 var params = new URLSearchParams('a=b\0c'); 149 assert_equals(params.get('a'), 'b\0c'); 150 params = new URLSearchParams('a\0b=c'); 151 assert_equals(params.get('a\0b'), 'c'); 152}, 'Parse \\0'); 153 154test(function() { 155 var params = new URLSearchParams('a=b%00c'); 156 assert_equals(params.get('a'), 'b\0c'); 157 params = new URLSearchParams('a%00b=c'); 158 assert_equals(params.get('a\0b'), 'c'); 159}, 'Parse %00'); 160 161test(function() { 162 var params = new URLSearchParams('a=b\u2384'); 163 assert_equals(params.get('a'), 'b\u2384'); 164 params = new URLSearchParams('a\u2384b=c'); 165 assert_equals(params.get('a\u2384b'), 'c'); 166}, 'Parse \u2384'); // Unicode Character 'COMPOSITION SYMBOL' (U+2384) 167 168test(function() { 169 var params = new URLSearchParams('a=b%e2%8e%84'); 170 assert_equals(params.get('a'), 'b\u2384'); 171 params = new URLSearchParams('a%e2%8e%84b=c'); 172 assert_equals(params.get('a\u2384b'), 'c'); 173}, 'Parse %e2%8e%84'); // Unicode Character 'COMPOSITION SYMBOL' (U+2384) 174 175test(function() { 176 var params = new URLSearchParams('a=b\uD83D\uDCA9c'); 177 assert_equals(params.get('a'), 'b\uD83D\uDCA9c'); 178 params = new URLSearchParams('a\uD83D\uDCA9b=c'); 179 assert_equals(params.get('a\uD83D\uDCA9b'), 'c'); 180}, 'Parse \uD83D\uDCA9'); // Unicode Character 'PILE OF POO' (U+1F4A9) 181 182test(function() { 183 var params = new URLSearchParams('a=b%f0%9f%92%a9c'); 184 assert_equals(params.get('a'), 'b\uD83D\uDCA9c'); 185 params = new URLSearchParams('a%f0%9f%92%a9b=c'); 186 assert_equals(params.get('a\uD83D\uDCA9b'), 'c'); 187}, 'Parse %f0%9f%92%a9'); // Unicode Character 'PILE OF POO' (U+1F4A9) 188 189test(function() { 190 var params = new URLSearchParams([]); 191 assert_true(params != null, 'constructor returned non-null value.'); 192 params = new URLSearchParams([['a', 'b'], ['c', 'd']]); 193 assert_equals(params.get("a"), "b"); 194 assert_equals(params.get("c"), "d"); 195 assert_throws_js(TypeError, function() { new URLSearchParams([[1]]); }); 196 assert_throws_js(TypeError, function() { new URLSearchParams([[1,2,3]]); }); 197}, "Constructor with sequence of sequences of strings"); 198 199[ 200 { "input": {"+": "%C2"}, "output": [["+", "%C2"]], "name": "object with +" }, 201 { "input": {c: "x", a: "?"}, "output": [["c", "x"], ["a", "?"]], "name": "object with two keys" }, 202 { "input": [["c", "x"], ["a", "?"]], "output": [["c", "x"], ["a", "?"]], "name": "array with two keys" }, 203 { "input": {"\uD835x": "1", "xx": "2", "\uD83Dx": "3"}, "output": [["\uFFFDx", "3"], ["xx", "2"]], "name": "2 unpaired surrogates (no trailing)" }, 204 { "input": {"x\uDC53": "1", "x\uDC5C": "2", "x\uDC65": "3"}, "output": [["x\uFFFD", "3"]], "name": "3 unpaired surrogates (no leading)" }, 205 { "input": {"a\0b": "42", "c\uD83D": "23", "d\u1234": "foo"}, "output": [["a\0b", "42"], ["c\uFFFD", "23"], ["d\u1234", "foo"]], "name": "object with NULL, non-ASCII, and surrogate keys" } 206].forEach((val) => { 207 test(() => { 208 let params = new URLSearchParams(val.input), 209 i = 0 210 for (let param of params) { 211 assert_array_equals(param, val.output[i]) 212 i++ 213 } 214 }, "Construct with " + val.name) 215}) 216 217test(() => { 218 var params = new URLSearchParams() 219 params[Symbol.iterator] = function *() { 220 yield ["a", "b"] 221 } 222 let params2 = new URLSearchParams(params) 223 assert_equals(params2.get("a"), "b") 224}, "Custom [Symbol.iterator]") 225