Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make URLSearchParams iterable #13022 #13077

Closed
wants to merge 8 commits into from

Make URLSearchParams iterable #13022

  • Loading branch information
yoyo930021 committed Aug 27, 2016
commit 564cedc49a27dc81361a4712923a9b53417871c5
@@ -5,9 +5,11 @@
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::URLSearchParamsBinding;
use dom::bindings::codegen::Bindings::URLSearchParamsBinding::URLSearchParamsMethods;
use dom::bindings::codegen::Bindings::URLSearchParamsBinding::URLSearchParamsWrap;
use dom::bindings::codegen::UnionTypes::USVStringOrURLSearchParams;
use dom::bindings::error::Fallible;
use dom::bindings::global::GlobalRef;
use dom::bindings::iterable::Iterable;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::str::{DOMString, USVString};
@@ -37,7 +39,7 @@ impl URLSearchParams {

pub fn new(global: GlobalRef, url: Option<&URL>) -> Root<URLSearchParams> {
reflect_dom_object(box URLSearchParams::new_inherited(url), global,
URLSearchParamsBinding::Wrap)
URLSearchParamsWrap)
}

// https://url.spec.whatwg.org/#dom-urlsearchparams-urlsearchparams
@@ -163,3 +165,40 @@ impl URLSearchParams {
}
}
}

impl URLSearchParams {
pub fn sort_list(&self) -> Vec<(String, String)> {
let borrowed_list = self.list.borrow();
let URLSearchParams_iter = borrowed_list.iter();
let mut URLSearchParam_vec = vec![];
for URLSearchParam in URLSearchParams_iter {
let name = URLSearchParam.0.to_string();
let value = URLSearchParam.1.to_string();
let name_value = (name, value);
URLSearchParam_vec.push(name_value);
}
URLSearchParam_vec.sort();
URLSearchParam_vec
}
}

impl Iterable for URLSearchParams {
type Key = USVString;
type Value = USVString;

fn get_iterable_length(&self) -> u32 {
self.list.borrow().iter().count() as u32

This comment has been minimized.

@KiChjang

KiChjang Aug 27, 2016

Member

Doesn't self.list.borrow().len() work?

This comment has been minimized.

@emilio

emilio Aug 27, 2016

Member

Yes, it should, r=me with that. A test with something like what is described in #10351 would be great too :)

let a=new URL("http://a.b/c?a=1&b=2&c=3&d=4");
let b = a.searchParams;
for (i of b) {
    a.search="x=1&y=2&z=3";
    console.log(i);
}
// outputs
Array [ "a", "1" ]
Array [ "y", "2" ]
Array [ "z", "3" ]

This comment has been minimized.

@yoyo930021

yoyo930021 Aug 27, 2016

Author Contributor

@KiChjang
It work!
Thank you.

This comment has been minimized.

@yoyo930021

yoyo930021 Aug 27, 2016

Author Contributor

@emilio
Add test!
finish!

}

fn get_value_at_index(&self, n: u32) -> USVString {
let sorted_URLSearchParam_vec = self.sort_list();
let value = sorted_URLSearchParam_vec[n as usize].1.clone();
USVString(value)
}

fn get_key_at_index(&self, n: u32) -> USVString {
let sorted_URLSearchParam_vec = self.sort_list();
let key = sorted_URLSearchParam_vec[n as usize].0.clone();
USVString(key)
}
}
@@ -16,7 +16,6 @@ interface URLSearchParams {
void set(USVString name, USVString value);
// Be careful with implementing iterable interface.
// Search params might be mutated by URL::SetSearch while iterating (discussed in PR #10351).
// iterable<USVString, USVString>;
iterable<USVString, USVString>;
stringifier;
};

ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.