diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index d3c7ae93b63..5be91c9304c 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -54,9 +54,17 @@ impl URLSearchParams { match init { Some(USVStringOrURLSearchParams::USVString(init)) => { // Step 2. - *query.list.borrow_mut() = form_urlencoded::parse(init.0.as_bytes()) - .into_owned() - .collect(); + let init_bytes = match init.0.chars().next() { + Some(first_char) if first_char == '?' => { + let (_, other_bytes) = init.0.as_bytes().split_at(1); + + other_bytes + }, + _ => init.0.as_bytes(), + }; + + *query.list.borrow_mut() = + form_urlencoded::parse(init_bytes).into_owned().collect(); }, Some(USVStringOrURLSearchParams::URLSearchParams(init)) => { // Step 3. diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 1e9d2483f38..49b4d8c67cd 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -674610,7 +674610,7 @@ "testharness" ], "url/urlsearchparams-constructor.any.js": [ - "6fff03f00fdddd915f91bbec7973ebc1326b3b5a", + "398021dde2f35f427399c639871bfbb8106a3279", "testharness" ], "url/urlsearchparams-delete.any.js": [ diff --git a/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.any.js b/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.any.js index 6fff03f00fd..398021dde2f 100644 --- a/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.any.js +++ b/tests/wpt/web-platform-tests/url/urlsearchparams-constructor.any.js @@ -14,6 +14,11 @@ test(function() { assert_equals(params.toString(), "") }, "URLSearchParams constructor, no arguments") +test(function () { + var params = new URLSearchParams("?a=b") + assert_equals(params.toString(), "a=b") +}, 'URLSearchParams constructor, remove leading "?"') + test(() => { var params = new URLSearchParams(DOMException); assert_equals(params.toString(), "INDEX_SIZE_ERR=1&DOMSTRING_SIZE_ERR=2&HIERARCHY_REQUEST_ERR=3&WRONG_DOCUMENT_ERR=4&INVALID_CHARACTER_ERR=5&NO_DATA_ALLOWED_ERR=6&NO_MODIFICATION_ALLOWED_ERR=7&NOT_FOUND_ERR=8&NOT_SUPPORTED_ERR=9&INUSE_ATTRIBUTE_ERR=10&INVALID_STATE_ERR=11&SYNTAX_ERR=12&INVALID_MODIFICATION_ERR=13&NAMESPACE_ERR=14&INVALID_ACCESS_ERR=15&VALIDATION_ERR=16&TYPE_MISMATCH_ERR=17&SECURITY_ERR=18&NETWORK_ERR=19&ABORT_ERR=20&URL_MISMATCH_ERR=21"A_EXCEEDED_ERR=22&TIMEOUT_ERR=23&INVALID_NODE_TYPE_ERR=24&DATA_CLONE_ERR=25")