summaryrefslogtreecommitdiff
path: root/ext/url
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2024-08-05 01:49:28 -0700
committerGitHub <noreply@github.com>2024-08-05 01:49:28 -0700
commit27ea23ea69bc018f48abbd4ec0d0572b6d1beca4 (patch)
tree311633a9d5cbcdc55ca97faf44c06b108988e3b0 /ext/url
parent3f79db14862d856913fe4741f3d5f919bac5522a (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.js65
-rw-r--r--ext/url/Cargo.toml2
-rw-r--r--ext/url/urlpattern.rs3
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)