Don't lose information in Fetch API

Also update test expectations.
This commit is contained in:
bd339 2017-01-05 01:00:03 +01:00
parent f838944332
commit 0f1eb13e33
23 changed files with 45 additions and 259 deletions

View file

@ -173,8 +173,10 @@ pub trait FetchTaskTarget {
#[derive(Serialize, Deserialize)]
pub enum FilteredMetadata {
Basic(Metadata),
Cors(Metadata),
Opaque,
Transparent(Metadata),
OpaqueRedirect
}
#[derive(Serialize, Deserialize)]

View file

@ -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()))
}
}

View file

@ -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(_) => {

View file

@ -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)
}
}
}