From 4ba0ab7bd01482649ce9beff905d35c7471f3e1b Mon Sep 17 00:00:00 2001 From: CYBAI Date: Tue, 25 Dec 2018 21:45:39 +0800 Subject: [PATCH] Construct URLSearchParams from array or object --- components/script/dom/urlsearchparams.rs | 32 ++++++++++---- .../script/dom/webidls/URLSearchParams.webidl | 4 +- .../urlsearchparams-constructor.any.js.ini | 43 ------------------- .../xhr/send-entity-body-basic.htm.ini | 5 --- 4 files changed, 26 insertions(+), 58 deletions(-) delete mode 100644 tests/wpt/metadata/xhr/send-entity-body-basic.htm.ini diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs index 5be91c9304cf..9a4e6b547650 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, + init: Option, ) -> Fallible> { // 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::>(); + }, + Some(USVStringSequenceSequenceOrUSVStringUSVStringRecordOrUSVString::USVStringUSVStringRecord(init)) => { + // Step 3. + *query.list.borrow_mut() = + (*init).iter().map(|(name, value)| (name.to_string(), value.to_string())).collect::>(); + }, + 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) } diff --git a/components/script/dom/webidls/URLSearchParams.webidl b/components/script/dom/webidls/URLSearchParams.webidl index 341e6fb2fba1..8e72b207c0c8 100644 --- a/components/script/dom/webidls/URLSearchParams.webidl +++ b/components/script/dom/webidls/URLSearchParams.webidl @@ -6,7 +6,9 @@ * https://url.spec.whatwg.org/#interface-urlsearchparams */ -[Constructor(optional (USVString or URLSearchParams) init/* = ""*/), Exposed=(Window,Worker)] +[Constructor( + optional (sequence> or record or USVString) init/* = ""*/ +), Exposed=(Window,Worker)] interface URLSearchParams { void append(USVString name, USVString value); void delete(USVString name); diff --git a/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini b/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini index f62df6a05769..09df91b6479e 100644 --- a/tests/wpt/metadata/url/urlsearchparams-constructor.any.js.ini +++ b/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 - diff --git a/tests/wpt/metadata/xhr/send-entity-body-basic.htm.ini b/tests/wpt/metadata/xhr/send-entity-body-basic.htm.ini deleted file mode 100644 index 17882081cb3c..000000000000 --- a/tests/wpt/metadata/xhr/send-entity-body-basic.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[send-entity-body-basic.htm] - type: testharness - [XMLHttpRequest: send() - data argument (1=2&3=4)] - expected: FAIL -