From 65b1cf64125b674630b232e01d31300ce4e2f0be Mon Sep 17 00:00:00 2001 From: cromery Date: Fri, 19 Dec 2025 13:27:50 +0100 Subject: [PATCH] feat(url): implement URLSearchParams.size property Adds the readonly .size property to URLSearchParams as per the WHATWG URL Standard, returning the number of name-value pairs. --- builtins/web/url.cpp | 11 +++++++++-- builtins/web/url.h | 1 + crates/rust-url/rust-url.h | 2 ++ crates/rust-url/src/lib.rs | 5 +++++ .../expectations/url/urlsearchparams-size.any.js.json | 10 +++++----- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/builtins/web/url.cpp b/builtins/web/url.cpp index 83dd01b2..a6dc023b 100644 --- a/builtins/web/url.cpp +++ b/builtins/web/url.cpp @@ -174,6 +174,7 @@ const JSFunctionSpec URLSearchParams::methods[] = { }; const JSPropertySpec URLSearchParams::properties[] = { + JS_PSG("size", URLSearchParams::size_get, JSPROP_ENUMERATE), JS_PS_END, }; @@ -347,6 +348,14 @@ bool URLSearchParams::set(JSContext *cx, unsigned argc, JS::Value *vp) { return true; } +bool URLSearchParams::size_get(JSContext *cx, unsigned argc, JS::Value *vp) { + METHOD_HEADER(0) + auto *params = + static_cast(JS::GetReservedSlot(self, Slots::Params).toPrivate()); + args.rval().setNumber(jsurl::params_size(params)); + return true; +} + bool URLSearchParams::sort(JSContext *cx, unsigned argc, JS::Value *vp) { METHOD_HEADER(0) auto *params = @@ -831,5 +840,3 @@ bool install(api::Engine *engine) { } } // namespace builtins::web::url - - diff --git a/builtins/web/url.h b/builtins/web/url.h index 5ee7e9ba..999de6a9 100644 --- a/builtins/web/url.h +++ b/builtins/web/url.h @@ -32,6 +32,7 @@ class URLSearchParams : public BuiltinNoConstructor { static bool has(JSContext *cx, unsigned argc, JS::Value *vp); static bool getAll(JSContext *cx, unsigned argc, JS::Value *vp); static bool sort(JSContext *cx, unsigned argc, JS::Value *vp); + static bool size_get(JSContext *cx, unsigned argc, JS::Value *vp); static bool forEach(JSContext *cx, unsigned argc, JS::Value *vp); static bool delete_(JSContext *cx, unsigned argc, JS::Value *vp); static bool get(JSContext *cx, unsigned argc, JS::Value *vp); diff --git a/crates/rust-url/rust-url.h b/crates/rust-url/rust-url.h index d7c1f6c5..d2ea8dd8 100644 --- a/crates/rust-url/rust-url.h +++ b/crates/rust-url/rust-url.h @@ -185,6 +185,8 @@ CVec params_get_all(const JSUrlSearchParams *params, const SpecString void params_set(JSUrlSearchParams *params, SpecString name, SpecString value); +size_t params_size(JSUrlSearchParams *params); + void params_sort(JSUrlSearchParams *params); SpecSlice params_to_string(const JSUrlSearchParams *params); diff --git a/crates/rust-url/src/lib.rs b/crates/rust-url/src/lib.rs index a8957bc0..39a634ec 100644 --- a/crates/rust-url/src/lib.rs +++ b/crates/rust-url/src/lib.rs @@ -408,6 +408,11 @@ pub extern "C" fn params_set(params: &mut JSUrlSearchParams, name: SpecString, v params.update_url_or_str(); } +#[no_mangle] +pub extern "C" fn params_size(params: &JSUrlSearchParams) -> usize { + params.list.len() +} + #[no_mangle] pub extern "C" fn params_sort(params: &mut JSUrlSearchParams) { params diff --git a/tests/wpt-harness/expectations/url/urlsearchparams-size.any.js.json b/tests/wpt-harness/expectations/url/urlsearchparams-size.any.js.json index 831902de..2698c00b 100644 --- a/tests/wpt-harness/expectations/url/urlsearchparams-size.any.js.json +++ b/tests/wpt-harness/expectations/url/urlsearchparams-size.any.js.json @@ -1,14 +1,14 @@ { "URLSearchParams's size and deletion": { - "status": "FAIL" + "status": "PASS" }, "URLSearchParams's size and addition": { - "status": "FAIL" + "status": "PASS" }, "URLSearchParams's size when obtained from a URL": { - "status": "FAIL" + "status": "PASS" }, "URLSearchParams's size when obtained from a URL and using .search": { - "status": "FAIL" + "status": "PASS" } -} \ No newline at end of file +}