diff --git a/Cargo.lock b/Cargo.lock index e26dd67b1d1b8e..6da1207fb84388 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5497,9 +5497,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.4" +version = "1.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" dependencies = [ "aho-corasick", "memchr", @@ -7677,11 +7677,10 @@ dependencies = [ [[package]] name = "urlpattern" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bd5ff03aea02fa45b13a7980151fe45009af1980ba69f651ec367121a31609" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" dependencies = [ - "derive_more", "regex", "serde", "unic-ucd-ident", diff --git a/ext/url/01_urlpattern.js b/ext/url/01_urlpattern.js index ebbd8054e60247..0bba59cf0e6b34 100644 --- a/ext/url/01_urlpattern.js +++ b/ext/url/01_urlpattern.js @@ -137,33 +137,65 @@ class SampledLRUCache { const matchInputCache = new SampledLRUCache(4096); +const _hasRegExpGroups = Symbol("[[hasRegExpGroups]]"); + class URLPattern { /** @type {Components} */ [_components]; + [_hasRegExpGroups]; #reusedResult; /** * @param {URLPatternInput} input - * @param {string} [baseURL] + * @param {string} [baseURLOrOptions] + * @param {string} [maybeOptions] */ - constructor(input, baseURL = undefined) { + constructor( + input, + baseURLOrOptions = undefined, + maybeOptions = undefined, + ) { this[webidl.brand] = webidl.brand; const prefix = "Failed to construct 'URLPattern'"; - webidl.requiredArguments(arguments.length, 1, prefix); - input = webidl.converters.URLPatternInput(input, prefix, "Argument 1"); - if (baseURL !== undefined) { - baseURL = webidl.converters.USVString(baseURL, prefix, "Argument 2"); + + let baseURL; + let options; + if (webidl.type(baseURLOrOptions) === "String") { + webidl.requiredArguments(arguments.length, 1, prefix); + input = webidl.converters.URLPatternInput(input, prefix, "Argument 1"); + baseURL = webidl.converters.USVString( + baseURLOrOptions, + prefix, + "Argument 2", + ); + options = webidl.converters.URLPatternOptions( + maybeOptions !== undefined ? maybeOptions : { __proto: null }, + prefix, + "Argument 3", + ); + } else { + if (input !== undefined) { + input = webidl.converters.URLPatternInput(input, prefix, "Argument 1"); + } else { + input = { __proto__: null }; + } + options = webidl.converters.URLPatternOptions( + maybeOptions, + prefix, + "Argument 2", + ); } - const components = op_urlpattern_parse(input, baseURL); + const components = op_urlpattern_parse(input, baseURL, options); + this[_hasRegExpGroups] = components.hasRegexpGroups; for (let i = 0; i < COMPONENTS_KEYS.length; ++i) { const key = COMPONENTS_KEYS[i]; try { components[key].regexp = new SafeRegExp( components[key].regexpString, - "u", + options.ignoreCase ? "ui" : "u", ); } catch (e) { throw new TypeError(`${prefix}: ${key} is invalid; ${e.message}`); @@ -212,6 +244,11 @@ class URLPattern { return this[_components].hash.patternString; } + get hasRegExpGroups() { + webidl.assertBranded(this, URLPatternPrototype); + return this[_hasRegExpGroups]; + } + /** * @param {URLPatternInput} input * @param {string} [baseURL] @@ -312,7 +349,7 @@ class URLPattern { const groups = res.groups; for (let i = 0; i < groupList.length; ++i) { // TODO(lucacasonato): this is vulnerable to override mistake - groups[groupList[i]] = match[i + 1] ?? ""; + groups[groupList[i]] = match[i + 1]; } break; } @@ -344,6 +381,7 @@ class URLPattern { "pathname", "search", "hash", + "hasRegExpGroups", ], }), inspectOptions, @@ -375,4 +413,13 @@ webidl.converters["URLPatternInput"] = (V, prefix, context, opts) => { return webidl.converters.USVString(V, prefix, context, opts); }; +webidl.converters.URLPatternOptions = webidl + .createDictionaryConverter("URLPatternOptions", [ + { + key: "ignoreCase", + converter: webidl.converters.boolean, + defaultValue: false, + }, + ]); + export { URLPattern }; diff --git a/ext/url/Cargo.toml b/ext/url/Cargo.toml index 54393db169e192..be62718effe08b 100644 --- a/ext/url/Cargo.toml +++ b/ext/url/Cargo.toml @@ -15,7 +15,7 @@ path = "lib.rs" [dependencies] deno_core.workspace = true -urlpattern = "0.2.0" +urlpattern = "0.3.0" [dev-dependencies] deno_bench_util.workspace = true diff --git a/ext/url/urlpattern.rs b/ext/url/urlpattern.rs index 383076a4a81198..b6d9a13828c8d3 100644 --- a/ext/url/urlpattern.rs +++ b/ext/url/urlpattern.rs @@ -14,6 +14,7 @@ use urlpattern::quirks::UrlPattern; pub fn op_urlpattern_parse( #[serde] input: StringOrInit, #[string] base_url: Option, + #[serde] options: urlpattern::UrlPatternOptions, ) -> Result { let init = urlpattern::quirks::process_construct_pattern_input( input, @@ -21,7 +22,7 @@ pub fn op_urlpattern_parse( ) .map_err(|e| type_error(e.to_string()))?; - let pattern = urlpattern::quirks::parse_pattern(init) + let pattern = urlpattern::quirks::parse_pattern(init, options) .map_err(|e| type_error(e.to_string()))?; Ok(pattern) diff --git a/tests/wpt/runner/expectation.json b/tests/wpt/runner/expectation.json index cd212f9c4ea64c..70e32f92f7125e 100644 --- a/tests/wpt/runner/expectation.json +++ b/tests/wpt/runner/expectation.json @@ -12909,380 +12909,40 @@ "Component: hash Left: {\"hash\":\"a\"} Right: {\"hash\":\"b\"}" ], "urlpattern.any.html": [ - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar/baz\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?otherquery#otherhash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?otherquery#otherhash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?query#hash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar/baz\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"http://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar/baz\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://other.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"http://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/*?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/**\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"./foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"/\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"{/bar}\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"\\\\/bar\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"b\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./b\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\":name.html\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo.html\"]", - "Pattern: [{\"pathname\":\"/foo/bar\"}] Inputs: [\"./foo/bar\",\"https://example.com\"]", - "Pattern: [\"https://example.com:8080/foo?bar#baz\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"http{s}?://{*.}?example.com/:product/:endpoint\"] Inputs: [\"https://sub.example.com/foo/bar\"]", - "Pattern: [\"https://example.com?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com:8080?foo\"] Inputs: [\"https://example.com:8080/?foo\"]", - "Pattern: [\"https://example.com:8080#foo\"] Inputs: [\"https://example.com:8080/#foo\"]", - "Pattern: [\"https://example.com/?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com/*?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/*\\\\?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/:name?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/:name\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/\"] Inputs: [\"https://example.com:8080/\"]", - "Pattern: [\"data\\\\:foobar\"] Inputs: [\"data:foobar\"]", - "Pattern: [\"https://{sub.}?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example(.com/)foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub(?:.))?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"file:///foo/bar\"] Inputs: [\"file:///foo/bar\"]", - "Pattern: [\"data:\"] Inputs: [\"data:\"]", - "Pattern: [\"foo://bar\"] Inputs: [\"foo://bad_url_browser_interop\"]", - "Pattern: [\"https://example.com/foo?bar#baz\"] Inputs: [{\"protocol\":\"https:\",\"search\":\"?bar\",\"hash\":\"#baz\",\"baseURL\":\"http://example.com/foo\"}]", - "Pattern: [\"?bar#baz\",\"https://example.com/foo\"] Inputs: [\"?bar#baz\",\"https://example.com/foo\"]", - "Pattern: [\"?bar\",\"https://example.com/foo#baz\"] Inputs: [\"?bar\",\"https://example.com/foo#snafu\"]", - "Pattern: [\"#baz\",\"https://example.com/foo?bar\"] Inputs: [\"#baz\",\"https://example.com/foo?bar\"]", - "Pattern: [\"#baz\",\"https://example.com/foo\"] Inputs: [\"#baz\",\"https://example.com/foo\"]", - "Pattern: [\"https://foo\\\\:bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https://foo@example.com\"] Inputs: [\"https://foo@example.com\"]", - "Pattern: [\"https://\\\\:bar@example.com\"] Inputs: [\"https://:bar@example.com\"]", - "Pattern: [\"https://:user::pass@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https\\\\:foo\\\\:bar@example.com\"] Inputs: [\"https:foo:bar@example.com\"]", - "Pattern: [\"data\\\\:foo\\\\:bar@example.com\"] Inputs: [\"data:foo:bar@example.com\"]", - "Pattern: [\"https://foo{\\\\:}bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"data{\\\\:}channel.html\",\"https://example.com\"] Inputs: [\"https://example.com/data:channel.html\"]", - "Pattern: [\"http://[\\\\:\\\\:1]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:1]:8080/\"] Inputs: [\"http://[::1]:8080/\"]", - "Pattern: [\"http://[\\\\:\\\\:a]/\"] Inputs: [\"http://[::a]/\"]", - "Pattern: [\"http://[:address]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:AB\\\\::num]/\"] Inputs: [\"http://[::ab:1]/\"]", - "Pattern: [\"data\\\\:text/javascript,let x = 100/:tens?5;\"] Inputs: [\"data:text/javascript,let x = 100/5;\"]", "Pattern: [{\"hostname\":\"bad\\\\:hostname\"}] Inputs: undefined", - "Pattern: [] Inputs: [\"https://example.com/\"]", - "Pattern: [] Inputs: [{}]", "Pattern: [] Inputs: []", - "Pattern: [{\"pathname\":\"*{}**?\"}] Inputs: [{\"pathname\":\"foobar\"}]", "Pattern: [{\"pathname\":\"/foo/bar\"},{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO/BAR\"}]", "Pattern: [\"https://example.com:8080/foo?bar#baz\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}] Inputs: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}]", - "Pattern: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}] Inputs: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}]", - "Pattern: [\"#foo\",\"https://example.com/?q=*&v=?&hmm={}&umm=()\"] Inputs: [\"https://example.com/?q=*&v=?&hmm={}&umm=()#foo\"]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/a\"}]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/z\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/0\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/3\"}]" ], "urlpattern.any.worker.html": [ - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar/baz\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?otherquery#otherhash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?otherquery#otherhash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?query#hash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar/baz\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"http://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar/baz\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://other.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"http://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/*?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/**\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"./foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"/\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"{/bar}\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"\\\\/bar\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"b\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./b\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\":name.html\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo.html\"]", - "Pattern: [{\"pathname\":\"/foo/bar\"}] Inputs: [\"./foo/bar\",\"https://example.com\"]", - "Pattern: [\"https://example.com:8080/foo?bar#baz\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"http{s}?://{*.}?example.com/:product/:endpoint\"] Inputs: [\"https://sub.example.com/foo/bar\"]", - "Pattern: [\"https://example.com?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com:8080?foo\"] Inputs: [\"https://example.com:8080/?foo\"]", - "Pattern: [\"https://example.com:8080#foo\"] Inputs: [\"https://example.com:8080/#foo\"]", - "Pattern: [\"https://example.com/?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com/*?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/*\\\\?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/:name?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/:name\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/\"] Inputs: [\"https://example.com:8080/\"]", - "Pattern: [\"data\\\\:foobar\"] Inputs: [\"data:foobar\"]", - "Pattern: [\"https://{sub.}?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example(.com/)foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub(?:.))?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"file:///foo/bar\"] Inputs: [\"file:///foo/bar\"]", - "Pattern: [\"data:\"] Inputs: [\"data:\"]", - "Pattern: [\"foo://bar\"] Inputs: [\"foo://bad_url_browser_interop\"]", - "Pattern: [\"https://example.com/foo?bar#baz\"] Inputs: [{\"protocol\":\"https:\",\"search\":\"?bar\",\"hash\":\"#baz\",\"baseURL\":\"http://example.com/foo\"}]", - "Pattern: [\"?bar#baz\",\"https://example.com/foo\"] Inputs: [\"?bar#baz\",\"https://example.com/foo\"]", - "Pattern: [\"?bar\",\"https://example.com/foo#baz\"] Inputs: [\"?bar\",\"https://example.com/foo#snafu\"]", - "Pattern: [\"#baz\",\"https://example.com/foo?bar\"] Inputs: [\"#baz\",\"https://example.com/foo?bar\"]", - "Pattern: [\"#baz\",\"https://example.com/foo\"] Inputs: [\"#baz\",\"https://example.com/foo\"]", - "Pattern: [\"https://foo\\\\:bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https://foo@example.com\"] Inputs: [\"https://foo@example.com\"]", - "Pattern: [\"https://\\\\:bar@example.com\"] Inputs: [\"https://:bar@example.com\"]", - "Pattern: [\"https://:user::pass@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https\\\\:foo\\\\:bar@example.com\"] Inputs: [\"https:foo:bar@example.com\"]", - "Pattern: [\"data\\\\:foo\\\\:bar@example.com\"] Inputs: [\"data:foo:bar@example.com\"]", - "Pattern: [\"https://foo{\\\\:}bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"data{\\\\:}channel.html\",\"https://example.com\"] Inputs: [\"https://example.com/data:channel.html\"]", - "Pattern: [\"http://[\\\\:\\\\:1]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:1]:8080/\"] Inputs: [\"http://[::1]:8080/\"]", - "Pattern: [\"http://[\\\\:\\\\:a]/\"] Inputs: [\"http://[::a]/\"]", - "Pattern: [\"http://[:address]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:AB\\\\::num]/\"] Inputs: [\"http://[::ab:1]/\"]", - "Pattern: [\"data\\\\:text/javascript,let x = 100/:tens?5;\"] Inputs: [\"data:text/javascript,let x = 100/5;\"]", "Pattern: [{\"hostname\":\"bad\\\\:hostname\"}] Inputs: undefined", - "Pattern: [] Inputs: [\"https://example.com/\"]", - "Pattern: [] Inputs: [{}]", "Pattern: [] Inputs: []", - "Pattern: [{\"pathname\":\"*{}**?\"}] Inputs: [{\"pathname\":\"foobar\"}]", "Pattern: [{\"pathname\":\"/foo/bar\"},{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO/BAR\"}]", "Pattern: [\"https://example.com:8080/foo?bar#baz\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}] Inputs: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}]", - "Pattern: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}] Inputs: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}]", - "Pattern: [\"#foo\",\"https://example.com/?q=*&v=?&hmm={}&umm=()\"] Inputs: [\"https://example.com/?q=*&v=?&hmm={}&umm=()#foo\"]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/a\"}]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/z\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/0\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/3\"}]" ], "urlpattern.https.any.html": [ - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar/baz\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?otherquery#otherhash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?otherquery#otherhash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?query#hash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar/baz\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"http://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar/baz\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://other.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"http://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/*?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/**\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"./foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"/\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"{/bar}\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"\\\\/bar\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"b\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./b\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\":name.html\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo.html\"]", - "Pattern: [{\"pathname\":\"/foo/bar\"}] Inputs: [\"./foo/bar\",\"https://example.com\"]", - "Pattern: [\"https://example.com:8080/foo?bar#baz\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"http{s}?://{*.}?example.com/:product/:endpoint\"] Inputs: [\"https://sub.example.com/foo/bar\"]", - "Pattern: [\"https://example.com?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com:8080?foo\"] Inputs: [\"https://example.com:8080/?foo\"]", - "Pattern: [\"https://example.com:8080#foo\"] Inputs: [\"https://example.com:8080/#foo\"]", - "Pattern: [\"https://example.com/?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com/*?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/*\\\\?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/:name?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/:name\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/\"] Inputs: [\"https://example.com:8080/\"]", - "Pattern: [\"data\\\\:foobar\"] Inputs: [\"data:foobar\"]", - "Pattern: [\"https://{sub.}?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example(.com/)foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub(?:.))?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"file:///foo/bar\"] Inputs: [\"file:///foo/bar\"]", - "Pattern: [\"data:\"] Inputs: [\"data:\"]", - "Pattern: [\"foo://bar\"] Inputs: [\"foo://bad_url_browser_interop\"]", - "Pattern: [\"https://example.com/foo?bar#baz\"] Inputs: [{\"protocol\":\"https:\",\"search\":\"?bar\",\"hash\":\"#baz\",\"baseURL\":\"http://example.com/foo\"}]", - "Pattern: [\"?bar#baz\",\"https://example.com/foo\"] Inputs: [\"?bar#baz\",\"https://example.com/foo\"]", - "Pattern: [\"?bar\",\"https://example.com/foo#baz\"] Inputs: [\"?bar\",\"https://example.com/foo#snafu\"]", - "Pattern: [\"#baz\",\"https://example.com/foo?bar\"] Inputs: [\"#baz\",\"https://example.com/foo?bar\"]", - "Pattern: [\"#baz\",\"https://example.com/foo\"] Inputs: [\"#baz\",\"https://example.com/foo\"]", - "Pattern: [\"https://foo\\\\:bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https://foo@example.com\"] Inputs: [\"https://foo@example.com\"]", - "Pattern: [\"https://\\\\:bar@example.com\"] Inputs: [\"https://:bar@example.com\"]", - "Pattern: [\"https://:user::pass@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https\\\\:foo\\\\:bar@example.com\"] Inputs: [\"https:foo:bar@example.com\"]", - "Pattern: [\"data\\\\:foo\\\\:bar@example.com\"] Inputs: [\"data:foo:bar@example.com\"]", - "Pattern: [\"https://foo{\\\\:}bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"data{\\\\:}channel.html\",\"https://example.com\"] Inputs: [\"https://example.com/data:channel.html\"]", - "Pattern: [\"http://[\\\\:\\\\:1]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:1]:8080/\"] Inputs: [\"http://[::1]:8080/\"]", - "Pattern: [\"http://[\\\\:\\\\:a]/\"] Inputs: [\"http://[::a]/\"]", - "Pattern: [\"http://[:address]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:AB\\\\::num]/\"] Inputs: [\"http://[::ab:1]/\"]", - "Pattern: [\"data\\\\:text/javascript,let x = 100/:tens?5;\"] Inputs: [\"data:text/javascript,let x = 100/5;\"]", "Pattern: [{\"hostname\":\"bad\\\\:hostname\"}] Inputs: undefined", - "Pattern: [] Inputs: [\"https://example.com/\"]", - "Pattern: [] Inputs: [{}]", "Pattern: [] Inputs: []", - "Pattern: [{\"pathname\":\"*{}**?\"}] Inputs: [{\"pathname\":\"foobar\"}]", "Pattern: [{\"pathname\":\"/foo/bar\"},{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO/BAR\"}]", "Pattern: [\"https://example.com:8080/foo?bar#baz\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}] Inputs: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}]", - "Pattern: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}] Inputs: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}]", - "Pattern: [\"#foo\",\"https://example.com/?q=*&v=?&hmm={}&umm=()\"] Inputs: [\"https://example.com/?q=*&v=?&hmm={}&umm=()#foo\"]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/a\"}]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/z\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/0\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/3\"}]" ], "urlpattern.https.any.worker.html": [ - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar/baz\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?otherquery#otherhash\"}] Inputs: [{\"protocol\":\"https\",\"hostname\":\"example.com\",\"pathname\":\"/foo/bar\",\"search\":\"otherquery\",\"hash\":\"otherhash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?otherquery#otherhash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar?query#hash\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://example.com/foo/bar/baz\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"https://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [\"http://other.com/foo/bar\"]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar/baz\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://other.com\"}]", - "Pattern: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"https://example.com?query#hash\"}] Inputs: [{\"pathname\":\"/foo/bar\",\"baseURL\":\"http://example.com\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/:bar*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/*?\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/(.*)*\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"/foo/**\"}] Inputs: [{\"pathname\":\"/foo\"}]", - "Pattern: [{\"pathname\":\"./foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"\",\"baseURL\":\"https://example.com\"}] Inputs: [{\"pathname\":\"/\",\"baseURL\":\"https://example.com\"}]", - "Pattern: [{\"pathname\":\"{/bar}\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"\\\\/bar\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./bar\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"b\",\"baseURL\":\"https://example.com/foo/\"}] Inputs: [{\"pathname\":\"./b\",\"baseURL\":\"https://example.com/foo/\"}]", - "Pattern: [{\"pathname\":\"foo/bar\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo/bar\"]", - "Pattern: [{\"pathname\":\":name.html\",\"baseURL\":\"https://example.com\"}] Inputs: [\"https://example.com/foo.html\"]", - "Pattern: [{\"pathname\":\"/foo/bar\"}] Inputs: [\"./foo/bar\",\"https://example.com\"]", - "Pattern: [\"https://example.com:8080/foo?bar#baz\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\"] Inputs: [{\"pathname\":\"/foo\",\"search\":\"bar\",\"hash\":\"baz\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"http{s}?://{*.}?example.com/:product/:endpoint\"] Inputs: [\"https://sub.example.com/foo/bar\"]", - "Pattern: [\"https://example.com?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com:8080?foo\"] Inputs: [\"https://example.com:8080/?foo\"]", - "Pattern: [\"https://example.com:8080#foo\"] Inputs: [\"https://example.com:8080/#foo\"]", - "Pattern: [\"https://example.com/?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/#foo\"] Inputs: [\"https://example.com/#foo\"]", - "Pattern: [\"https://example.com/*?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/*\\\\?foo\"] Inputs: [\"https://example.com/?foo\"]", - "Pattern: [\"https://example.com/:name?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/:name\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/(bar)\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/{bar}\\\\?foo\"] Inputs: [\"https://example.com/bar?foo\"]", - "Pattern: [\"https://example.com/\"] Inputs: [\"https://example.com:8080/\"]", - "Pattern: [\"data\\\\:foobar\"] Inputs: [\"data:foobar\"]", - "Pattern: [\"https://{sub.}?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub.)?example(.com/)foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"https://(sub(?:.))?example.com/foo\"] Inputs: [\"https://example.com/foo\"]", - "Pattern: [\"file:///foo/bar\"] Inputs: [\"file:///foo/bar\"]", - "Pattern: [\"data:\"] Inputs: [\"data:\"]", - "Pattern: [\"foo://bar\"] Inputs: [\"foo://bad_url_browser_interop\"]", - "Pattern: [\"https://example.com/foo?bar#baz\"] Inputs: [{\"protocol\":\"https:\",\"search\":\"?bar\",\"hash\":\"#baz\",\"baseURL\":\"http://example.com/foo\"}]", - "Pattern: [\"?bar#baz\",\"https://example.com/foo\"] Inputs: [\"?bar#baz\",\"https://example.com/foo\"]", - "Pattern: [\"?bar\",\"https://example.com/foo#baz\"] Inputs: [\"?bar\",\"https://example.com/foo#snafu\"]", - "Pattern: [\"#baz\",\"https://example.com/foo?bar\"] Inputs: [\"#baz\",\"https://example.com/foo?bar\"]", - "Pattern: [\"#baz\",\"https://example.com/foo\"] Inputs: [\"#baz\",\"https://example.com/foo\"]", - "Pattern: [\"https://foo\\\\:bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https://foo@example.com\"] Inputs: [\"https://foo@example.com\"]", - "Pattern: [\"https://\\\\:bar@example.com\"] Inputs: [\"https://:bar@example.com\"]", - "Pattern: [\"https://:user::pass@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"https\\\\:foo\\\\:bar@example.com\"] Inputs: [\"https:foo:bar@example.com\"]", - "Pattern: [\"data\\\\:foo\\\\:bar@example.com\"] Inputs: [\"data:foo:bar@example.com\"]", - "Pattern: [\"https://foo{\\\\:}bar@example.com\"] Inputs: [\"https://foo:bar@example.com\"]", - "Pattern: [\"data{\\\\:}channel.html\",\"https://example.com\"] Inputs: [\"https://example.com/data:channel.html\"]", - "Pattern: [\"http://[\\\\:\\\\:1]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:1]:8080/\"] Inputs: [\"http://[::1]:8080/\"]", - "Pattern: [\"http://[\\\\:\\\\:a]/\"] Inputs: [\"http://[::a]/\"]", - "Pattern: [\"http://[:address]/\"] Inputs: [\"http://[::1]/\"]", - "Pattern: [\"http://[\\\\:\\\\:AB\\\\::num]/\"] Inputs: [\"http://[::ab:1]/\"]", - "Pattern: [\"data\\\\:text/javascript,let x = 100/:tens?5;\"] Inputs: [\"data:text/javascript,let x = 100/5;\"]", "Pattern: [{\"hostname\":\"bad\\\\:hostname\"}] Inputs: undefined", - "Pattern: [] Inputs: [\"https://example.com/\"]", - "Pattern: [] Inputs: [{}]", "Pattern: [] Inputs: []", - "Pattern: [{\"pathname\":\"*{}**?\"}] Inputs: [{\"pathname\":\"foobar\"}]", "Pattern: [{\"pathname\":\"/foo/bar\"},{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO/BAR\"}]", "Pattern: [\"https://example.com:8080/foo?bar#baz\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [\"/foo?bar#baz\",\"https://example.com:8080\",{\"ignoreCase\":true}] Inputs: [{\"pathname\":\"/FOO\",\"search\":\"BAR\",\"hash\":\"BAZ\",\"baseURL\":\"https://example.com:8080\"}]", - "Pattern: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}] Inputs: [{\"search\":\"foo\",\"baseURL\":\"https://example.com/a/+/b\"}]", - "Pattern: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}] Inputs: [{\"hash\":\"foo\",\"baseURL\":\"https://example.com/?q=*&v=?&hmm={}&umm=()\"}]", - "Pattern: [\"#foo\",\"https://example.com/?q=*&v=?&hmm={}&umm=()\"] Inputs: [\"https://example.com/?q=*&v=?&hmm={}&umm=()#foo\"]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/a\"}]", "Pattern: [{\"pathname\":\"/([[a-z]--a])\"}] Inputs: [{\"pathname\":\"/z\"}]", "Pattern: [{\"pathname\":\"/([\\\\d&&[0-1]])\"}] Inputs: [{\"pathname\":\"/0\"}]", @@ -13292,10 +12952,10 @@ "urlpattern-compare.any.sharedworker.html": false, "urlpattern-compare.https.any.serviceworker.html": false, "urlpattern-compare.https.any.sharedworker.html": false, - "urlpattern-hasregexpgroups.any.html": false, + "urlpattern-hasregexpgroups.any.html": true, "urlpattern-hasregexpgroups.any.serviceworker.html": false, "urlpattern-hasregexpgroups.any.sharedworker.html": false, - "urlpattern-hasregexpgroups.any.worker.html": false, + "urlpattern-hasregexpgroups.any.worker.html": true, "urlpattern.any.serviceworker.html": false, "urlpattern.any.sharedworker.html": false, "urlpattern.https.any.serviceworker.html": false,