aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/urlsearchparams.rs
diff options
context:
space:
mode:
authorCYBAI <cyb.ai.815@gmail.com>2018-12-25 21:45:39 +0800
committerCYBAI <cyb.ai.815@gmail.com>2018-12-26 18:05:42 +0800
commit4ba0ab7bd01482649ce9beff905d35c7471f3e1b (patch)
tree07b3233c0d06d26f16c0f2ada19f49182a5284c4 /components/script/dom/urlsearchparams.rs
parent47a308b277f1023f5fda0c3db465317a8691818a (diff)
downloadservo-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.rs32
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)
}