230 lines
7.1 KiB
JavaScript
230 lines
7.1 KiB
JavaScript
|
"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:xyz@example.com");
|
||
|
myURL.password = "123";
|
||
|
assert.sameValue(myURL.href, "https://abc:123@example.com/");
|
||
|
|
||
|
// 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:xyz@example.com/");
|
||
|
myURL.username = "123";
|
||
|
assert.sameValue(myURL.href, "https://123:xyz@example.com/");
|
||
|
|
||
|
// 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'), "");
|
||
|
}
|