diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-08-24 15:35:09 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-08-24 15:35:09 -0500 |
commit | 5b46a591946e4fc72461481ab361970f49d5af6b (patch) | |
tree | a605bc1821bee76a4eeb9e40941d6d02018545de | |
parent | 1370fa5e3b38f3000c0b1439177cc7b7b81d380e (diff) | |
parent | e3624edbf6329d63ed2f3716250ab4e8fc254f63 (diff) | |
download | servo-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 -->
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 - |