Construct URLSearchParams from array or object

This commit is contained in:
CYBAI 2018-12-25 21:45:39 +08:00
parent 47a308b277
commit 4ba0ab7bd0
4 changed files with 26 additions and 58 deletions

View file

@ -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;
@ -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);
@ -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)
}

View file

@ -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);

View file

@ -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

View file

@ -1,5 +0,0 @@
[send-entity-body-basic.htm]
type: testharness
[XMLHttpRequest: send() - data argument (1=2&3=4)]
expected: FAIL