From 0f1eb13e3303e19841650a5c0c8e49a8f64abda5 Mon Sep 17 00:00:00 2001 From: bd339 Date: Thu, 5 Jan 2017 01:00:03 +0100 Subject: [PATCH] Don't lose information in Fetch API Also update test expectations. --- components/net_traits/lib.rs | 4 +- components/net_traits/response.rs | 31 ++++++--- components/script/dom/xmlhttprequest.rs | 4 +- components/script/fetch.rs | 19 ++++-- tests/unit/net/data_loader.rs | 2 +- .../api/basic/accept-header-worker.html.ini | 6 -- .../fetch/api/basic/accept-header.html.ini | 6 -- .../api/basic/mode-no-cors-worker.html.ini | 6 -- .../fetch/api/basic/mode-no-cors.html.ini | 6 -- .../basic/mode-same-origin-worker.html.ini | 12 ---- .../fetch/api/basic/mode-same-origin.html.ini | 12 ---- .../request-forbidden-headers-worker.html.ini | 63 ------------------- .../basic/request-forbidden-headers.html.ini | 63 ------------------- .../api/basic/request-headers-worker.html.ini | 9 --- .../fetch/api/basic/request-headers.html.ini | 9 --- .../api/basic/scheme-blob-worker.html.ini | 6 -- .../fetch/api/basic/scheme-blob.html.ini | 6 -- .../api/basic/scheme-data-worker.html.ini | 6 -- .../fetch/api/basic/scheme-data.html.ini | 6 -- .../api/credentials/cookies-worker.html.ini | 9 --- .../fetch/api/credentials/cookies.html.ini | 9 --- .../referrer-no-referrer-worker.html.ini | 5 -- .../policies/referrer-no-referrer.html.ini | 5 -- 23 files changed, 45 insertions(+), 259 deletions(-) delete mode 100644 tests/wpt/metadata/fetch/api/basic/scheme-blob-worker.html.ini delete mode 100644 tests/wpt/metadata/fetch/api/basic/scheme-blob.html.ini delete mode 100644 tests/wpt/metadata/fetch/api/policies/referrer-no-referrer-worker.html.ini delete mode 100644 tests/wpt/metadata/fetch/api/policies/referrer-no-referrer.html.ini diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 8289e360e32..9bc0cca7fee 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -173,8 +173,10 @@ pub trait FetchTaskTarget { #[derive(Serialize, Deserialize)] pub enum FilteredMetadata { + Basic(Metadata), + Cors(Metadata), Opaque, - Transparent(Metadata), + OpaqueRedirect } #[derive(Serialize, Deserialize)] diff --git a/components/net_traits/response.rs b/components/net_traits/response.rs index 1eff533680a..57abad46a01 100644 --- a/components/net_traits/response.rs +++ b/components/net_traits/response.rs @@ -270,17 +270,32 @@ impl Response { Some(ref url) => { let unsafe_metadata = init_metadata(response, url); - Ok(FetchMetadata::Filtered { - filtered: match metadata { - Some(m) => FilteredMetadata::Transparent(m), - None => FilteredMetadata::Opaque, - }, - unsafe_: unsafe_metadata, - }) + match self.response_type { + ResponseType::Basic => Ok(FetchMetadata::Filtered { + filtered: FilteredMetadata::Basic(metadata.unwrap()), + unsafe_: unsafe_metadata + }), + ResponseType::Cors => Ok(FetchMetadata::Filtered { + filtered: FilteredMetadata::Cors(metadata.unwrap()), + unsafe_: unsafe_metadata + }), + ResponseType::Default => unreachable!(), + ResponseType::Error(ref network_err) => + Err(network_err.clone()), + ResponseType::Opaque => Ok(FetchMetadata::Filtered { + filtered: FilteredMetadata::Opaque, + unsafe_: unsafe_metadata + }), + ResponseType::OpaqueRedirect => Ok(FetchMetadata::Filtered { + filtered: FilteredMetadata::OpaqueRedirect, + unsafe_: unsafe_metadata + }) + } }, - None => Err(NetworkError::Internal("No url found in unsafe response".to_owned())), + None => Err(NetworkError::Internal("No url found in unsafe response".to_owned())) } } else { + assert_eq!(self.response_type, ResponseType::Default); Ok(FetchMetadata::Unfiltered(metadata.unwrap())) } } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 218efbbf1ab..6d61b9f088d 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -835,8 +835,10 @@ impl XMLHttpRequest { Ok(meta) => match meta { FetchMetadata::Unfiltered(m) => m, FetchMetadata::Filtered { filtered, .. } => match filtered { + FilteredMetadata::Basic(m) => m, + FilteredMetadata::Cors(m) => m, FilteredMetadata::Opaque => return Err(Error::Network), - FilteredMetadata::Transparent(m) => m + FilteredMetadata::OpaqueRedirect => return Err(Error::Network) } }, Err(_) => { diff --git a/components/script/fetch.rs b/components/script/fetch.rs index 3345c7b7e34..f1fd49147b7 100644 --- a/components/script/fetch.rs +++ b/components/script/fetch.rs @@ -135,18 +135,29 @@ impl FetchResponseListener for FetchContext { promise.global().get_cx(), Error::Type("Network error occurred".to_string())); self.fetch_promise = Some(TrustedPromise::new(promise)); + self.response_object.root().set_type(DOMResponseType::Error); return; }, // Step 4.2 Ok(metadata) => { match metadata { - FetchMetadata::Unfiltered(m) => - fill_headers_with_metadata(self.response_object.root(), m), + FetchMetadata::Unfiltered(m) => { + fill_headers_with_metadata(self.response_object.root(), m); + self.response_object.root().set_type(DOMResponseType::Default); + }, FetchMetadata::Filtered { filtered, .. } => match filtered { - FilteredMetadata::Transparent(m) => - fill_headers_with_metadata(self.response_object.root(), m), + FilteredMetadata::Basic(m) => { + fill_headers_with_metadata(self.response_object.root(), m); + self.response_object.root().set_type(DOMResponseType::Basic); + }, + FilteredMetadata::Cors(m) => { + fill_headers_with_metadata(self.response_object.root(), m); + self.response_object.root().set_type(DOMResponseType::Cors); + }, FilteredMetadata::Opaque => self.response_object.root().set_type(DOMResponseType::Opaque), + FilteredMetadata::OpaqueRedirect => + self.response_object.root().set_type(DOMResponseType::Opaqueredirect) } } } diff --git a/tests/unit/net/data_loader.rs b/tests/unit/net/data_loader.rs index 8cd9ddbb953..0cf0726c296 100644 --- a/tests/unit/net/data_loader.rs +++ b/tests/unit/net/data_loader.rs @@ -32,7 +32,7 @@ fn assert_parse(url: &'static str, assert_eq!(header_content_type, content_type.as_ref()); let metadata = match response.metadata() { - Ok(FetchMetadata::Filtered { filtered: FilteredMetadata::Transparent(m), .. }) => m, + Ok(FetchMetadata::Filtered { filtered: FilteredMetadata::Basic(m), .. }) => m, result => panic!(result), }; assert_eq!(metadata.content_type.map(Serde::into_inner), content_type); diff --git a/tests/wpt/metadata/fetch/api/basic/accept-header-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/accept-header-worker.html.ini index 1ad17d9532f..34d042b055d 100644 --- a/tests/wpt/metadata/fetch/api/basic/accept-header-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/accept-header-worker.html.ini @@ -1,14 +1,8 @@ [accept-header-worker.html] type: testharness - [Request through fetch should have 'accept' header with value '*/*'] - expected: FAIL - [Request through fetch should have 'accept' header with value 'custom/*'] expected: FAIL - [Request through fetch should have a 'accept-language' header] - expected: FAIL - [Request through fetch should have 'accept-language' header with value 'bzh'] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/accept-header.html.ini b/tests/wpt/metadata/fetch/api/basic/accept-header.html.ini index 991127f2257..6d16237d58b 100644 --- a/tests/wpt/metadata/fetch/api/basic/accept-header.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/accept-header.html.ini @@ -1,14 +1,8 @@ [accept-header.html] type: testharness - [Request through fetch should have 'accept' header with value '*/*'] - expected: FAIL - [Request through fetch should have 'accept' header with value 'custom/*'] expected: FAIL - [Request through fetch should have a 'accept-language' header] - expected: FAIL - [Request through fetch should have 'accept-language' header with value 'bzh'] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/mode-no-cors-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/mode-no-cors-worker.html.ini index 3a7912afdb2..c4bbb4a0c0c 100644 --- a/tests/wpt/metadata/fetch/api/basic/mode-no-cors-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/mode-no-cors-worker.html.ini @@ -1,11 +1,5 @@ [mode-no-cors-worker.html] type: testharness - [Fetch ../resources/top.txt with no-cors mode] - expected: FAIL - - [Fetch http://web-platform.test:8000/fetch/api/resources/top.txt with no-cors mode] - expected: FAIL - [Fetch https://web-platform.test:8443/fetch/api/resources/top.txt with no-cors mode] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/mode-no-cors.html.ini b/tests/wpt/metadata/fetch/api/basic/mode-no-cors.html.ini index 474196fd903..83125d3da86 100644 --- a/tests/wpt/metadata/fetch/api/basic/mode-no-cors.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/mode-no-cors.html.ini @@ -1,11 +1,5 @@ [mode-no-cors.html] type: testharness - [Fetch ../resources/top.txt with no-cors mode] - expected: FAIL - - [Fetch http://web-platform.test:8000/fetch/api/resources/top.txt with no-cors mode] - expected: FAIL - [Fetch https://web-platform.test:8443/fetch/api/resources/top.txt with no-cors mode] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/mode-same-origin-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/mode-same-origin-worker.html.ini index 3e556156baf..c5ccd4a16f4 100644 --- a/tests/wpt/metadata/fetch/api/basic/mode-same-origin-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/mode-same-origin-worker.html.ini @@ -1,17 +1,5 @@ [mode-same-origin-worker.html] type: testharness - [Fetch ../resources/top.txt with same-origin mode] - expected: FAIL - - [Fetch http://web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] - expected: FAIL - [Fetch http://www1.web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] expected: FAIL - [Fetch /fetch/api/basic/../resources/redirect.py?location=../resources/top.txt with same-origin mode] - expected: FAIL - - [Fetch /fetch/api/basic/../resources/redirect.py?location=http://web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/mode-same-origin.html.ini b/tests/wpt/metadata/fetch/api/basic/mode-same-origin.html.ini index 67aa845fb6a..ed70030d4dc 100644 --- a/tests/wpt/metadata/fetch/api/basic/mode-same-origin.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/mode-same-origin.html.ini @@ -1,17 +1,5 @@ [mode-same-origin.html] type: testharness - [Fetch ../resources/top.txt with same-origin mode] - expected: FAIL - - [Fetch http://web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] - expected: FAIL - [Fetch http://www1.web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] expected: FAIL - [Fetch /fetch/api/basic/../resources/redirect.py?location=../resources/top.txt with same-origin mode] - expected: FAIL - - [Fetch /fetch/api/basic/../resources/redirect.py?location=http://web-platform.test:8000/fetch/api/resources/top.txt with same-origin mode] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers-worker.html.ini index e0e4e7b9809..bc1a8d7f79d 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers-worker.html.ini @@ -1,8 +1,5 @@ [request-forbidden-headers-worker.html] type: testharness - [Accept-Charset is a forbidden request header] - expected: FAIL - [Accept-Encoding is a forbidden request header] expected: FAIL @@ -12,63 +9,3 @@ [Access-Control-Request-Method is a forbidden request header] expected: FAIL - [Connection is a forbidden request header] - expected: FAIL - - [Content-Length is a forbidden request header] - expected: FAIL - - [Cookie is a forbidden request header] - expected: FAIL - - [Cookie2 is a forbidden request header] - expected: FAIL - - [Date is a forbidden request header] - expected: FAIL - - [DNT is a forbidden request header] - expected: FAIL - - [Expect is a forbidden request header] - expected: FAIL - - [Host is a forbidden request header] - expected: FAIL - - [Keep-Alive is a forbidden request header] - expected: FAIL - - [Origin is a forbidden request header] - expected: FAIL - - [Referer is a forbidden request header] - expected: FAIL - - [TE is a forbidden request header] - expected: FAIL - - [Trailer is a forbidden request header] - expected: FAIL - - [Transfer-Encoding is a forbidden request header] - expected: FAIL - - [Upgrade is a forbidden request header] - expected: FAIL - - [Via is a forbidden request header] - expected: FAIL - - [Proxy- is a forbidden request header] - expected: FAIL - - [Proxy-Test is a forbidden request header] - expected: FAIL - - [Sec- is a forbidden request header] - expected: FAIL - - [Sec-Test is a forbidden request header] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.html.ini b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.html.ini index cc92ad7bc59..08e83b69683 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-forbidden-headers.html.ini @@ -1,8 +1,5 @@ [request-forbidden-headers.html] type: testharness - [Accept-Charset is a forbidden request header] - expected: FAIL - [Accept-Encoding is a forbidden request header] expected: FAIL @@ -12,63 +9,3 @@ [Access-Control-Request-Method is a forbidden request header] expected: FAIL - [Connection is a forbidden request header] - expected: FAIL - - [Content-Length is a forbidden request header] - expected: FAIL - - [Cookie is a forbidden request header] - expected: FAIL - - [Cookie2 is a forbidden request header] - expected: FAIL - - [Date is a forbidden request header] - expected: FAIL - - [DNT is a forbidden request header] - expected: FAIL - - [Expect is a forbidden request header] - expected: FAIL - - [Host is a forbidden request header] - expected: FAIL - - [Keep-Alive is a forbidden request header] - expected: FAIL - - [Origin is a forbidden request header] - expected: FAIL - - [Referer is a forbidden request header] - expected: FAIL - - [TE is a forbidden request header] - expected: FAIL - - [Trailer is a forbidden request header] - expected: FAIL - - [Transfer-Encoding is a forbidden request header] - expected: FAIL - - [Upgrade is a forbidden request header] - expected: FAIL - - [Via is a forbidden request header] - expected: FAIL - - [Proxy- is a forbidden request header] - expected: FAIL - - [Proxy-Test is a forbidden request header] - expected: FAIL - - [Sec- is a forbidden request header] - expected: FAIL - - [Sec-Test is a forbidden request header] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini index 81cb01e0939..53f301856ff 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-headers-worker.html.ini @@ -1,11 +1,5 @@ [request-headers-worker.html] type: testharness - [Fetch with GET] - expected: FAIL - - [Fetch with HEAD] - expected: FAIL - [Fetch with PUT without body] expected: FAIL @@ -54,9 +48,6 @@ [Fetch with POST with URLSearchParams body] expected: FAIL - [Fetch with GET and mode "cors" does not need an Origin header] - expected: FAIL - [Fetch with POST and mode "same-origin" needs an Origin header] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini index decac375344..7aa360a8750 100644 --- a/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/request-headers.html.ini @@ -1,11 +1,5 @@ [request-headers.html] type: testharness - [Fetch with GET] - expected: FAIL - - [Fetch with HEAD] - expected: FAIL - [Fetch with PUT without body] expected: FAIL @@ -54,9 +48,6 @@ [Fetch with POST with URLSearchParams body] expected: FAIL - [Fetch with GET and mode "cors" does not need an Origin header] - expected: FAIL - [Fetch with POST and mode "same-origin" needs an Origin header] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-blob-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-blob-worker.html.ini deleted file mode 100644 index 7c2d1d343b3..00000000000 --- a/tests/wpt/metadata/fetch/api/basic/scheme-blob-worker.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[scheme-blob-worker.html] - type: testharness - [Fetching [GET\] URL.createObjectURL(blob) is OK] - bug: https://github.com/servo/servo/issues/13766 - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-blob.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-blob.html.ini deleted file mode 100644 index 599e25f7f0b..00000000000 --- a/tests/wpt/metadata/fetch/api/basic/scheme-blob.html.ini +++ /dev/null @@ -1,6 +0,0 @@ -[scheme-blob.html] - type: testharness - [Fetching [GET\] URL.createObjectURL(blob) is OK] - bug: https://github.com/servo/servo/issues/13766 - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini index d025cd9bfee..2df1a5e9f05 100644 --- a/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/scheme-data-worker.html.ini @@ -9,12 +9,6 @@ [Fetching data:,response%27s%20body is OK (cors)] expected: FAIL - [Fetching data:text/plain;base64,cmVzcG9uc2UncyBib[...\] is OK] - expected: FAIL - - [Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...\] is OK] - expected: FAIL - [Fetching [POST\] data:,response%27s%20body is OK] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini b/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini index f69b8bea324..27077ba3010 100644 --- a/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini +++ b/tests/wpt/metadata/fetch/api/basic/scheme-data.html.ini @@ -9,12 +9,6 @@ [Fetching data:,response%27s%20body is OK (cors)] expected: FAIL - [Fetching data:text/plain;base64,cmVzcG9uc2UncyBib[...\] is OK] - expected: FAIL - - [Fetching data:image/png;base64,cmVzcG9uc2UncyBib2[...\] is OK] - expected: FAIL - [Fetching [POST\] data:,response%27s%20body is OK] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/credentials/cookies-worker.html.ini b/tests/wpt/metadata/fetch/api/credentials/cookies-worker.html.ini index 403cede84de..efd7f5246e7 100644 --- a/tests/wpt/metadata/fetch/api/credentials/cookies-worker.html.ini +++ b/tests/wpt/metadata/fetch/api/credentials/cookies-worker.html.ini @@ -1,20 +1,11 @@ [cookies-worker.html] type: testharness - [Include mode: 1 cookie] - expected: FAIL - [Include mode: 2 cookies] expected: FAIL - [Omit mode: discard cookies] - expected: FAIL - [Omit mode: no cookie is stored] expected: FAIL - [Omit mode: no cookie is sent] - expected: FAIL - [Same-origin mode: 1 cookie] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/credentials/cookies.html.ini b/tests/wpt/metadata/fetch/api/credentials/cookies.html.ini index 1c64dc9fb35..1a397ac898a 100644 --- a/tests/wpt/metadata/fetch/api/credentials/cookies.html.ini +++ b/tests/wpt/metadata/fetch/api/credentials/cookies.html.ini @@ -1,20 +1,11 @@ [cookies.html] type: testharness - [Include mode: 1 cookie] - expected: FAIL - [Include mode: 2 cookies] expected: FAIL - [Omit mode: discard cookies] - expected: FAIL - [Omit mode: no cookie is stored] expected: FAIL - [Omit mode: no cookie is sent] - expected: FAIL - [Same-origin mode: 1 cookie] expected: FAIL diff --git a/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer-worker.html.ini b/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer-worker.html.ini deleted file mode 100644 index 12672391661..00000000000 --- a/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer-worker.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[referrer-no-referrer-worker.html] - type: testharness - [Request's referrer is empty] - expected: FAIL - diff --git a/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer.html.ini b/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer.html.ini deleted file mode 100644 index 8461d3e1fdb..00000000000 --- a/tests/wpt/metadata/fetch/api/policies/referrer-no-referrer.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[referrer-no-referrer.html] - type: testharness - [Request's referrer is empty] - expected: FAIL -