Skip to content

Commit 6ecaa72

Browse files
authored
Add support for two argument has and delete in URLSearchParams (#236)
1 parent 727d090 commit 6ecaa72

5 files changed

Lines changed: 47 additions & 6 deletions

File tree

builtins/web/url.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,14 @@ bool URLSearchParams::delete_(JSContext *cx, unsigned argc, JS::Value *vp) {
216216
if (!name.data)
217217
return false;
218218

219-
jsurl::params_delete(params, &name);
219+
if (args.hasDefined(1)) {
220+
auto value = core::encode_spec_string(cx, args.get(1));
221+
if (!value.data) return false;
222+
jsurl::params_delete_kv(params, &name, &value);
223+
} else {
224+
jsurl::params_delete(params, &name);
225+
}
226+
220227
args.rval().setUndefined();
221228
return true;
222229
}
@@ -230,7 +237,14 @@ bool URLSearchParams::has(JSContext *cx, unsigned argc, JS::Value *vp) {
230237
if (!name.data)
231238
return false;
232239

233-
args.rval().setBoolean(jsurl::params_has(params, &name));
240+
if (args.hasDefined(1)) {
241+
auto value = core::encode_spec_string(cx, args.get(1));
242+
if (!value.data) return false;
243+
args.rval().setBoolean(jsurl::params_has_kv(params, &name, &value));
244+
} else {
245+
args.rval().setBoolean(jsurl::params_has(params, &name));
246+
}
247+
234248
return true;
235249
}
236250

crates/rust-url/rust-url.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,8 +171,12 @@ void params_append(JSUrlSearchParams *params, SpecString name, SpecString value)
171171

172172
void params_delete(JSUrlSearchParams *params, const SpecString *name);
173173

174+
void params_delete_kv(JSUrlSearchParams *params, const SpecString *name, const SpecString *value);
175+
174176
bool params_has(const JSUrlSearchParams *params, const SpecString *name);
175177

178+
bool params_has_kv(JSUrlSearchParams *params, const SpecString *name, const SpecString *value);
179+
176180
SpecSlice params_get(const JSUrlSearchParams *params, const SpecString *name);
177181

178182
void params_at(const JSUrlSearchParams *params, size_t index, JSSearchParam *param_out);

crates/rust-url/src/lib.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,35 @@ pub extern "C" fn params_delete(params: &mut JSUrlSearchParams, name: &SpecStrin
278278
params.update_url_or_str();
279279
}
280280

281+
#[no_mangle]
282+
pub extern "C" fn params_delete_kv(
283+
params: &mut JSUrlSearchParams,
284+
name: &SpecString,
285+
value: &SpecString,
286+
) {
287+
let name: &str = name.into();
288+
let value: &str = value.into();
289+
params.list.retain(|(k, v)| !(k == name && v == value));
290+
params.update_url_or_str();
291+
}
292+
281293
#[no_mangle]
282294
pub extern "C" fn params_has(params: &JSUrlSearchParams, name: &SpecString) -> bool {
283295
let name: &str = name.into();
284296
params.list.iter().any(|kv| kv.0 == name)
285297
}
286298

299+
#[no_mangle]
300+
pub extern "C" fn params_has_kv(
301+
params: &JSUrlSearchParams,
302+
name: &SpecString,
303+
value: &SpecString,
304+
) -> bool {
305+
let name: &str = name.into();
306+
let value: &str = value.into();
307+
params.list.iter().any(|(k, v)| k == name && v == value)
308+
}
309+
287310
#[no_mangle]
288311
pub extern "C" fn params_get<'a>(
289312
params: &'a JSUrlSearchParams,

tests/wpt-harness/expectations/url/urlsearchparams-delete.any.js.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
"status": "PASS"
1919
},
2020
"Two-argument delete()": {
21-
"status": "FAIL"
21+
"status": "PASS"
2222
},
2323
"Two-argument delete() respects undefined as second arg": {
24-
"status": "FAIL"
24+
"status": "PASS"
2525
}
2626
}

tests/wpt-harness/expectations/url/urlsearchparams-has.any.js.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
"status": "PASS"
77
},
88
"Two-argument has()": {
9-
"status": "FAIL"
9+
"status": "PASS"
1010
},
1111
"Two-argument has() respects undefined as second arg": {
12-
"status": "FAIL"
12+
"status": "PASS"
1313
}
1414
}

0 commit comments

Comments
 (0)