diff options
author | Leo Kettmeir <crowlkats@toaxl.com> | 2024-08-05 01:49:28 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-08-05 01:49:28 -0700 |
commit | 27ea23ea69bc018f48abbd4ec0d0572b6d1beca4 (patch) | |
tree | 311633a9d5cbcdc55ca97faf44c06b108988e3b0 /ext/url | |
parent | 3f79db14862d856913fe4741f3d5f919bac5522a (diff) |
feat(urlpattern): add ignoreCase option & hasRegExpGroups property, and fix spec discrepancies (#24741)
Fixes #20906
Fixes #24266
Closes #21073
---------
Signed-off-by: Leo Kettmeir <crowlkats@toaxl.com>
Co-authored-by: Luca Casonato <lucacasonato@yahoo.com>
Diffstat (limited to 'ext/url')
-rw-r--r-- | ext/url/01_urlpattern.js | 65 | ||||
-rw-r--r-- | ext/url/Cargo.toml | 2 | ||||
-rw-r--r-- | ext/url/urlpattern.rs | 3 |
3 files changed, 59 insertions, 11 deletions
diff --git a/ext/url/01_urlpattern.js b/ext/url/01_urlpattern.js index ebbd8054e..0bba59cf0 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 54393db16..be62718ef 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 383076a4a..b6d9a1382 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<String>, + #[serde] options: urlpattern::UrlPatternOptions, ) -> Result<UrlPattern, AnyError> { 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) |