diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index a741bec034c..f32576fcde5 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -336,9 +336,18 @@ impl Metadata { /// Extract the parts of a Mime that we care about. pub fn set_content_type(&mut self, content_type: Option<&Mime>) { + match self.headers { + None => self.headers = Some(Headers::new()), + Some(_) => (), + } + match content_type { None => (), Some(mime) => { + if let Some(headers) = self.headers.as_mut() { + headers.set(ContentType(mime.clone())); + } + self.content_type = Some(ContentType(mime.clone())); let &Mime(_, _, ref parameters) = mime; for &(ref k, ref v) in parameters { diff --git a/components/script/cors.rs b/components/script/cors.rs index 8be1ec9d6d2..b9794a3f1fa 100644 --- a/components/script/cors.rs +++ b/components/script/cors.rs @@ -64,15 +64,21 @@ impl CORSRequest { destination: Url, mode: RequestMode, method: Method, - headers: Headers) + headers: Headers, + same_origin_data_url_flag: bool) -> Result, ()> { if referer.scheme == destination.scheme && referer.host() == destination.host() && referer.port() == destination.port() { return Ok(None); // Not cross-origin, proceed with a normal fetch } match &*destination.scheme { - // TODO: If the request's same origin data url flag is set (which isn't the case for XHR) - // we can fetch a data URL normally. about:blank can also be fetched by XHR + // As per (https://fetch.spec.whatwg.org/#main-fetch 5.1.9), about URLs can be fetched + // the same as a basic request. + "about" if destination.path() == Some(&["blank".to_owned()]) => Ok(None), + // As per (https://fetch.spec.whatwg.org/#main-fetch 5.1.9), data URLs can be fetched + // the same as a basic request if the request's method is GET and the + // same-origin data-URL flag is set. + "data" if same_origin_data_url_flag && method == Method::Get => Ok(None), "http" | "https" => { let mut req = CORSRequest::new(referer, destination, mode, method, headers); req.preflight_flag = !is_simple_method(&req.method) || diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 31833912795..6d3ea932099 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -626,7 +626,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest { load_data.url.clone(), mode, load_data.method.clone(), - combined_headers); + combined_headers, + true); match cors_request { Ok(None) => { let mut buf = String::new(); @@ -1301,7 +1302,8 @@ impl XMLHttpRequest { global: GlobalRef) -> ErrorResult { let cors_request = match cors_request { Err(_) => { - // Happens in case of cross-origin non-http URIs + // Happens in case of unsupported cross-origin URI schemes. + // Supported schemes are http, https, data, and about. self.process_partial_response(XHRProgress::Errored( self.generation_id.get(), Error::Network)); return Err(Error::Network); diff --git a/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini b/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini index e5366749d28..fff1641f7eb 100644 --- a/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/data-uri.htm.ini @@ -1,16 +1,5 @@ [data-uri.htm] type: testharness - [XHR method GET with charset text/plain] - expected: FAIL - - [XHR method GET with charset text/plain (base64)] - expected: FAIL - - [XHR method GET with charset text/html] - expected: FAIL - - [XHR method GET with charset image/png] - expected: FAIL [XHR method GET with charset text/html;charset=UTF-8] expected: FAIL