| <!doctype html> |
| <meta charset="utf8"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <div id=log></div> |
| <script> |
| [ |
| { |
| "input": "z=b&a=b&z=a&a=a", |
| "output": [["a", "b"], ["a", "a"], ["z", "b"], ["z", "a"]] |
| }, |
| { |
| "input": "\uFFFD=x&\uFFFC&\uFFFD=a", |
| "output": [["\uFFFC", ""], ["\uFFFD", "x"], ["\uFFFD", "a"]] |
| }, |
| { |
| "input": "ffi&🌈", // 🌈 > code point, but < code unit because two code units |
| "output": [["🌈", ""], ["ffi", ""]] |
| }, |
| { |
| "input": "é&e\uFFFD&e\u0301", |
| "output": [["e\u0301", ""], ["e\uFFFD", ""], ["é", ""]] |
| }, |
| { |
| "input": "z=z&a=a&z=y&a=b&z=x&a=c&z=w&a=d&z=v&a=e&z=u&a=f&z=t&a=g", |
| "output": [["a", "a"], ["a", "b"], ["a", "c"], ["a", "d"], ["a", "e"], ["a", "f"], ["a", "g"], ["z", "z"], ["z", "y"], ["z", "x"], ["z", "w"], ["z", "v"], ["z", "u"], ["z", "t"]] |
| } |
| ].forEach((val) => { |
| test(() => { |
| let params = new URLSearchParams(val.input), |
| i = 0 |
| params.sort() |
| for(let param of params) { |
| assert_array_equals(param, val.output[i]) |
| i++ |
| } |
| }, "Parse and sort: " + val.input) |
| |
| test(() => { |
| let url = new URL("?" + val.input, "https://example/") |
| url.searchParams.sort() |
| let params = new URLSearchParams(url.search), |
| i = 0 |
| for(let param of params) { |
| assert_array_equals(param, val.output[i]) |
| i++ |
| } |
| }, "URL parse and sort: " + val.input) |
| }) |
| |
| test(function() { |
| const url = new URL("http://example.com/?") |
| url.searchParams.sort() |
| assert_equals(url.href, "http://example.com/") |
| assert_equals(url.search, "") |
| }, "Sorting non-existent params removes ? from URL") |
| </script> |