Skip to content

Commit

Permalink
Implement iterable for Headers.
Browse files Browse the repository at this point in the history
This commit implements iterable in DOM Headers based on iterable
implementation from #12819. Expected wpt results are updated as well.
  • Loading branch information
jeenalee committed Aug 24, 2016
1 parent 1370fa5 commit e3624ed
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 18 deletions.
39 changes: 38 additions & 1 deletion components/script/dom/headers.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion components/script/dom/webidls/Headers.webidl
Expand Up @@ -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>;
};
5 changes: 0 additions & 5 deletions tests/wpt/metadata/fetch/api/headers/headers-errors.html.ini

This file was deleted.

11 changes: 0 additions & 11 deletions tests/wpt/metadata/fetch/api/headers/headers-structure.html.ini

This file was deleted.

0 comments on commit e3624ed

Please sign in to comment.