Tests/LibWeb: Import the main set of URLPattern WPT tests

This commit is contained in:
Shannon Booth 2025-03-17 01:16:38 +13:00
parent c49dd2036b
commit 5925163146
5 changed files with 3517 additions and 0 deletions

View file

@ -0,0 +1,356 @@
Harness status: OK
Found 350 tests
8 Pass
342 Fail
Pass Loading data...
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/ba"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar/"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: ["https://example.com/foo/bar"]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: ["https://example.com/foo/bar/baz"]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"hostname":"example.com","pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"hostname":"example.com","pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar/baz","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"hostname":"example.com","pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar","search":"otherquery","hash":"otherhash"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar","search":"otherquery","hash":"otherhash"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?otherquery#otherhash"}] Inputs: [{"protocol":"https","hostname":"example.com","pathname":"/foo/bar","search":"otherquery","hash":"otherhash"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["https://example.com/foo/bar"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["https://example.com/foo/bar?otherquery#otherhash"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["https://example.com/foo/bar?query#hash"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["https://example.com/foo/bar/baz"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["https://other.com/foo/bar"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: ["http://other.com/foo/bar"]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar/baz","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar","baseURL":"https://other.com"}]
Fail Pattern: [{"pathname":"/foo/bar","baseURL":"https://example.com?query#hash"}] Inputs: [{"pathname":"/foo/bar","baseURL":"http://example.com"}]
Fail Pattern: [{"pathname":"/foo/:bar"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/([^\\/]+?)"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/:bar"}] Inputs: [{"pathname":"/foo/index.html"}]
Fail Pattern: [{"pathname":"/foo/:bar"}] Inputs: [{"pathname":"/foo/bar/"}]
Fail Pattern: [{"pathname":"/foo/:bar"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/(.*)"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/*"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/(.*)"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/*"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/(.*)"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/*"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/(.*)"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/*"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/:bar(.*)"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/:bar(.*)"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/:bar(.*)"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/:bar(.*)"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/:bar?"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/:bar?"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/:bar?"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/:bar?"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/:bar?"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/:bar+"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/:bar+"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/:bar+"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/:bar+"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/:bar+"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/:bar*"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/:bar*"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/:bar*"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/:bar*"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/:bar*"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/(.*)?"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo/*?"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/(.*)+"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo/*+"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/foobar"}]
Fail Pattern: [{"pathname":"/foo/(.*)*"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo/**"}] Inputs: [{"pathname":"/fo"}]
Fail Pattern: [{"pathname":"/foo{/bar}"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo{/bar}"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo{/bar}"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo{/bar}?"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}?"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo{/bar}?"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo{/bar}?"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo{/bar}+"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}+"}] Inputs: [{"pathname":"/foo/bar/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}+"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo{/bar}+"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo{/bar}+"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"pathname":"/foo{/bar}*"}] Inputs: [{"pathname":"/foo/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}*"}] Inputs: [{"pathname":"/foo/bar/bar"}]
Fail Pattern: [{"pathname":"/foo{/bar}*"}] Inputs: [{"pathname":"/foo/bar/baz"}]
Fail Pattern: [{"pathname":"/foo{/bar}*"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"pathname":"/foo{/bar}*"}] Inputs: [{"pathname":"/foo/"}]
Fail Pattern: [{"protocol":"(café)"}] Inputs: undefined
Fail Pattern: [{"username":"(café)"}] Inputs: undefined
Fail Pattern: [{"password":"(café)"}] Inputs: undefined
Fail Pattern: [{"hostname":"(café)"}] Inputs: undefined
Fail Pattern: [{"pathname":"(café)"}] Inputs: undefined
Fail Pattern: [{"search":"(café)"}] Inputs: undefined
Fail Pattern: [{"hash":"(café)"}] Inputs: undefined
Fail Pattern: [{"protocol":":café"}] Inputs: [{"protocol":"foo"}]
Fail Pattern: [{"username":":café"}] Inputs: [{"username":"foo"}]
Fail Pattern: [{"password":":café"}] Inputs: [{"password":"foo"}]
Fail Pattern: [{"hostname":":café"}] Inputs: [{"hostname":"foo"}]
Fail Pattern: [{"pathname":"/:café"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"search":":café"}] Inputs: [{"search":"foo"}]
Fail Pattern: [{"hash":":café"}] Inputs: [{"hash":"foo"}]
Fail Pattern: [{"protocol":":℘"}] Inputs: [{"protocol":"foo"}]
Fail Pattern: [{"username":":℘"}] Inputs: [{"username":"foo"}]
Fail Pattern: [{"password":":℘"}] Inputs: [{"password":"foo"}]
Fail Pattern: [{"hostname":":℘"}] Inputs: [{"hostname":"foo"}]
Fail Pattern: [{"pathname":"/:℘"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"search":":℘"}] Inputs: [{"search":"foo"}]
Fail Pattern: [{"hash":":℘"}] Inputs: [{"hash":"foo"}]
Fail Pattern: [{"protocol":":㐀"}] Inputs: [{"protocol":"foo"}]
Fail Pattern: [{"username":":㐀"}] Inputs: [{"username":"foo"}]
Fail Pattern: [{"password":":㐀"}] Inputs: [{"password":"foo"}]
Fail Pattern: [{"hostname":":㐀"}] Inputs: [{"hostname":"foo"}]
Fail Pattern: [{"pathname":"/:㐀"}] Inputs: [{"pathname":"/foo"}]
Fail Pattern: [{"search":":㐀"}] Inputs: [{"search":"foo"}]
Fail Pattern: [{"hash":":㐀"}] Inputs: [{"hash":"foo"}]
Fail Pattern: [{"protocol":"(.*)"}] Inputs: [{"protocol":"café"}]
Fail Pattern: [{"protocol":"(.*)"}] Inputs: [{"protocol":"cafe"}]
Fail Pattern: [{"protocol":"foo-bar"}] Inputs: [{"protocol":"foo-bar"}]
Fail Pattern: [{"username":"caf%C3%A9"}] Inputs: [{"username":"café"}]
Fail Pattern: [{"username":"café"}] Inputs: [{"username":"café"}]
Fail Pattern: [{"username":"caf%c3%a9"}] Inputs: [{"username":"café"}]
Fail Pattern: [{"password":"caf%C3%A9"}] Inputs: [{"password":"café"}]
Fail Pattern: [{"password":"café"}] Inputs: [{"password":"café"}]
Fail Pattern: [{"password":"caf%c3%a9"}] Inputs: [{"password":"café"}]
Fail Pattern: [{"hostname":"xn--caf-dma.com"}] Inputs: [{"hostname":"café.com"}]
Fail Pattern: [{"hostname":"café.com"}] Inputs: [{"hostname":"café.com"}]
Fail Pattern: ["http://<2F><><EFBFBD>U+deb2.com/"] Inputs: ["http://<2F><><EFBFBD>U+deb2.com/"]
Fail Pattern: ["http://\ud83d \udeb2"] Inputs: undefined
Fail Pattern: [{"hostname":"\ud83d \udeb2"}] Inputs: undefined
Fail Pattern: [{"pathname":"\ud83d \udeb2"}] Inputs: []
Fail Pattern: [{"pathname":":\ud83d \udeb2"}] Inputs: undefined
Fail Pattern: [{"pathname":":a<><61><EFBFBD>U+dd00b"}] Inputs: []
Fail Pattern: [{"pathname":"test/:a<><61><EFBFBD>U+dc50b"}] Inputs: [{"pathname":"test/foo"}]
Fail Pattern: [{"pathname":":<3A><><EFBFBD>U+deb2"}] Inputs: undefined
Fail Pattern: [{"port":""}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"protocol":"http","port":"80"}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"protocol":"http","port":"80{20}?"}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"protocol":"http","port":"80 "}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"protocol":"http","port":"100000"}] Inputs: [{"protocol":"http","port":"100000"}]
Fail Pattern: [{"port":"80"}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"protocol":"http{s}?","port":"80"}] Inputs: [{"protocol":"http","port":"80"}]
Fail Pattern: [{"port":"80"}] Inputs: [{"port":"80"}]
Fail Pattern: [{"port":"(.*)"}] Inputs: [{"port":"invalid80"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/./bar"}]
Fail Pattern: [{"pathname":"/foo/baz"}] Inputs: [{"pathname":"/foo/bar/../baz"}]
Fail Pattern: [{"pathname":"/caf%C3%A9"}] Inputs: [{"pathname":"/café"}]
Fail Pattern: [{"pathname":"/café"}] Inputs: [{"pathname":"/café"}]
Fail Pattern: [{"pathname":"/caf%c3%a9"}] Inputs: [{"pathname":"/café"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"foo/bar"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"foo/bar","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"/foo/../bar"}] Inputs: [{"pathname":"/bar"}]
Fail Pattern: [{"pathname":"./foo/bar","baseURL":"https://example.com"}] Inputs: [{"pathname":"foo/bar","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"","baseURL":"https://example.com"}] Inputs: [{"pathname":"/","baseURL":"https://example.com"}]
Fail Pattern: [{"pathname":"{/bar}","baseURL":"https://example.com/foo/"}] Inputs: [{"pathname":"./bar","baseURL":"https://example.com/foo/"}]
Fail Pattern: [{"pathname":"\\/bar","baseURL":"https://example.com/foo/"}] Inputs: [{"pathname":"./bar","baseURL":"https://example.com/foo/"}]
Fail Pattern: [{"pathname":"b","baseURL":"https://example.com/foo/"}] Inputs: [{"pathname":"./b","baseURL":"https://example.com/foo/"}]
Fail Pattern: [{"pathname":"foo/bar"}] Inputs: ["https://example.com/foo/bar"]
Fail Pattern: [{"pathname":"foo/bar","baseURL":"https://example.com"}] Inputs: ["https://example.com/foo/bar"]
Fail Pattern: [{"pathname":":name.html","baseURL":"https://example.com"}] Inputs: ["https://example.com/foo.html"]
Fail Pattern: [{"search":"q=caf%C3%A9"}] Inputs: [{"search":"q=café"}]
Fail Pattern: [{"search":"q=café"}] Inputs: [{"search":"q=café"}]
Fail Pattern: [{"search":"q=caf%c3%a9"}] Inputs: [{"search":"q=café"}]
Fail Pattern: [{"hash":"caf%C3%A9"}] Inputs: [{"hash":"café"}]
Fail Pattern: [{"hash":"café"}] Inputs: [{"hash":"café"}]
Fail Pattern: [{"hash":"caf%c3%a9"}] Inputs: [{"hash":"café"}]
Fail Pattern: [{"protocol":"about","pathname":"(blank|sourcedoc)"}] Inputs: ["about:blank"]
Fail Pattern: [{"protocol":"data","pathname":":number([0-9]+)"}] Inputs: ["data:8675309"]
Fail Pattern: [{"pathname":"/(\\m)"}] Inputs: undefined
Fail Pattern: [{"pathname":"/foo!"}] Inputs: [{"pathname":"/foo!"}]
Fail Pattern: [{"pathname":"/foo\\:"}] Inputs: [{"pathname":"/foo:"}]
Fail Pattern: [{"pathname":"/foo\\{"}] Inputs: [{"pathname":"/foo{"}]
Fail Pattern: [{"pathname":"/foo\\("}] Inputs: [{"pathname":"/foo("}]
Fail Pattern: [{"protocol":"javascript","pathname":"var x = 1;"}] Inputs: [{"protocol":"javascript","pathname":"var x = 1;"}]
Fail Pattern: [{"pathname":"var x = 1;"}] Inputs: [{"protocol":"javascript","pathname":"var x = 1;"}]
Fail Pattern: [{"protocol":"javascript","pathname":"var x = 1;"}] Inputs: [{"baseURL":"javascript:var x = 1;"}]
Fail Pattern: [{"protocol":"(data|javascript)","pathname":"var x = 1;"}] Inputs: [{"protocol":"javascript","pathname":"var x = 1;"}]
Fail Pattern: [{"protocol":"(https|javascript)","pathname":"var x = 1;"}] Inputs: [{"protocol":"javascript","pathname":"var x = 1;"}]
Fail Pattern: [{"pathname":"var x = 1;"}] Inputs: [{"pathname":"var x = 1;"}]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: ["./foo/bar","https://example.com"]
Fail Pattern: [{"pathname":"/foo/bar"}] Inputs: [{"pathname":"/foo/bar"},"https://example.com"]
Fail Pattern: ["https://example.com:8080/foo?bar#baz"] Inputs: [{"pathname":"/foo","search":"bar","hash":"baz","baseURL":"https://example.com:8080"}]
Fail Pattern: ["/foo?bar#baz","https://example.com:8080"] Inputs: [{"pathname":"/foo","search":"bar","hash":"baz","baseURL":"https://example.com:8080"}]
Pass Pattern: ["/foo"] Inputs: undefined
Pass Pattern: ["example.com/foo"] Inputs: undefined
Fail Pattern: ["http{s}?://{*.}?example.com/:product/:endpoint"] Inputs: ["https://sub.example.com/foo/bar"]
Fail Pattern: ["https://example.com?foo"] Inputs: ["https://example.com/?foo"]
Fail Pattern: ["https://example.com#foo"] Inputs: ["https://example.com/#foo"]
Fail Pattern: ["https://example.com:8080?foo"] Inputs: ["https://example.com:8080/?foo"]
Fail Pattern: ["https://example.com:8080#foo"] Inputs: ["https://example.com:8080/#foo"]
Fail Pattern: ["https://example.com/?foo"] Inputs: ["https://example.com/?foo"]
Fail Pattern: ["https://example.com/#foo"] Inputs: ["https://example.com/#foo"]
Fail Pattern: ["https://example.com/*?foo"] Inputs: ["https://example.com/?foo"]
Fail Pattern: ["https://example.com/*\\?foo"] Inputs: ["https://example.com/?foo"]
Fail Pattern: ["https://example.com/:name?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/:name\\?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/(bar)?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/(bar)\\?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/{bar}?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/{bar}\\?foo"] Inputs: ["https://example.com/bar?foo"]
Fail Pattern: ["https://example.com/"] Inputs: ["https://example.com:8080/"]
Pass Pattern: ["data:foobar"] Inputs: ["data:foobar"]
Fail Pattern: ["data\\:foobar"] Inputs: ["data:foobar"]
Fail Pattern: ["https://{sub.}?example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["https://{sub.}?example{.com/}foo"] Inputs: ["https://example.com/foo"]
Pass Pattern: ["{https://}example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["https://(sub.)?example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["https://(sub.)?example(.com/)foo"] Inputs: ["https://example.com/foo"]
Pass Pattern: ["(https://)example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["https://{sub{.}}example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["https://(sub(?:.))?example.com/foo"] Inputs: ["https://example.com/foo"]
Fail Pattern: ["file:///foo/bar"] Inputs: ["file:///foo/bar"]
Fail Pattern: ["data:"] Inputs: ["data:"]
Fail Pattern: ["foo://bar"] Inputs: ["foo://bad_url_browser_interop"]
Fail Pattern: ["(café)://foo"] Inputs: undefined
Fail Pattern: ["https://example.com/foo?bar#baz"] Inputs: [{"protocol":"https:","search":"?bar","hash":"#baz","baseURL":"http://example.com/foo"}]
Fail Pattern: [{"protocol":"http{s}?:","search":"?bar","hash":"#baz"}] Inputs: ["http://example.com/foo?bar#baz"]
Fail Pattern: ["?bar#baz","https://example.com/foo"] Inputs: ["?bar#baz","https://example.com/foo"]
Fail Pattern: ["?bar","https://example.com/foo#baz"] Inputs: ["?bar","https://example.com/foo#snafu"]
Fail Pattern: ["#baz","https://example.com/foo?bar"] Inputs: ["#baz","https://example.com/foo?bar"]
Fail Pattern: ["#baz","https://example.com/foo"] Inputs: ["#baz","https://example.com/foo"]
Fail Pattern: [{"pathname":"*"}] Inputs: ["foo","data:data-urls-cannot-be-base-urls"]
Fail Pattern: [{"pathname":"*"}] Inputs: ["foo","not|a|valid|url"]
Fail Pattern: ["https://foo\\:bar@example.com"] Inputs: ["https://foo:bar@example.com"]
Fail Pattern: ["https://foo@example.com"] Inputs: ["https://foo@example.com"]
Fail Pattern: ["https://\\:bar@example.com"] Inputs: ["https://:bar@example.com"]
Fail Pattern: ["https://:user::pass@example.com"] Inputs: ["https://foo:bar@example.com"]
Fail Pattern: ["https\\:foo\\:bar@example.com"] Inputs: ["https:foo:bar@example.com"]
Fail Pattern: ["data\\:foo\\:bar@example.com"] Inputs: ["data:foo:bar@example.com"]
Fail Pattern: ["https://foo{\\:}bar@example.com"] Inputs: ["https://foo:bar@example.com"]
Fail Pattern: ["data{\\:}channel.html","https://example.com"] Inputs: ["https://example.com/data:channel.html"]
Fail Pattern: ["http://[\\:\\:1]/"] Inputs: ["http://[::1]/"]
Fail Pattern: ["http://[\\:\\:1]:8080/"] Inputs: ["http://[::1]:8080/"]
Fail Pattern: ["http://[\\:\\:a]/"] Inputs: ["http://[::a]/"]
Fail Pattern: ["http://[:address]/"] Inputs: ["http://[::1]/"]
Fail Pattern: ["http://[\\:\\:AB\\::num]/"] Inputs: ["http://[::ab:1]/"]
Fail Pattern: [{"hostname":"[\\:\\:AB\\::num]"}] Inputs: [{"hostname":"[::ab:1]"}]
Fail Pattern: [{"hostname":"[\\:\\:xY\\::num]"}] Inputs: undefined
Fail Pattern: [{"hostname":"{[\\:\\:ab\\::num]}"}] Inputs: [{"hostname":"[::ab:1]"}]
Fail Pattern: [{"hostname":"{[\\:\\:fé\\::num]}"}] Inputs: undefined
Fail Pattern: [{"hostname":"{[\\:\\::num\\:1]}"}] Inputs: [{"hostname":"[::ab:1]"}]
Fail Pattern: [{"hostname":"{[\\:\\::num\\:fé]}"}] Inputs: undefined
Fail Pattern: [{"hostname":"[*\\:1]"}] Inputs: [{"hostname":"[::ab:1]"}]
Fail Pattern: [{"hostname":"*\\:1]"}] Inputs: undefined
Fail Pattern: ["https://foo{{@}}example.com"] Inputs: ["https://foo@example.com"]
Fail Pattern: ["https://foo{@example.com"] Inputs: ["https://foo@example.com"]
Fail Pattern: ["data\\:text/javascript,let x = 100/:tens?5;"] Inputs: ["data:text/javascript,let x = 100/5;"]
Fail Pattern: [{"pathname":"/:id/:id"}] Inputs: undefined
Fail Pattern: [{"pathname":"/foo","baseURL":""}] Inputs: undefined
Fail Pattern: ["/foo",""] Inputs: undefined
Pass Pattern: [{"pathname":"/foo"},"https://example.com"] Inputs: undefined
Fail Pattern: [{"pathname":":name*"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":name+"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":name"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"protocol":":name*"}] Inputs: [{"protocol":"foobar"}]
Fail Pattern: [{"protocol":":name+"}] Inputs: [{"protocol":"foobar"}]
Fail Pattern: [{"protocol":":name"}] Inputs: [{"protocol":"foobar"}]
Fail Pattern: [{"hostname":"bad hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad#hostname"}] Inputs: [{"hostname":"bad"}]
Fail Pattern: [{"hostname":"bad%hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad/hostname"}] Inputs: [{"hostname":"bad"}]
Fail Pattern: [{"hostname":"bad\\:hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad<hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad>hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad?hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad@hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad[hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad]hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad\\\\hostname"}] Inputs: [{"hostname":"badhostname"}]
Fail Pattern: [{"hostname":"bad^hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad|hostname"}] Inputs: undefined
Fail Pattern: [{"hostname":"bad\nhostname"}] Inputs: [{"hostname":"badhostname"}]
Fail Pattern: [{"hostname":"bad\rhostname"}] Inputs: [{"hostname":"badhostname"}]
Fail Pattern: [{"hostname":"bad\thostname"}] Inputs: [{"hostname":"badhostname"}]
Fail Pattern: [{}] Inputs: ["https://example.com/"]
Fail Pattern: [] Inputs: ["https://example.com/"]
Fail Pattern: [] Inputs: [{}]
Fail Pattern: [] Inputs: []
Fail Pattern: [{"pathname":"(foo)(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{(foo)bar}(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"(foo)?(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}(barbaz)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}{(.*)}"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}{(.*)bar}"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}{bar(.*)}"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}:bar(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo}?(.*)"}] Inputs: [{"pathname":"foobarbaz"}]
Fail Pattern: [{"pathname":"{:foo\\bar}"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":"{:foo\\.bar}"}] Inputs: [{"pathname":"foo.bar"}]
Fail Pattern: [{"pathname":"{:foo(foo)bar}"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":"{:foo}bar"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":foo\\bar"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":foo{}(.*)"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":foo{}bar"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":foo{}?bar"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":"*{}**?"}] Inputs: [{"pathname":"foobar"}]
Fail Pattern: [{"pathname":":foo(baz)(.*)"}] Inputs: [{"pathname":"bazbar"}]
Fail Pattern: [{"pathname":":foo(baz)bar"}] Inputs: [{"pathname":"bazbar"}]
Fail Pattern: [{"pathname":"*/*"}] Inputs: [{"pathname":"foo/bar"}]
Fail Pattern: [{"pathname":"*\\/*"}] Inputs: [{"pathname":"foo/bar"}]
Fail Pattern: [{"pathname":"*/{*}"}] Inputs: [{"pathname":"foo/bar"}]
Fail Pattern: [{"pathname":"*//*"}] Inputs: [{"pathname":"foo/bar"}]
Fail Pattern: [{"pathname":"/:foo."}] Inputs: [{"pathname":"/bar."}]
Fail Pattern: [{"pathname":"/:foo.."}] Inputs: [{"pathname":"/bar.."}]
Fail Pattern: [{"pathname":"./foo"}] Inputs: [{"pathname":"./foo"}]
Fail Pattern: [{"pathname":"../foo"}] Inputs: [{"pathname":"../foo"}]
Fail Pattern: [{"pathname":":foo./"}] Inputs: [{"pathname":"bar./"}]
Fail Pattern: [{"pathname":":foo../"}] Inputs: [{"pathname":"bar../"}]
Fail Pattern: [{"pathname":"/:foo\\bar"}] Inputs: [{"pathname":"/bazbar"}]
Fail Pattern: [{"pathname":"/foo/bar"},{"ignoreCase":true}] Inputs: [{"pathname":"/FOO/BAR"}]
Fail Pattern: [{"ignoreCase":true}] Inputs: [{"pathname":"/FOO/BAR"}]
Fail Pattern: ["https://example.com:8080/foo?bar#baz",{"ignoreCase":true}] Inputs: [{"pathname":"/FOO","search":"BAR","hash":"BAZ","baseURL":"https://example.com:8080"}]
Fail Pattern: ["/foo?bar#baz","https://example.com:8080",{"ignoreCase":true}] Inputs: [{"pathname":"/FOO","search":"BAR","hash":"BAZ","baseURL":"https://example.com:8080"}]
Pass Pattern: ["/foo?bar#baz",{"ignoreCase":true},"https://example.com:8080"] Inputs: [{"pathname":"/FOO","search":"BAR","hash":"BAZ","baseURL":"https://example.com:8080"}]
Fail Pattern: [{"search":"foo","baseURL":"https://example.com/a/+/b"}] Inputs: [{"search":"foo","baseURL":"https://example.com/a/+/b"}]
Fail Pattern: [{"hash":"foo","baseURL":"https://example.com/?q=*&v=?&hmm={}&umm=()"}] Inputs: [{"hash":"foo","baseURL":"https://example.com/?q=*&v=?&hmm={}&umm=()"}]
Fail Pattern: ["#foo","https://example.com/?q=*&v=?&hmm={}&umm=()"] Inputs: ["https://example.com/?q=*&v=?&hmm={}&umm=()#foo"]
Fail Pattern: [{"pathname":"/([[a-z]--a])"}] Inputs: [{"pathname":"/a"}]
Fail Pattern: [{"pathname":"/([[a-z]--a])"}] Inputs: [{"pathname":"/z"}]
Fail Pattern: [{"pathname":"/([\\d&&[0-1]])"}] Inputs: [{"pathname":"/0"}]
Fail Pattern: [{"pathname":"/([\\d&&[0-1]])"}] Inputs: [{"pathname":"/3"}]

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,188 @@
const kComponents = [
'protocol',
'username',
'password',
'hostname',
'port',
'password',
'pathname',
'search',
'hash',
];
function runTests(data) {
for (let entry of data) {
test(function() {
if (entry.expected_obj === 'error') {
assert_throws_js(TypeError, _ => new URLPattern(...entry.pattern),
'URLPattern() constructor');
return;
}
const pattern = new URLPattern(...entry.pattern);
// If the expected_obj property is not present we will automatically
// fill it with the most likely expected values.
entry.expected_obj = entry.expected_obj || {};
// The compiled URLPattern object should have a property for each
// component exposing the compiled pattern string.
for (let component of kComponents) {
// If the test case explicitly provides an expected pattern string,
// then use that. This is necessary in cases where the original
// construction pattern gets canonicalized, etc.
let expected = entry.expected_obj[component];
// If there is no explicit expected pattern string, then compute
// the expected value based on the URLPattern constructor args.
if (expected == undefined) {
// First determine if there is a baseURL present in the pattern
// input. A baseURL can be the source for many component patterns.
let baseURL = null;
if (entry.pattern.length > 0 && entry.pattern[0].baseURL) {
baseURL = new URL(entry.pattern[0].baseURL);
} else if (entry.pattern.length > 1 &&
typeof entry.pattern[1] === 'string') {
baseURL = new URL(entry.pattern[1]);
}
const EARLIER_COMPONENTS = {
protocol: [],
hostname: ["protocol"],
port: ["protocol", "hostname"],
username: [],
password: [],
pathname: ["protocol", "hostname", "port"],
search: ["protocol", "hostname", "port", "pathname"],
hash: ["protocol", "hostname", "port", "pathname", "search"],
};
// We automatically populate the expected pattern string using
// the following options in priority order:
//
// 1. If the original input explicitly provided a pattern, then
// echo that back as the expected value.
// 2. If an "earlier" component is specified, then a wildcard
// will be used rather than inheriting from the base URL.
// 3. If the baseURL exists and provides a component value then
// use that for the expected pattern.
// 4. Otherwise fall back on the default pattern of `*` for an
// empty component pattern.
//
// Note that username and password are never inherited, and will only
// need to match if explicitly specified.
if (entry.exactly_empty_components &&
entry.exactly_empty_components.includes(component)) {
expected = '';
} else if (typeof entry.pattern[0] === 'object' &&
entry.pattern[0][component]) {
expected = entry.pattern[0][component];
} else if (typeof entry.pattern[0] === 'object' &&
EARLIER_COMPONENTS[component].some(c => c in entry.pattern[0])) {
expected = '*';
} else if (baseURL && component !== 'username' && component !== 'password') {
let base_value = baseURL[component];
// Unfortunately some URL() getters include separator chars; e.g.
// the trailing `:` for the protocol. Strip those off if necessary.
if (component === 'protocol')
base_value = base_value.substring(0, base_value.length - 1);
else if (component === 'search' || component === 'hash')
base_value = base_value.substring(1, base_value.length);
expected = base_value;
} else {
expected = '*';
}
}
// Finally, assert that the compiled object property matches the
// expected property.
assert_equals(pattern[component], expected,
`compiled pattern property '${component}'`);
}
if (entry.expected_match === 'error') {
assert_throws_js(TypeError, _ => pattern.test(...entry.inputs),
'test() result');
assert_throws_js(TypeError, _ => pattern.exec(...entry.inputs),
'exec() result');
return;
}
// First, validate the test() method by converting the expected result to
// a truthy value.
assert_equals(pattern.test(...entry.inputs), !!entry.expected_match,
'test() result');
// Next, start validating the exec() method.
const exec_result = pattern.exec(...entry.inputs);
// On a failed match exec() returns null.
if (!entry.expected_match || typeof entry.expected_match !== "object") {
assert_equals(exec_result, entry.expected_match, 'exec() failed match result');
return;
}
if (!entry.expected_match.inputs)
entry.expected_match.inputs = entry.inputs;
// Next verify the result.input is correct. This may be a structured
// URLPatternInit dictionary object or a URL string.
assert_equals(exec_result.inputs.length,
entry.expected_match.inputs.length,
'exec() result.inputs.length');
for (let i = 0; i < exec_result.inputs.length; ++i) {
const input = exec_result.inputs[i];
const expected_input = entry.expected_match.inputs[i];
if (typeof input === 'string') {
assert_equals(input, expected_input, `exec() result.inputs[${i}]`);
continue;
}
for (let component of kComponents) {
assert_equals(input[component], expected_input[component],
`exec() result.inputs[${i}][${component}]`);
}
}
// Next we will compare the URLPatternComponentResult for each of these
// expected components.
for (let component of kComponents) {
let expected_obj = entry.expected_match[component];
// If the test expectations don't include a component object, then
// we auto-generate one. This is convenient for the many cases
// where the pattern has a default wildcard or empty string pattern
// for a component and the input is essentially empty.
if (!expected_obj) {
expected_obj = { input: '', groups: {} };
// Next, we must treat default wildcards differently than empty string
// patterns. The wildcard results in a capture group, but the empty
// string pattern does not. The expectation object must list which
// components should be empty instead of wildcards in
// |exactly_empty_components|.
if (!entry.exactly_empty_components ||
!entry.exactly_empty_components.includes(component)) {
expected_obj.groups['0'] = '';
}
}
// JSON does not allow us to use undefined directly, so the data file
// contains null instead. Translate to the expected undefined value
// here.
for (const key in expected_obj.groups) {
if (expected_obj.groups[key] === null) {
expected_obj.groups[key] = undefined;
}
}
assert_object_equals(exec_result[component], expected_obj,
`exec() result for ${component}`);
}
}, `Pattern: ${JSON.stringify(entry.pattern)} ` +
`Inputs: ${JSON.stringify(entry.inputs)}`);
}
}
promise_test(async function() {
const response = await fetch('resources/urlpatterntestdata.json');
const data = await response.json();
runTests(data);
}, 'Loading data...');

View file

@ -0,0 +1,15 @@
<!doctype html>
<meta charset=utf-8>
<script>
self.GLOBAL = {
isWindow: function() { return true; },
isWorker: function() { return false; },
isShadowRealm: function() { return false; },
};
</script>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="resources/urlpatterntests.js"></script>
<div id=log></div>
<script src="../urlpattern/urlpattern.any.js"></script>

View file

@ -0,0 +1,2 @@
// META: global=window,worker
// META: script=resources/urlpatterntests.js