mirror of
https://github.com/servo/servo.git
synced 2025-08-06 14:10:11 +01:00
Don't lose information in Fetch API
Also update test expectations.
This commit is contained in:
parent
f838944332
commit
0f1eb13e33
23 changed files with 45 additions and 259 deletions
|
@ -173,8 +173,10 @@ pub trait FetchTaskTarget {
|
|||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub enum FilteredMetadata {
|
||||
Basic(Metadata),
|
||||
Cors(Metadata),
|
||||
Opaque,
|
||||
Transparent(Metadata),
|
||||
OpaqueRedirect
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
|
|
|
@ -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()))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(_) => {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue