Backed out changeset 2450366cf7ca (bug 1891629) for causing win msix mochitest failures
[gecko.git] / dom / url / tests / urlSearchParams_commons.js
blob4a1308b94b61bc0b9195843f18b8f07bba531b61
1 /* import-globals-from urlSearchParams_worker.js */
3 // This file gets included into a worker which doesn't have any
4 // assertion methods besides `ok` and `is`.
5 /* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */
7 function testSimpleURLSearchParams() {
8   var u = new URLSearchParams();
9   ok(u, "URLSearchParams created");
10   is(u.has("foo"), false, "URLSearchParams.has(foo)");
11   is(u.get("foo"), null, "URLSearchParams.get(foo)");
12   is(u.getAll("foo").length, 0, "URLSearchParams.getAll(foo)");
14   u.append("foo", "bar");
15   is(u.has("foo"), true, "URLSearchParams.has(foo)");
16   is(u.get("foo"), "bar", "URLSearchParams.get(foo)");
17   is(u.getAll("foo").length, 1, "URLSearchParams.getAll(foo)");
19   u.set("foo", "bar2");
20   is(u.get("foo"), "bar2", "URLSearchParams.get(foo)");
21   is(u.getAll("foo").length, 1, "URLSearchParams.getAll(foo)");
23   is(u + "", "foo=bar2", "stringifier");
25   u.delete("foo");
27   runTest();
30 function testCopyURLSearchParams() {
31   var u = new URLSearchParams();
32   ok(u, "URLSearchParams created");
33   u.append("foo", "bar");
35   var uu = new URLSearchParams(u);
36   is(uu.get("foo"), "bar", "uu.get()");
38   u.append("foo", "bar2");
39   is(u.getAll("foo").length, 2, "u.getAll()");
40   is(uu.getAll("foo").length, 1, "uu.getAll()");
42   runTest();
45 function testURL() {
46   var url = new URL("http://www.example.net?a=b&c=d");
47   ok(url.searchParams, "URL searchParams exists!");
48   ok(url.searchParams.has("a"), "URL.searchParams.has('a')");
49   is(url.searchParams.get("a"), "b", "URL.searchParams.get('a')");
50   ok(url.searchParams.has("c"), "URL.searchParams.has('c')");
51   is(url.searchParams.get("c"), "d", "URL.searchParams.get('c')");
53   url.searchParams.set("e", "f");
54   ok(url.href.indexOf("e=f") != 1, "URL right");
56   url = new URL("mailto:a@b.com?subject=Hi");
57   ok(url.searchParams, "URL searchParams exists!");
58   ok(url.searchParams.has("subject"), "Hi");
60   runTest();
63 function testParserURLSearchParams() {
64   var checks = [
65     { input: "", data: {} },
66     { input: "a", data: { a: [""] } },
67     { input: "a=b", data: { a: ["b"] } },
68     { input: "a=", data: { a: [""] } },
69     { input: "=b", data: { "": ["b"] } },
70     { input: "&", data: {} },
71     { input: "&a", data: { a: [""] } },
72     { input: "a&", data: { a: [""] } },
73     { input: "a&a", data: { a: ["", ""] } },
74     { input: "a&b&c", data: { a: [""], b: [""], c: [""] } },
75     { input: "a=b&c=d", data: { a: ["b"], c: ["d"] } },
76     { input: "a=b&c=d&", data: { a: ["b"], c: ["d"] } },
77     { input: "&&&a=b&&&&c=d&", data: { a: ["b"], c: ["d"] } },
78     { input: "a=a&a=b&a=c", data: { a: ["a", "b", "c"] } },
79     { input: "a==a", data: { a: ["=a"] } },
80     { input: "a=a+b+c+d", data: { a: ["a b c d"] } },
81     { input: "%=a", data: { "%": ["a"] } },
82     { input: "%a=a", data: { "%a": ["a"] } },
83     { input: "%a_=a", data: { "%a_": ["a"] } },
84     { input: "%61=a", data: { a: ["a"] } },
85     { input: "%=a", data: { "%": ["a"] } },
86     { input: "%a=a", data: { "%a": ["a"] } },
87     { input: "%a_=a", data: { "%a_": ["a"] } },
88     { input: "%61=a", data: { a: ["a"] } },
89     { input: "%61+%4d%4D=", data: { "a MM": [""] } },
90     { input: "?a=1", data: { a: ["1"] } },
91     { input: "?", data: {} },
92     { input: "?=b", data: { "": ["b"] } },
93   ];
95   for (var i = 0; i < checks.length; ++i) {
96     var u = new URLSearchParams(checks[i].input);
98     var count = 0;
99     for (var key in checks[i].data) {
100       count = count + 1;
101       ok(u.has(key), "key " + key + " found");
103       var all = u.getAll(key);
104       is(all.length, checks[i].data[key].length, "same number of elements");
106       for (var k = 0; k < all.length; ++k) {
107         is(all[k], checks[i].data[key][k], "value matches");
108       }
109     }
110   }
112   runTest();
115 function testEncoding() {
116   var encoding = [
117     ["1", "1"],
118     ["a b", "a+b"],
119     ["<>", "%3C%3E"],
120     ["\u0541", "%D5%81"],
121   ];
123   for (var i = 0; i < encoding.length; ++i) {
124     var url = new URL("http://www.example.net");
125     url.searchParams.set("a", encoding[i][0]);
126     is(url.href, "http://www.example.net/?a=" + encoding[i][1]);
128     var url2 = new URL(url.href);
129     is(url2.searchParams.get("a"), encoding[i][0], "a is still there");
130   }
132   runTest();
135 function testCopyConstructor() {
136   var url = new URL("http://example.com/");
137   var p = url.searchParams;
138   var q = new URLSearchParams(p);
139   q.set("a", "b");
140   is(
141     url.href,
142     "http://example.com/",
143     "Messing with copy of URLSearchParams should not affect URL"
144   );
145   p.set("c", "d");
146   is(
147     url.href,
148     "http://example.com/?c=d",
149     "Messing with URLSearchParams should affect URL"
150   );
152   runTest();
155 function testOrdering() {
156   var a = new URLSearchParams("a=1&a=2&b=3&c=4&c=5&a=6");
157   is(a.toString(), "a=1&a=2&b=3&c=4&c=5&a=6", "Order is correct");
158   is(a.getAll("a").length, 3, "Correct length of getAll()");
160   var b = new URLSearchParams();
161   b.append("a", "1");
162   b.append("b", "2");
163   b.append("a", "3");
164   is(b.toString(), "a=1&b=2&a=3", "Order is correct");
165   is(b.getAll("a").length, 2, "Correct length of getAll()");
167   runTest();
170 function testDelete() {
171   var a = new URLSearchParams("a=1&a=2&b=3&c=4&c=5&a=6");
172   is(a.toString(), "a=1&a=2&b=3&c=4&c=5&a=6", "Order is correct");
173   is(a.getAll("a").length, 3, "Correct length of getAll()");
175   a.delete("a");
176   is(a.getAll("a").length, 0, "Correct length of getAll()");
177   is(a.toString(), "b=3&c=4&c=5", "Order is correct");
179   runTest();
182 function testGetNULL() {
183   var u = new URLSearchParams();
184   is(typeof u.get(""), "object", "typeof URL.searchParams.get('')");
185   is(u.get(""), null, "URL.searchParams.get('') should be null");
187   var url = new URL("http://www.example.net?a=b");
188   is(
189     url.searchParams.get("b"),
190     null,
191     "URL.searchParams.get('b') should be null"
192   );
193   is(url.searchParams.get("a"), "b", "URL.searchParams.get('a')");
195   runTest();
198 function testSet() {
199   var u = new URLSearchParams();
200   u.set("a", "b");
201   u.set("e", "c");
202   u.set("i", "d");
203   u.set("o", "f");
204   u.set("u", "g");
206   is(u.get("a"), "b", "URL.searchParams.get('a') should return b");
207   is(u.getAll("a").length, 1, "URLSearchParams.getAll('a').length should be 1");
209   u.set("a", "h1");
210   u.set("a", "h2");
211   u.set("a", "h3");
212   u.set("a", "h4");
213   is(u.get("a"), "h4", "URL.searchParams.get('a') should return h4");
214   is(u.getAll("a").length, 1, "URLSearchParams.getAll('a').length should be 1");
216   is(u.get("e"), "c", "URL.searchParams.get('e') should return c");
217   is(u.get("i"), "d", "URL.searchParams.get('i') should return d");
218   is(u.get("o"), "f", "URL.searchParams.get('o') should return f");
219   is(u.get("u"), "g", "URL.searchParams.get('u') should return g");
221   is(u.getAll("e").length, 1, "URLSearchParams.getAll('e').length should be 1");
222   is(u.getAll("i").length, 1, "URLSearchParams.getAll('i').length should be 1");
223   is(u.getAll("o").length, 1, "URLSearchParams.getAll('o').length should be 1");
224   is(u.getAll("u").length, 1, "URLSearchParams.getAll('u').length should be 1");
226   u = new URLSearchParams("name1=value1&name1=value2&name1=value3");
227   is(
228     u.get("name1"),
229     "value1",
230     "URL.searchParams.get('name1') should return value1"
231   );
232   is(
233     u.getAll("name1").length,
234     3,
235     "URLSearchParams.getAll('name1').length should be 3"
236   );
237   u.set("name1", "firstPair");
238   is(
239     u.get("name1"),
240     "firstPair",
241     "URL.searchParams.get('name1') should return firstPair"
242   );
243   is(
244     u.getAll("name1").length,
245     1,
246     "URLSearchParams.getAll('name1').length should be 1"
247   );
249   runTest();
252 function testIterable() {
253   var u = new URLSearchParams();
254   u.set("1", "2");
255   u.set("2", "4");
256   u.set("3", "6");
257   u.set("4", "8");
258   u.set("5", "10");
260   var key_iter = u.keys();
261   var value_iter = u.values();
262   var entries_iter = u.entries();
263   for (var i = 0; i < 5; ++i) {
264     var v = i + 1;
265     var key = key_iter.next();
266     var value = value_iter.next();
267     var entry = entries_iter.next();
268     is(key.value, v.toString(), "Correct Key iterator: " + v.toString());
269     ok(!key.done, "Key.done is false");
270     is(
271       value.value,
272       (v * 2).toString(),
273       "Correct Value iterator: " + (v * 2).toString()
274     );
275     ok(!value.done, "Value.done is false");
276     is(
277       entry.value[0],
278       v.toString(),
279       "Correct Entry 0 iterator: " + v.toString()
280     );
281     is(
282       entry.value[1],
283       (v * 2).toString(),
284       "Correct Entry 1 iterator: " + (v * 2).toString()
285     );
286     ok(!entry.done, "Entry.done is false");
287   }
289   var last = key_iter.next();
290   ok(last.done, "Nothing more to read.");
291   is(last.value, undefined, "Undefined is the last key");
293   last = value_iter.next();
294   ok(last.done, "Nothing more to read.");
295   is(last.value, undefined, "Undefined is the last value");
297   last = entries_iter.next();
298   ok(last.done, "Nothing more to read.");
300   key_iter = u.keys();
301   key_iter.next();
302   key_iter.next();
303   u.delete("1");
304   u.delete("2");
305   u.delete("3");
306   u.delete("4");
307   u.delete("5");
309   last = key_iter.next();
310   ok(last.done, "Nothing more to read.");
311   is(last.value, undefined, "Undefined is the last key");
313   runTest();
315 function testZeroHandling() {
316   var u = new URLSearchParams();
317   u.set("a", "b\0c");
318   u.set("d\0e", "f");
319   u.set("g\0h", "i\0j");
320   is(
321     u.toString(),
322     "a=b%00c&d%00e=f&g%00h=i%00j",
323     "Should encode U+0000 as %00"
324   );
326   runTest();
329 function testCTORs() {
330   var a = new URLSearchParams("a=b");
331   is(a.get("a"), "b", "CTOR with string");
333   var b = new URLSearchParams([
334     ["a", "b"],
335     ["c", "d"],
336   ]);
337   is(b.get("a"), "b", "CTOR with sequence");
338   is(b.get("c"), "d", "CTOR with sequence");
340   ok(new URLSearchParams([]), "CTOR with empty sequence");
342   let result;
343   try {
344     result = new URLSearchParams([[1]]);
345   } catch (e) {
346     result = 42;
347   }
349   is(
350     result,
351     42,
352     "CTOR throws if the sequence doesn't contain exactly 2 elements"
353   );
355   try {
356     result = new URLSearchParams([[1, 2, 3]]);
357   } catch (e) {
358     result = 43;
359   }
360   is(
361     result,
362     43,
363     "CTOR throws if the sequence doesn't contain exactly 2 elements"
364   );
366   var c = new URLSearchParams({
367     a: "b",
368     c: 42,
369     d: null,
370     e: [1, 2, 3],
371     f: { a: 42 },
372   });
373   is(c.get("a"), "b", "CTOR with record<>");
374   is(c.get("c"), "42", "CTOR with record<>");
375   is(c.get("d"), "null", "CTOR with record<>");
376   is(c.get("e"), [1, 2, 3].toString(), "CTOR with record<>");
377   is(c.get("f"), { a: 42 }.toString(), "CTOR with record<>");
379   runTest();