diff options
author | Marcos Casagrande <marcoscvp90@gmail.com> | 2020-04-28 07:23:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-28 01:23:06 -0400 |
commit | 2fc5878668d8f08ec6989d07e79125d640a73d43 (patch) | |
tree | 6c4d617e8b0431ab7258de15cafba2bc5e14f547 /cli/js/tests/url_test.ts | |
parent | 15099cc0160a6f1bc5f569c44018da6f5a186138 (diff) |
Change URL.port implementation to match WHATWG specifications (#4954)
Changed `URL.port` implementation to match [WHATWG
specifications](https://url.spec.whatwg.org/#port-state).
This PR matches the behaviour of other browsers:
1. a `TypeError` must be thrown when passing an URL with an invalid
port to the constructor.
2. When setting an invalid port, using property setter, I haven't found
what should happen in this case, so I mimic **Firefox** & **Node**
behaviour. If an invalid port is set, it will use the previous value.
**Chrome** sets the value to `'0'` if an invalid port is set. I prefer
to keep the previous valid value. (I can use Chrome's behaviour if you
think it's better, it's a simple value change)
```
url.port = '3000'; // valid
url.port = 'deno'; // invalid
assertEquals(url.port, '3000');
```
3. If the port value equals the current protocol default port value,
`port` will be an empty string.
Diffstat (limited to 'cli/js/tests/url_test.ts')
-rw-r--r-- | cli/js/tests/url_test.ts | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/cli/js/tests/url_test.ts b/cli/js/tests/url_test.ts index e4d497ffb..e8348b206 100644 --- a/cli/js/tests/url_test.ts +++ b/cli/js/tests/url_test.ts @@ -212,3 +212,104 @@ unitTest(function createBadUrl(): void { new URL("0.0.0.0:8080"); }); }); + +unitTest(function throwForInvalidPortConstructor(): void { + const urls = [ + // If port is greater than 2^16 − 1, validation error, return failure. + `https://baz.qat:${2 ** 16}`, + "https://baz.qat:-32", + "https://baz.qat:deno", + ]; + + for (const url of urls) { + assertThrows(() => new URL(url)); + } +}); + +unitTest(function doNotOverridePortIfInvalid(): void { + const initialPort = "3000"; + const ports = [ + // If port is greater than 2^16 − 1, validation error, return failure. + `${2 ** 16}`, + "-32", + "deno", + ]; + + for (const port of ports) { + const url = new URL(`https://deno.land:${initialPort}`); + url.port = port; + assertEquals(url.port, initialPort); + } +}); + +unitTest(function doNotOverridePortIfInvalid(): void { + const initialPort = "3000"; + const ports = [ + // If port is greater than 2^16 − 1, validation error, return failure. + `${2 ** 16}`, + "-32", + "deno", + ]; + + for (const port of ports) { + const url = new URL(`https://deno.land:${initialPort}`); + url.port = port; + assertEquals(url.port, initialPort); + } +}); + +unitTest(function emptyPortForSchemeDefaultPort(): void { + const nonDefaultPort = "3500"; + const urls = [ + { url: "ftp://baz.qat:21", port: "21", protocol: "ftp:" }, + { url: "https://baz.qat:443", port: "443", protocol: "https:" }, + { url: "wss://baz.qat:443", port: "443", protocol: "wss:" }, + { url: "http://baz.qat:80", port: "80", protocol: "http:" }, + { url: "ws://baz.qat:80", port: "80", protocol: "ws:" }, + { url: "file://home/index.html", port: "", protocol: "file:" }, + { url: "/foo", baseUrl: "ftp://baz.qat:21", port: "21", protocol: "ftp:" }, + { + url: "/foo", + baseUrl: "https://baz.qat:443", + port: "443", + protocol: "https:", + }, + { + url: "/foo", + baseUrl: "wss://baz.qat:443", + port: "443", + protocol: "wss:", + }, + { + url: "/foo", + baseUrl: "http://baz.qat:80", + port: "80", + protocol: "http:", + }, + { url: "/foo", baseUrl: "ws://baz.qat:80", port: "80", protocol: "ws:" }, + { + url: "/foo", + baseUrl: "file://home/index.html", + port: "", + protocol: "file:", + }, + ]; + + for (const { url: urlString, baseUrl, port, protocol } of urls) { + const url = new URL(urlString, baseUrl); + assertEquals(url.port, ""); + + url.port = nonDefaultPort; + assertEquals(url.port, nonDefaultPort); + + url.port = port; + assertEquals(url.port, ""); + + // change scheme + url.protocol = "sftp:"; + assertEquals(url.port, port); + + url.protocol = protocol; + assertEquals(url.port, ""); + } +}); |