aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-08-24 15:35:09 -0500
committerGitHub <noreply@github.com>2016-08-24 15:35:09 -0500
commit5b46a591946e4fc72461481ab361970f49d5af6b (patch)
treea605bc1821bee76a4eeb9e40941d6d02018545de
parent1370fa5e3b38f3000c0b1439177cc7b7b81d380e (diff)
parente3624edbf6329d63ed2f3716250ab4e8fc254f63 (diff)
downloadservo-5b46a591946e4fc72461481ab361970f49d5af6b.tar.gz
servo-5b46a591946e4fc72461481ab361970f49d5af6b.zip
Auto merge of #12998 - jeenalee:iterable-headers, r=jdm
Implement iterable for headers <!-- Please describe your changes on the following line: --> These patches make Headers iterable based on #12819. The expected wpt results are updated as well. --- <!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `__` with appropriate data: --> - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). <!-- Either: --> - [x] There are tests for these changes OR - [ ] These changes do not require tests because web platform tests for Headers already exist. Expected test results are updated with this PR. <!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. --> <!-- 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/12998) <!-- Reviewable:end -->
-rw-r--r--components/script/dom/headers.rs39
-rw-r--r--components/script/dom/webidls/Headers.webidl2
-rw-r--r--tests/wpt/metadata/fetch/api/headers/headers-errors.html.ini5
-rw-r--r--tests/wpt/metadata/fetch/api/headers/headers-structure.html.ini11
4 files changed, 39 insertions, 18 deletions
diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs
index 6fa4e0249c8..7b45956c039 100644
--- a/components/script/dom/headers.rs
+++ b/components/script/dom/headers.rs
@@ -5,9 +5,11 @@
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::HeadersBinding;
use dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods;
+use dom::bindings::codegen::Bindings::HeadersBinding::HeadersWrap;
use dom::bindings::codegen::UnionTypes::HeadersOrByteStringSequenceSequence;
use dom::bindings::error::{Error, ErrorResult, 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::{ByteString, is_token};
@@ -45,7 +47,7 @@ impl Headers {
}
pub fn new(global: GlobalRef) -> Root<Headers> {
- reflect_dom_object(box Headers::new_inherited(), global, HeadersBinding::Wrap)
+ reflect_dom_object(box Headers::new_inherited(), global, HeadersWrap)
}
// https://fetch.spec.whatwg.org/#dom-headers
@@ -223,6 +225,41 @@ impl Headers {
pub fn extract_mime_type(&self) -> Vec<u8> {
self.header_list.borrow().get_raw("content-type").map_or(vec![], |v| v[0].clone())
}
+
+ pub fn sort_header_list(&self) -> Vec<(String, String)> {
+ let borrowed_header_list = self.header_list.borrow();
+ let headers_iter = borrowed_header_list.iter();
+ let mut header_vec = vec![];
+ for header in headers_iter {
+ let name = header.name().to_string();
+ let value = header.value_string();
+ let name_value = (name, value);
+ header_vec.push(name_value);
+ }
+ header_vec.sort();
+ header_vec
+ }
+}
+
+impl Iterable for Headers {
+ type Key = ByteString;
+ type Value = ByteString;
+
+ fn get_iterable_length(&self) -> u32 {
+ self.header_list.borrow().iter().count() as u32
+ }
+
+ fn get_value_at_index(&self, n: u32) -> ByteString {
+ let sorted_header_vec = self.sort_header_list();
+ let value = sorted_header_vec[n as usize].1.clone();
+ ByteString::new(value.into_bytes().to_vec())
+ }
+
+ fn get_key_at_index(&self, n: u32) -> ByteString {
+ let sorted_header_vec = self.sort_header_list();
+ let key = sorted_header_vec[n as usize].0.clone();
+ ByteString::new(key.into_bytes().to_vec())
+ }
}
fn is_cors_safelisted_request_content_type(value: &[u8]) -> bool {
diff --git a/components/script/dom/webidls/Headers.webidl b/components/script/dom/webidls/Headers.webidl
index 6696bf64731..ee3d4b2fe94 100644
--- a/components/script/dom/webidls/Headers.webidl
+++ b/components/script/dom/webidls/Headers.webidl
@@ -20,5 +20,5 @@ interface Headers {
boolean has(ByteString name);
[Throws]
void set(ByteString name, ByteString value);
- // iterable<ByteString, ByteString>; // TODO see issue #12628
+ iterable<ByteString, ByteString>;
};
diff --git a/tests/wpt/metadata/fetch/api/headers/headers-errors.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-errors.html.ini
deleted file mode 100644
index 3941ca87bcf..00000000000
--- a/tests/wpt/metadata/fetch/api/headers/headers-errors.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[headers-errors.html]
- type: testharness
- [Headers forEach loop should stop if callback is throwing exception]
- expected: FAIL
-
diff --git a/tests/wpt/metadata/fetch/api/headers/headers-structure.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-structure.html.ini
deleted file mode 100644
index e2cbf6a708e..00000000000
--- a/tests/wpt/metadata/fetch/api/headers/headers-structure.html.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[headers-structure.html]
- type: testharness
- [Headers has entries method]
- expected: FAIL
-
- [Headers has keys method]
- expected: FAIL
-
- [Headers has values method]
- expected: FAIL
-