/*jshint unused:false, scripturl:true */ var urls = [{ name: 'scheme and domain', url: 'http://www.example.org', _url: 'http://www.example.org/', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.org', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/', query: '', fragment: '', resource: '/', authority: 'www.example.org', origin: 'http://www.example.org', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '', suffix: '', hash: '', // location.hash style search: '', // location.search style host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'second level domain', url: 'http://www.example.co.uk', _url: 'http://www.example.co.uk/', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.co.uk', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/', query: '', fragment: '', resource: '/', authority: 'www.example.co.uk', origin: 'http://www.example.co.uk', userinfo: '', subdomain: 'www', domain: 'example.co.uk', tld: 'co.uk', directory: '/', filename: '', suffix: '', hash: '', // location.hash style search: '', // location.search style host: 'www.example.co.uk', hostname: 'www.example.co.uk' }, is: { urn: false, url: true, relative: false, name: true, sld: true, ip: false, ip4: false, ip6: false, idn: false, punycode: false } },{ name: 'qualified HTTP', url: 'http://www.example.org/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.org', port: null, path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'www.example.org', origin: 'http://www.example.org', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'funky suffix', url: 'http://www.example.org/some/directory/file.html-is-awesome?query=string#fragment', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.org', port: null, path: '/some/directory/file.html-is-awesome', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/some/directory/file.html-is-awesome', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html-is-awesome?query=string#fragment', authority: 'www.example.org', origin: 'http://www.example.org', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/some/directory', filename: 'file.html-is-awesome', suffix: '', hash: '#fragment', search: '?query=string', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'complete URL', url: 'scheme://user:pass@www.example.org:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'scheme', username: 'user', password: 'pass', hostname: 'www.example.org', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'scheme', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@www.example.org:123', origin: 'scheme://user:pass@www.example.org:123', userinfo: 'user:pass', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'www.example.org:123', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'badly encoded userinfo', url: 'scheme://user:pass:word@www.example.org/', _url: 'scheme://user:pass%3Aword@www.example.org/', parts: { protocol: 'scheme', username: 'user', password: 'pass:word', hostname: 'www.example.org', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'scheme', username: 'user', password: 'pass:word', port: '', path: '/', query: '', fragment: '', resource: '/', authority: 'user:pass%3Aword@www.example.org', origin: 'scheme://user:pass%3Aword@www.example.org', userinfo: 'user:pass%3Aword', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '', suffix: '', hash: '', search: '', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'empty username with non-empty password', url: 'scheme://:password@www.example.org/', _url: 'scheme://:password@www.example.org/', parts: { protocol: 'scheme', username: null, password: 'password', hostname: 'www.example.org', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'scheme', username: '', password: 'password', port: '', path: '/', query: '', fragment: '', resource: '/', authority: ':password@www.example.org', origin: 'scheme://:password@www.example.org', userinfo: ':password', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '', suffix: '', hash: '', search: '', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'malformed email in userinfo', url: 'scheme://john@doe.com:pass:word@www.example.org/', _url: 'scheme://john%40doe.com:pass%3Aword@www.example.org/', parts: { protocol: 'scheme', username: 'john@doe.com', password: 'pass:word', hostname: 'www.example.org', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'scheme', username: 'john@doe.com', password: 'pass:word', port: '', path: '/', query: '', fragment: '', resource: '/', authority: 'john%40doe.com:pass%3Aword@www.example.org', origin: 'scheme://john%40doe.com:pass%3Aword@www.example.org', userinfo: 'john%40doe.com:pass%3Aword', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '', suffix: '', hash: '', search: '', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'host-relative: URL', url: '/some/directory/file.html?query=string#fragment', parts: { protocol: null, username: null, password: null, hostname: null, port: null, path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: '', username: '', password: '', port: '', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'path-relative: URL', url: '../some/directory/file.html?query=string#fragment', parts: { protocol: null, username: null, password: null, hostname: null, port: null, path: '../some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: '', username: '', password: '', port: '', path: '../some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '../some/directory/file.html?query=string#fragment', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '../some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'missing scheme', url: 'user:pass@www.example.org:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'user', username: null, password: null, hostname: null, port: null, path: 'pass@www.example.org:123/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'user', username: '', password: '', port: '', path: 'pass@www.example.org:123/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: 'pass@www.example.org:123/some/directory/file.html?query=string#fragment', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '', filename: '', suffix: '', hash: '#fragment', search: '?query=string', host: '', hostname: '' }, is: { urn: true, url: false, relative: false, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'ignoring scheme', url: '://user:pass@example.org:123/some/directory/file.html?query=string#fragment', _url: '//user:pass@example.org:123/some/directory/file.html?query=string#fragment', parts: { protocol: null, username: 'user', password: 'pass', hostname: 'example.org', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: '', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@example.org:123', origin: 'user:pass@example.org:123', userinfo: 'user:pass', subdomain: '', domain: 'example.org', tld: 'org', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'example.org:123', hostname: 'example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'scheme-relative URL', url: '//www.example.org/', parts: { protocol: null, username: null, password: null, hostname: 'www.example.org', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: '', username: '', password: '', port: '', path: '/', query: '', fragment: '', resource: '/', authority: 'www.example.org', origin: 'www.example.org', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '', suffix: '', hash: '', search: '', host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'IPv4', url: 'http://user:pass@123.123.123.123:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: 'user', password: 'pass', hostname: '123.123.123.123', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@123.123.123.123:123', origin: 'http://user:pass@123.123.123.123:123', userinfo: 'user:pass', subdomain: '', domain: '', tld: '', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: '123.123.123.123:123', hostname: '123.123.123.123' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: true, ip6: false, idn: false, punycode: false } }, { name: 'IPv6', url: 'http://user:pass@fe80:0000:0000:0000:0204:61ff:fe9d:f156/some/directory/file.html?query=string#fragment', _url: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: 'user', password: 'pass', hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', port: null, path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: 'user', password: 'pass', port: '', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', origin: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', userinfo: 'user:pass', subdomain: '', domain: '', tld: '', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: '[fe80:0000:0000:0000:0204:61ff:fe9d:f156]', hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 with port', url: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: 'user', password: 'pass', hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', origin: 'http://user:pass@[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', userinfo: 'user:pass', subdomain: '', domain: '', tld: '', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: '[fe80:0000:0000:0000:0204:61ff:fe9d:f156]:123', hostname: 'fe80:0000:0000:0000:0204:61ff:fe9d:f156' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 brackets, port, file.ext', url: 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html', parts: { protocol: 'http', username: null, password: null, hostname: 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', port: '80', path: '/index.html', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '80', path: '/index.html', query: '', fragment: '', resource: '/index.html', authority: '[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', origin: 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: 'index.html', suffix: 'html', hash: '', search: '', host: '[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80', hostname: 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 brackets, file.ext', url: 'http://[1080:0:0:0:8:800:200C:417A]/index.html', parts: { protocol: 'http', username: null, password: null, hostname: '1080:0:0:0:8:800:200C:417A', port: null, path: '/index.html', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/index.html', query: '', fragment: '', resource: '/index.html', authority: '[1080:0:0:0:8:800:200C:417A]', origin: 'http://[1080:0:0:0:8:800:200C:417A]', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: 'index.html', suffix: 'html', hash: '', search: '', host: '[1080:0:0:0:8:800:200C:417A]', hostname: '1080:0:0:0:8:800:200C:417A' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 brackets ::1', url: 'http://[3ffe:2a00:100:7031::1]', _url: 'http://[3ffe:2a00:100:7031::1]/', parts: { protocol: 'http', username: null, password: null, hostname: '3ffe:2a00:100:7031::1', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/', query: '', fragment: '', resource: '/', authority: '[3ffe:2a00:100:7031::1]', origin: 'http://[3ffe:2a00:100:7031::1]', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: '', suffix: '', hash: '', search: '', host: '[3ffe:2a00:100:7031::1]', hostname: '3ffe:2a00:100:7031::1' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 brackets, file', url: 'http://[1080::8:800:200C:417A]/foo', parts: { protocol: 'http', username: null, password: null, hostname: '1080::8:800:200C:417A', port: null, path: '/foo', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/foo', query: '', fragment: '', resource: '/foo', authority: '[1080::8:800:200C:417A]', origin: 'http://[1080::8:800:200C:417A]', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: 'foo', suffix: '', hash: '', search: '', host: '[1080::8:800:200C:417A]', hostname: '1080::8:800:200C:417A' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 IPv4 brackets, path', url: 'http://[::192.9.5.5]/ipng', parts: { protocol: 'http', username: null, password: null, hostname: '::192.9.5.5', port: null, path: '/ipng', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/ipng', query: '', fragment: '', resource: '/ipng', authority: '[::192.9.5.5]', origin: 'http://[::192.9.5.5]', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: 'ipng', suffix: '', hash: '', search: '', host: '[::192.9.5.5]', hostname: '::192.9.5.5' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 mask IPv4 brackets, port, file.ext', url: 'http://[::FFFF:129.144.52.38]:80/index.html', parts: { protocol: 'http', username: null, password: null, hostname: '::FFFF:129.144.52.38', port: '80', path: '/index.html', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '80', path: '/index.html', query: '', fragment: '', resource: '/index.html', authority: '[::FFFF:129.144.52.38]:80', origin: 'http://[::FFFF:129.144.52.38]:80', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: 'index.html', suffix: 'html', hash: '', search: '', host: '[::FFFF:129.144.52.38]:80', hostname: '::FFFF:129.144.52.38' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IPv6 brackets', url: 'http://[2010:836B:4179::836B:4179]', _url: 'http://[2010:836B:4179::836B:4179]/', parts: { protocol: 'http', username: null, password: null, hostname: '2010:836B:4179::836B:4179', port: null, path: '/', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/', query: '', fragment: '', resource: '/', authority: '[2010:836B:4179::836B:4179]', origin: 'http://[2010:836B:4179::836B:4179]', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/', filename: '', suffix: '', hash: '', search: '', host: '[2010:836B:4179::836B:4179]', hostname: '2010:836B:4179::836B:4179' }, is: { urn: false, url: true, relative: false, name: false, sld: false, ip: true, ip4: false, ip6: true, idn: false, punycode: false } }, { name: 'IDN (punycode)', url: 'http://user:pass@xn--exmple-cua.org:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: 'user', password: 'pass', hostname: 'xn--exmple-cua.org', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@xn--exmple-cua.org:123', origin: 'http://user:pass@xn--exmple-cua.org:123', userinfo: 'user:pass', subdomain: '', domain: 'xn--exmple-cua.org', tld: 'org', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'xn--exmple-cua.org:123', hostname: 'xn--exmple-cua.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: true } }, { name: 'IDN', url: 'http://user:pass@exämple.org:123/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: 'user', password: 'pass', hostname: 'exämple.org', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: 'user', password: 'pass', port: '123', path: '/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/some/directory/file.html?query=string#fragment', authority: 'user:pass@exämple.org:123', origin: 'http://user:pass@exämple.org:123', userinfo: 'user:pass', subdomain: '', domain: 'exämple.org', tld: 'org', directory: '/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'exämple.org:123', hostname: 'exämple.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: true, punycode: false } }, { name: 'file://', url: 'file:///foo/bar/baz.html', parts: { protocol: 'file', username: null, password: null, hostname: null, port: null, path: '/foo/bar/baz.html', query: null, fragment: null }, accessors: { protocol: 'file', username: '', password: '', port: '', path: '/foo/bar/baz.html', query: '', fragment: '', resource: '/foo/bar/baz.html', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/foo/bar', filename: 'baz.html', suffix: 'html', hash: '', search: '', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'file://example.org:123', url: 'file://example.org:123/foo/bar/baz.html', parts: { protocol: 'file', username: null, password: null, hostname: 'example.org', port: '123', path: '/foo/bar/baz.html', query: null, fragment: null }, accessors: { protocol: 'file', username: '', password: '', port: '123', path: '/foo/bar/baz.html', query: '', fragment: '', resource: '/foo/bar/baz.html', authority: 'example.org:123', origin: 'file://example.org:123', userinfo: '', subdomain: '', domain: 'example.org', tld: 'org', directory: '/foo/bar', filename: 'baz.html', suffix: 'html', hash: '', search: '', host: 'example.org:123', hostname: 'example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'file:// Windows-Drive-Letter', url: 'file:///C:/WINDOWS/foo.txt', parts: { protocol: 'file', username: null, password: null, hostname: null, port: null, path: '/C:/WINDOWS/foo.txt', query: null, fragment: null }, accessors: { protocol: 'file', username: '', password: '', port: '', path: '/C:/WINDOWS/foo.txt', query: '', fragment: '', resource: '/C:/WINDOWS/foo.txt', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/C:/WINDOWS', filename: 'foo.txt', suffix: 'txt', hash: '', search: '', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'file://example.org/ Windows-Drive-Letter', url: 'file://example.org/C:/WINDOWS/foo.txt', parts: { protocol: 'file', username: null, password: null, hostname: 'example.org', port: null, path: '/C:/WINDOWS/foo.txt', query: null, fragment: null }, accessors: { protocol: 'file', username: '', password: '', port: '', path: '/C:/WINDOWS/foo.txt', query: '', fragment: '', resource: '/C:/WINDOWS/foo.txt', authority: 'example.org', origin: 'file://example.org', userinfo: '', subdomain: '', domain: 'example.org', tld: 'org', directory: '/C:/WINDOWS', filename: 'foo.txt', suffix: 'txt', hash: '', search: '', host: 'example.org', hostname: 'example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'file://localhost/ Windows-Drive-Letter with pipe', url: 'file://localhost/C|/WINDOWS/foo.txt', parts: { protocol: 'file', username: null, password: null, hostname: 'localhost', port: null, path: '/C|/WINDOWS/foo.txt', query: null, fragment: null }, accessors: { protocol: 'file', username: '', password: '', port: '', path: '/C|/WINDOWS/foo.txt', query: '', fragment: '', resource: '/C|/WINDOWS/foo.txt', authority: 'localhost', origin: 'file://localhost', userinfo: '', subdomain: '', domain: 'localhost', tld: 'localhost', directory: '/C|/WINDOWS', filename: 'foo.txt', suffix: 'txt', hash: '', search: '', host: 'localhost', hostname: 'localhost' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'Path containing @', url: 'http://www.example.org/@foobar', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.org', port: null, path: '/@foobar', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/@foobar', query: '', fragment: '', resource: '/@foobar', authority: 'www.example.org', origin: 'http://www.example.org', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: '@foobar', suffix: '', hash: '', // location.hash style search: '', // location.search style host: 'www.example.org', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'mailto:', url: 'mailto:hello@example.org?subject=hello', _url: 'mailto:hello@example.org?subject=hello', parts: { protocol: 'mailto', username: null, password: null, hostname: null, port: null, path: 'hello@example.org', query: 'subject=hello', fragment: null }, accessors: { protocol: 'mailto', username: '', password: '', port: '', path: 'hello@example.org', query: 'subject=hello', fragment: '', resource: 'hello@example.org?subject=hello', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '', filename: '', suffix: '', hash: '', search: '?subject=hello', host: '', hostname: '' }, is: { urn: true, url: false, relative: false, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'magnet:', url: 'magnet:?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', _url: 'magnet:?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', parts: { protocol: 'magnet', username: null, password: null, hostname: null, port: null, path: '', query: 'xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', fragment: null }, accessors: { protocol: 'magnet', username: '', password: '', port: '', path: '', query: 'xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', fragment: '', resource: '?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '', filename: '', suffix: '', hash: '', search: '?xt=urn:btih:f8c020dac7a083defda1769a1196a13facc38ef6&dn=Linux+64x+server+11.10+Pt+Pt&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80', host: '', hostname: '' }, is: { urn: true, url: false, relative: false, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'javascript:', url: 'javascript:alert("hello world");', _url: 'javascript:alert("hello world");', parts: { protocol: 'javascript', username: null, password: null, hostname: null, port: null, path: 'alert("hello world");', query: null, fragment: null }, accessors: { protocol: 'javascript', username: '', password: '', port: '', path: 'alert("hello world");', query: '', fragment: '', resource: 'alert("hello world");', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '', filename: '', suffix: '', hash: '', search: '', host: '', hostname: '' }, is: { urn: true, url: false, relative: false, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'colon in path', url: 'http://en.wikipedia.org/wiki/Help:IPA', _url: 'http://en.wikipedia.org/wiki/Help:IPA', parts: { protocol: 'http', username: null, password: null, hostname: 'en.wikipedia.org', port: null, path: '/wiki/Help:IPA', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/wiki/Help:IPA', query: '', fragment: '', resource: '/wiki/Help:IPA', authority: 'en.wikipedia.org', origin: 'http://en.wikipedia.org', userinfo: '', subdomain: 'en', domain: 'wikipedia.org', tld: 'org', directory: '/wiki', filename: 'Help:IPA', suffix: '', hash: '', search: '', host: 'en.wikipedia.org', hostname: 'en.wikipedia.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'colon in path without protocol', url: '/wiki/Help:IPA', _url: '/wiki/Help:IPA', parts: { protocol: null, username: null, password: null, hostname: null, port: null, path: '/wiki/Help:IPA', query: null, fragment: null }, accessors: { protocol: '', username: '', password: '', port: '', path: '/wiki/Help:IPA', query: '', fragment: '', resource: '/wiki/Help:IPA', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/wiki', filename: 'Help:IPA', suffix: '', hash: '', search: '', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'colon dash dash in path without protocol', url: '/foo/xy://bar', _url: '/foo/xy://bar', parts: { protocol: null, username: null, password: null, hostname: null, port: null, path: '/foo/xy://bar', query: null, fragment: null }, accessors: { protocol: '', username: '', password: '', port: '', path: '/foo/xy://bar', query: '', fragment: '', resource: '/foo/xy://bar', authority: '', origin: '', userinfo: '', subdomain: '', domain: '', tld: '', directory: '/foo/xy:/', // sanitized empty directory! filename: 'bar', suffix: '', hash: '', search: '', host: '', hostname: '' }, is: { urn: false, url: true, relative: true, name: false, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'colon in path', url: 'http://www.example.org:8080/hello:world', parts: { protocol: 'http', username: null, password: null, hostname: 'www.example.org', port: '8080', path: '/hello:world', query: null, fragment: null }, accessors: { protocol: 'http', username: '', password: '', port: '8080', path: '/hello:world', query: '', fragment: '', resource: '/hello:world', authority: 'www.example.org:8080', origin: 'http://www.example.org:8080', userinfo: '', subdomain: 'www', domain: 'example.org', tld: 'org', directory: '/', filename: 'hello:world', suffix: '', hash: '', // location.hash style search: '', // location.search style host: 'www.example.org:8080', hostname: 'www.example.org' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } }, { name: 'backslashes', url: 'http://i.xss.com\\www.example.org/some/directory/file.html?query=string#fragment', _url: 'http://i.xss.com/www.example.org/some/directory/file.html?query=string#fragment', parts: { protocol: 'http', username: null, password: null, hostname: 'i.xss.com', port: null, path: '/www.example.org/some/directory/file.html', query: 'query=string', fragment: 'fragment' }, accessors: { protocol: 'http', username: '', password: '', port: '', path: '/www.example.org/some/directory/file.html', query: 'query=string', fragment: 'fragment', resource: '/www.example.org/some/directory/file.html?query=string#fragment', authority: 'i.xss.com', origin: 'http://i.xss.com', userinfo: '', subdomain: 'i', domain: 'xss.com', tld: 'com', directory: '/www.example.org/some/directory', filename: 'file.html', suffix: 'html', hash: '#fragment', search: '?query=string', host: 'i.xss.com', hostname: 'i.xss.com' }, is: { urn: false, url: true, relative: false, name: true, sld: false, ip: false, ip4: false, ip6: false, idn: false, punycode: false } } ];