aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-10-07 11:10:01 -0500
committerGitHub <noreply@github.com>2016-10-07 11:10:01 -0500
commitb1c5b9182003cf56b0953a6a1aa01f47b49d3f14 (patch)
treea278cb4409e4c82e2f73e9e95dd36cc262a9c513
parent86f31d0dc7d94f5c836380e22f2cdf0411dcb2a1 (diff)
parent980c644a8387fd257b06dcebf152fbd4c3386aef (diff)
downloadservo-b1c5b9182003cf56b0953a6a1aa01f47b49d3f14.tar.gz
servo-b1c5b9182003cf56b0953a6a1aa01f47b49d3f14.zip
Auto merge of #13637 - servo:URLSearchParams, r=emilio
Make URLSearchParams iterable. Fixes #13022. Fixes #13077. <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/13637) <!-- Reviewable:end -->
-rw-r--r--components/script/dom/urlsearchparams.rs25
-rw-r--r--components/script/dom/webidls/URLSearchParams.webidl3
-rw-r--r--tests/wpt/metadata/MANIFEST.json4
-rw-r--r--tests/wpt/web-platform-tests/url/urlsearchparams-foreach.html39
4 files changed, 67 insertions, 4 deletions
diff --git a/components/script/dom/urlsearchparams.rs b/components/script/dom/urlsearchparams.rs
index 2718f278dc3..b6ecd069b8c 100644
--- a/components/script/dom/urlsearchparams.rs
+++ b/components/script/dom/urlsearchparams.rs
@@ -3,10 +3,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
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::iterable::Iterable;
use dom::bindings::js::Root;
use dom::bindings::reflector::{Reflector, reflect_dom_object};
use dom::bindings::str::{DOMString, USVString};
@@ -37,7 +38,7 @@ impl URLSearchParams {
pub fn new(global: &GlobalScope, 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 +164,23 @@ impl URLSearchParams {
}
}
}
+
+
+impl Iterable for URLSearchParams {
+ type Key = USVString;
+ type Value = USVString;
+
+ fn get_iterable_length(&self) -> u32 {
+ self.list.borrow().len() as u32
+ }
+
+ fn get_value_at_index(&self, n: u32) -> USVString {
+ let value = self.list.borrow()[n as usize].1.clone();
+ USVString(value)
+ }
+
+ fn get_key_at_index(&self, n: u32) -> USVString {
+ let key = self.list.borrow()[n as usize].0.clone();
+ USVString(key)
+ }
+}
diff --git a/components/script/dom/webidls/URLSearchParams.webidl b/components/script/dom/webidls/URLSearchParams.webidl
index dbd41fb9c5e..1012f1bded5 100644
--- a/components/script/dom/webidls/URLSearchParams.webidl
+++ b/components/script/dom/webidls/URLSearchParams.webidl
@@ -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;
};
-
diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json
index c0df50d48b0..e7fb5502ff0 100644
--- a/tests/wpt/metadata/MANIFEST.json
+++ b/tests/wpt/metadata/MANIFEST.json
@@ -30388,6 +30388,10 @@
"url": "/url/urlsearchparams-delete.html"
},
{
+ "path": "url/urlsearchparams-foreach.html",
+ "url": "/url/urlsearchparams-foreach.html"
+ },
+ {
"path": "url/urlsearchparams-get.html",
"url": "/url/urlsearchparams-get.html"
},
diff --git a/tests/wpt/web-platform-tests/url/urlsearchparams-foreach.html b/tests/wpt/web-platform-tests/url/urlsearchparams-foreach.html
new file mode 100644
index 00000000000..faa699cae1f
--- /dev/null
+++ b/tests/wpt/web-platform-tests/url/urlsearchparams-foreach.html
@@ -0,0 +1,39 @@
+<!doctype html>
+<meta charset="utf-8">
+<link rel="help" href="https://url.spec.whatwg.org/#dom-urlsearchparams-has">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+test(function() {
+ var params = new URLSearchParams('a=1&b=2&c=3');
+ var keys = [];
+ var values = [];
+ params.forEach(function(value, key) {
+ keys.push(key);
+ values.push(value);
+ });
+ assert_array_equals(keys, ['a', 'b', 'c']);
+ assert_array_equals(values, ['1', '2', '3']);
+}, "ForEach Check");
+
+test(function() {
+ let a = new URL("http://a.b/c?a=1&b=2&c=3&d=4");
+ let b = a.searchParams;
+ var c = [];
+ for (i of b) {
+ a.search = "x=1&y=2&z=3";
+ c.push(i);
+ }
+ assert_array_equals(c[0], ["a","1"]);
+ assert_array_equals(c[1], ["y","2"]);
+ assert_array_equals(c[2], ["z","3"]);
+}, "For-of Check");
+
+test(function() {
+ let a = new URL("http://a.b/c");
+ let b = a.searchParams;
+ for (i of b) {
+ assert_unreached(i);
+ }
+}, "empty");
+</script>