diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-10-07 11:10:01 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-10-07 11:10:01 -0500 |
commit | b1c5b9182003cf56b0953a6a1aa01f47b49d3f14 (patch) | |
tree | a278cb4409e4c82e2f73e9e95dd36cc262a9c513 | |
parent | 86f31d0dc7d94f5c836380e22f2cdf0411dcb2a1 (diff) | |
parent | 980c644a8387fd257b06dcebf152fbd4c3386aef (diff) | |
download | servo-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.rs | 25 | ||||
-rw-r--r-- | components/script/dom/webidls/URLSearchParams.webidl | 3 | ||||
-rw-r--r-- | tests/wpt/metadata/MANIFEST.json | 4 | ||||
-rw-r--r-- | tests/wpt/web-platform-tests/url/urlsearchparams-foreach.html | 39 |
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> |