diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index ff4fb39aec8..b9198d8d4f2 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -198,20 +198,19 @@ impl HeadersMethods for Headers { } impl Headers { + pub fn copy_from_headers(&self, headers: DomRoot) -> ErrorResult { + for (name, value) in headers.header_list.borrow().iter() { + self.Append( + ByteString::new(Vec::from(name.as_str())), + ByteString::new(Vec::from(value.as_bytes())), + )?; + } + Ok(()) + } + // https://fetch.spec.whatwg.org/#concept-headers-fill pub fn fill(&self, filler: Option) -> ErrorResult { match filler { - // Step 1 - Some(HeadersInit::Headers(h)) => { - for (name, value) in h.header_list.borrow().iter() { - self.Append( - ByteString::new(Vec::from(name.as_str())), - ByteString::new(Vec::from(value.as_bytes())), - )?; - } - Ok(()) - }, - // Step 2 Some(HeadersInit::ByteStringSequenceSequence(v)) => { for mut seq in v { if seq.len() == 2 { diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index 7ae8c07663a..387b7174791 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -311,27 +311,17 @@ impl Request { r.headers.or_init(|| Headers::for_request(&r.global())); // Step 32 - but spec says this should only be when non-empty init? - // Step 32.1 - let mut headers_copy = r.Headers(); - - // Step 32.2 - if let Some(possible_header) = init.headers.as_ref() { - match possible_header { - &HeadersInit::Headers(ref init_headers) => { - headers_copy = DomRoot::from_ref(&*init_headers); + let headers_copy = init + .headers + .as_ref() + .map(|possible_header| match possible_header { + HeadersInit::ByteStringSequenceSequence(init_sequence) => { + HeadersInit::ByteStringSequenceSequence(init_sequence.clone()) }, - &HeadersInit::ByteStringSequenceSequence(ref init_sequence) => { - headers_copy.fill(Some(HeadersInit::ByteStringSequenceSequence( - init_sequence.clone(), - )))?; + HeadersInit::ByteStringByteStringRecord(init_map) => { + HeadersInit::ByteStringByteStringRecord(init_map.clone()) }, - &HeadersInit::ByteStringByteStringRecord(ref init_map) => { - headers_copy.fill(Some(HeadersInit::ByteStringByteStringRecord( - init_map.clone(), - )))?; - }, - } - } + }); // Step 32.3 // We cannot empty `r.Headers().header_list` because @@ -357,21 +347,17 @@ impl Request { } // Step 32.5 - match init.headers { + match headers_copy { None => { // This is equivalent to the specification's concept of // "associated headers list". If an init headers is not given, // but an input with headers is given, set request's // headers as the input's Headers. if let RequestInfo::Request(ref input_request) = input { - r.Headers() - .fill(Some(HeadersInit::Headers(input_request.Headers())))?; + r.Headers().copy_from_headers(input_request.Headers())?; } }, - Some(HeadersInit::Headers(_)) => { - r.Headers().fill(Some(HeadersInit::Headers(headers_copy)))? - }, - _ => {}, + Some(headers_copy) => r.Headers().fill(Some(headers_copy))?, } // Step 32.5-6 depending on how we got here @@ -493,9 +479,7 @@ impl Request { *r_clone.request.borrow_mut() = req.clone(); r_clone.body_used.set(body_used); *r_clone.mime_type.borrow_mut() = mime_type; - r_clone - .Headers() - .fill(Some(HeadersInit::Headers(r.Headers())))?; + r_clone.Headers().copy_from_headers(r.Headers())?; r_clone.Headers().set_guard(headers_guard); Ok(r_clone) } @@ -895,7 +879,6 @@ impl Into for NetTraitsRequestRedirect { impl Clone for HeadersInit { fn clone(&self) -> HeadersInit { match self { - &HeadersInit::Headers(ref h) => HeadersInit::Headers(h.clone()), &HeadersInit::ByteStringSequenceSequence(ref b) => { HeadersInit::ByteStringSequenceSequence(b.clone()) }, diff --git a/components/script/dom/response.rs b/components/script/dom/response.rs index 63c08b3eac8..ed55d9962a9 100644 --- a/components/script/dom/response.rs +++ b/components/script/dom/response.rs @@ -4,7 +4,7 @@ use crate::body::{consume_body, consume_body_with_promise, BodyOperations, BodyType}; use crate::dom::bindings::cell::{DomRefCell, Ref}; -use crate::dom::bindings::codegen::Bindings::HeadersBinding::{HeadersInit, HeadersMethods}; +use crate::dom::bindings::codegen::Bindings::HeadersBinding::HeadersMethods; use crate::dom::bindings::codegen::Bindings::ResponseBinding; use crate::dom::bindings::codegen::Bindings::ResponseBinding::{ ResponseMethods, ResponseType as DOMResponseType, @@ -335,9 +335,7 @@ impl ResponseMethods for Response { // Step 2 let new_response = Response::new(&self.global()); new_response.Headers().set_guard(self.Headers().get_guard()); - new_response - .Headers() - .fill(Some(HeadersInit::Headers(self.Headers())))?; + new_response.Headers().copy_from_headers(self.Headers())?; // https://fetch.spec.whatwg.org/#concept-response-clone // Instead of storing a net_traits::Response internally, we diff --git a/components/script/dom/webidls/Headers.webidl b/components/script/dom/webidls/Headers.webidl index cc85136eb41..dac3d860154 100644 --- a/components/script/dom/webidls/Headers.webidl +++ b/components/script/dom/webidls/Headers.webidl @@ -4,7 +4,7 @@ // https://fetch.spec.whatwg.org/#headers-class -typedef (Headers or sequence> or record) HeadersInit; +typedef (sequence> or record) HeadersInit; [Exposed=(Window,Worker)] interface Headers { diff --git a/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini b/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini deleted file mode 100644 index 0321618e55a..00000000000 --- a/tests/wpt/metadata/fetch/api/headers/headers-basic.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[headers-basic.html] - type: testharness - [Create headers with existing headers with custom iterator] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/range/general.any.js.ini b/tests/wpt/metadata/fetch/range/general.any.js.ini index 050922261f0..3c190d343ec 100644 --- a/tests/wpt/metadata/fetch/range/general.any.js.ini +++ b/tests/wpt/metadata/fetch/range/general.any.js.ini @@ -5,11 +5,10 @@ [general] expected: FAIL - [Privileged header not allowed for guard type: request-no-cors] - expected: FAIL [Fetch with range header will be sent with Accept-Encoding: identity] expected: FAIL + [general.any.html] [Untitled] expected: FAIL @@ -17,7 +16,6 @@ [general] expected: FAIL - [Privileged header not allowed for guard type: request-no-cors] - expected: FAIL [Fetch with range header will be sent with Accept-Encoding: identity] expected: FAIL +