Skip to content

Commit

Permalink
Construct URLSearchParams from array or object
Browse files Browse the repository at this point in the history
  • Loading branch information
CYBAI committed Dec 26, 2018
1 parent 47a308b commit 4ba0ab7
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 58 deletions.
32 changes: 23 additions & 9 deletions components/script/dom/urlsearchparams.rs
Expand Up @@ -5,8 +5,8 @@
use crate::dom::bindings::cell::DomRefCell;
use crate::dom::bindings::codegen::Bindings::URLSearchParamsBinding::URLSearchParamsMethods;
use crate::dom::bindings::codegen::Bindings::URLSearchParamsBinding::URLSearchParamsWrap;
use crate::dom::bindings::codegen::UnionTypes::USVStringOrURLSearchParams;
use crate::dom::bindings::error::Fallible;
use crate::dom::bindings::codegen::UnionTypes::USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString;
use crate::dom::bindings::error::{Error, Fallible};
use crate::dom::bindings::iterable::Iterable;
use crate::dom::bindings::reflector::{reflect_dom_object, Reflector};
use crate::dom::bindings::root::DomRoot;
Expand Down Expand Up @@ -47,13 +47,30 @@ impl URLSearchParams {
// https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams
pub fn Constructor(
global: &GlobalScope,
init: Option<USVStringOrURLSearchParams>,
init: Option<USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString>,
) -> Fallible<DomRoot<URLSearchParams>> {
// Step 1.
let query = URLSearchParams::new(global, None);
match init {
Some(USVStringOrURLSearchParams::USVString(init)) => {
Some(USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString::USVStringSequenceSequence(init)) => {
// Step 2.

// Step 2-1.
if init.iter().any(|pair| pair.len() != 2) {
return Err(Error::Type("Sequence initializer must only contain pair elements.".to_string()));
}

// Step 2-2.
*query.list.borrow_mut() =
init.iter().map(|pair| (pair[0].to_string(), pair[1].to_string())).collect::<Vec<_>>();
},
Some(USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString::USVStringUSVStringRecord(init)) => {
// Step 3.
*query.list.borrow_mut() =
(*init).iter().map(|(name, value)| (name.to_string(), value.to_string())).collect::<Vec<_>>();
},
Some(USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString::USVString(init)) => {
// Step 4.
let init_bytes = match init.0.chars().next() {
Some(first_char) if first_char == '?' => {
let (_, other_bytes) = init.0.as_bytes().split_at(1);
Expand All @@ -66,13 +83,10 @@ impl URLSearchParams {
*query.list.borrow_mut() =
form_urlencoded::parse(init_bytes).into_owned().collect();
},
Some(USVStringOrURLSearchParams::URLSearchParams(init)) => {
// Step 3.
*query.list.borrow_mut() = init.list.borrow().clone();
},
None => {},
}
// Step 4.

// Step 5.
Ok(query)
}

Expand Down
4 changes: 3 additions & 1 deletion components/script/dom/webidls/URLSearchParams.webidl
Expand Up @@ -6,7 +6,9 @@
* https://url.spec.whatwg.org/#interface-urlsearchparams
*/

[Constructor(optional (USVString or URLSearchParams) init/* = ""*/), Exposed=(Window,Worker)]
[Constructor(
optional (sequence<sequence<USVString>> or record<USVString, USVString> or USVString) init/* = ""*/
), Exposed=(Window,Worker)]
interface URLSearchParams {
void append(USVString name, USVString value);
void delete(USVString name);
Expand Down
43 changes: 0 additions & 43 deletions tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini
@@ -1,51 +1,8 @@
[urlsearchparams-constructor.any.worker.html]
[Construct with object with two keys]
expected: FAIL

[Construct with object with NULL, non-ASCII, and surrogate keys]
expected: FAIL

[URLSearchParams constructor, {} as argument]
expected: FAIL

[Custom [Symbol.iterator\]]
expected: FAIL

[URLSearchParams constructor, DOMException as argument]
expected: FAIL

[Constructor with sequence of sequences of strings]
expected: FAIL

[Construct with object with +]
expected: FAIL

[Construct with array with two keys]
expected: FAIL


[urlsearchparams-constructor.any.html]
[Construct with object with two keys]
expected: FAIL

[Construct with object with NULL, non-ASCII, and surrogate keys]
expected: FAIL

[URLSearchParams constructor, {} as argument]
expected: FAIL

[Custom [Symbol.iterator\]]
expected: FAIL

[URLSearchParams constructor, DOMException as argument]
expected: FAIL

[Constructor with sequence of sequences of strings]
expected: FAIL

[Construct with object with +]
expected: FAIL

[Construct with array with two keys]
expected: FAIL

5 changes: 0 additions & 5 deletions tests/wpt/metadata/xhr/send-entity-body-basic.htm.ini

This file was deleted.

0 comments on commit 4ba0ab7

Please sign in to comment.