123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229 |
- "use strict";
- const assert = require("assert.js");
- function testURLCtor(str, expected) {
- assert.sameValue(new URL(str).toString(), expected);
- }
- function testURLCtorBase(ref, base, expected, message) {
- assert.sameValue(new URL(ref, base).toString(), expected, message);
- }
- testURLCtorBase("https://example.org/", undefined, "https://example.org/");
- testURLCtorBase("/foo", "https://example.org/", "https://example.org/foo");
- testURLCtorBase("http://Example.com/", "https://example.org/", "http://example.com/");
- testURLCtorBase("https://Example.com/", "https://example.org/", "https://example.com/");
- testURLCtorBase("foo://Example.com/", "https://example.org/", "foo://Example.com/");
- testURLCtorBase("foo:Example.com/", "https://example.org/", "foo:Example.com/");
- testURLCtorBase("#hash", "https://example.org/", "https://example.org/#hash");
- testURLCtor("HTTP://test.com", "http://test.com/");
- testURLCtor("HTTPS://á.com", "https://xn--1ca.com/");
- testURLCtor("HTTPS://á.com:123", "https://xn--1ca.com:123/");
- testURLCtor("https://test.com#asdfá", "https://test.com/#asdf%C3%A1");
- testURLCtor("HTTPS://á.com:123/á", "https://xn--1ca.com:123/%C3%A1");
- testURLCtor("fish://á.com", "fish://%C3%A1.com");
- testURLCtor("https://test.com/?a=1 /2", "https://test.com/?a=1%20/2");
- testURLCtor("https://test.com/á=1?á=1&ü=2#é", "https://test.com/%C3%A1=1?%C3%A1=1&%C3%BC=2#%C3%A9");
- assert.throws(() => new URL("test"), TypeError);
- assert.throws(() => new URL("ssh://EEE:ddd"), TypeError);
- {
- let u = new URL("https://example.org/");
- assert.sameValue(u.__proto__.constructor, URL);
- assert.sameValue(u instanceof URL, true);
- }
- {
- let u = new URL("https://example.org/");
- assert.sameValue(u.searchParams, u.searchParams);
- }
- let myURL;
- // Hash
- myURL = new URL("https://example.org/foo#bar");
- myURL.hash = "baz";
- assert.sameValue(myURL.href, "https://example.org/foo#baz");
- myURL.hash = "#baz";
- assert.sameValue(myURL.href, "https://example.org/foo#baz");
- myURL.hash = "#á=1 2";
- assert.sameValue(myURL.href, "https://example.org/foo#%C3%A1=1%202");
- myURL.hash = "#a/#b";
- // FAILING: the second # gets escaped
- //assert.sameValue(myURL.href, "https://example.org/foo#a/#b");
- assert.sameValue(myURL.search, "");
- // FAILING: the second # gets escaped
- //assert.sameValue(myURL.hash, "#a/#b");
- // Host
- myURL = new URL("https://example.org:81/foo");
- myURL.host = "example.com:82";
- assert.sameValue(myURL.href, "https://example.com:82/foo");
- // Hostname
- myURL = new URL("https://example.org:81/foo");
- myURL.hostname = "example.com:82";
- assert.sameValue(myURL.href, "https://example.org:81/foo");
- myURL.hostname = "á.com";
- assert.sameValue(myURL.href, "https://xn--1ca.com:81/foo");
- // href
- myURL = new URL("https://example.org/foo");
- myURL.href = "https://example.com/bar";
- assert.sameValue(myURL.href, "https://example.com/bar");
- // Password
- myURL = new URL("https://abc:[email protected]");
- myURL.password = "123";
- assert.sameValue(myURL.href, "https://abc:[email protected]/");
- // pathname
- myURL = new URL("https://example.org/abc/xyz?123");
- myURL.pathname = "/abcdef";
- assert.sameValue(myURL.href, "https://example.org/abcdef?123");
- myURL.pathname = "";
- assert.sameValue(myURL.href, "https://example.org/?123");
- myURL.pathname = "á";
- assert.sameValue(myURL.pathname, "/%C3%A1");
- assert.sameValue(myURL.href, "https://example.org/%C3%A1?123");
- // port
- myURL = new URL("https://example.org:8888");
- assert.sameValue(myURL.port, "8888");
- function testSetPort(port, expected) {
- const url = new URL("https://example.org:8888");
- url.port = port;
- assert.sameValue(url.port, expected);
- }
- testSetPort(0, "0");
- testSetPort(-0, "0");
- // Default ports are automatically transformed to the empty string
- // (HTTPS protocol's default port is 443)
- testSetPort("443", "");
- testSetPort(443, "");
- // Empty string is the same as default port
- testSetPort("", "");
- // Completely invalid port strings are ignored
- testSetPort("abcd", "8888");
- testSetPort("-123", "");
- testSetPort(-123, "");
- testSetPort(-123.45, "");
- testSetPort(undefined, "8888");
- testSetPort(null, "8888");
- testSetPort(+Infinity, "8888");
- testSetPort(-Infinity, "8888");
- testSetPort(NaN, "8888");
- // Leading numbers are treated as a port number
- testSetPort("5678abcd", "5678");
- testSetPort("a5678abcd", "");
- // Non-integers are truncated
- testSetPort(1234.5678, "1234");
- // Out-of-range numbers which are not represented in scientific notation
- // will be ignored.
- testSetPort(1e10, "8888");
- testSetPort("123456", "8888");
- testSetPort(123456, "8888");
- testSetPort(4.567e21, "4");
- // toString() takes precedence over valueOf(), even if it returns a valid integer
- testSetPort(
- {
- toString() {
- return "2";
- },
- valueOf() {
- return 1;
- },
- },
- "2"
- );
- // Protocol
- function testSetProtocol(url, protocol, expected) {
- url.protocol = protocol;
- assert.sameValue(url.protocol, expected);
- }
- testSetProtocol(new URL("https://example.org"), "ftp", "ftp:");
- testSetProtocol(new URL("https://example.org"), "ftp:", "ftp:");
- testSetProtocol(new URL("https://example.org"), "FTP:", "ftp:");
- testSetProtocol(new URL("https://example.org"), "ftp: blah", "ftp:");
- // special to non-special
- testSetProtocol(new URL("https://example.org"), "foo", "https:");
- // non-special to special
- testSetProtocol(new URL("fish://example.org"), "https", "fish:");
- // Search
- myURL = new URL("https://example.org/abc?123");
- myURL.search = "abc=xyz";
- assert.sameValue(myURL.href, "https://example.org/abc?abc=xyz");
- myURL.search = "a=1 2";
- assert.sameValue(myURL.href, "https://example.org/abc?a=1%202");
- myURL.search = "á=ú";
- assert.sameValue(myURL.search, "?%C3%A1=%C3%BA");
- assert.sameValue(myURL.href, "https://example.org/abc?%C3%A1=%C3%BA");
- myURL.hash = "hash";
- myURL.search = "a=#b";
- assert.sameValue(myURL.href, "https://example.org/abc?a=%23b#hash");
- assert.sameValue(myURL.search, "?a=%23b");
- assert.sameValue(myURL.hash, "#hash");
- // Username
- myURL = new URL("https://abc:[email protected]/");
- myURL.username = "123";
- assert.sameValue(myURL.href, "https://123:[email protected]/");
- // Origin, read-only
- assert.throws(() => {
- myURL.origin = "abc";
- }, TypeError);
- // href
- myURL = new URL("https://example.org");
- myURL.href = "https://example.com";
- assert.sameValue(myURL.href, "https://example.com/");
- assert.throws(() => {
- myURL.href = "test";
- }, TypeError);
- // Search Params
- myURL = new URL("https://example.com/");
- myURL.searchParams.append("user", "abc");
- assert.sameValue(myURL.toString(), "https://example.com/?user=abc");
- myURL.searchParams.append("first", "one");
- assert.sameValue(myURL.toString(), "https://example.com/?user=abc&first=one");
- myURL.searchParams.delete("user");
- assert.sameValue(myURL.toString(), "https://example.com/?first=one");
- {
- const url = require("url");
- assert.sameValue(url.domainToASCII('español.com'), "xn--espaol-zwa.com");
- assert.sameValue(url.domainToASCII('中文.com'), "xn--fiq228c.com");
- assert.sameValue(url.domainToASCII('xn--iñvalid.com'), "");
- assert.sameValue(url.domainToUnicode('xn--espaol-zwa.com'), "español.com");
- assert.sameValue(url.domainToUnicode('xn--fiq228c.com'), "中文.com");
- assert.sameValue(url.domainToUnicode('xn--iñvalid.com'), "");
- }
|