diff options
author | CYBAI <cyb.ai.815@gmail.com> | 2018-12-25 21:45:39 +0800 |
---|---|---|
committer | CYBAI <cyb.ai.815@gmail.com> | 2018-12-26 18:05:42 +0800 |
commit | 4ba0ab7bd01482649ce9beff905d35c7471f3e1b (patch) | |
tree | 07b3233c0d06d26f16c0f2ada19f49182a5284c4 /components/script/dom/urlsearchparams.rs | |
parent | 47a308b277f1023f5fda0c3db465317a8691818a (diff) | |
download | servo-4ba0ab7bd01482649ce9beff905d35c7471f3e1b.tar.gz servo-4ba0ab7bd01482649ce9beff905d35c7471f3e1b.zip |
Construct URLSearchParams from array or object
Diffstat (limited to 'components/script/dom/urlsearchparams.rs')
-rw-r--r-- | components/script/dom/urlsearchparams.rs | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index 5be91c9304c..9a4e6b54765 100644 --- a/components/script/dom/urlsearchparams.rs +++ b/components/script/dom/urlsearchparams.rs @@ -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) } |