aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servoparser/mod.rs
diff options
context:
space:
mode:
authorSimon Martin <simartin@users.sourceforge.net>2017-01-28 21:28:36 +0100
committerSimon Martin <simartin@users.sourceforge.net>2017-01-28 21:36:36 +0100
commitabc9f785e82d437936fcd7a4edebdeabe43691b3 (patch)
tree2be0ef79cc818addf3931b3a1aeed3b1557e72a5 /components/script/dom/servoparser/mod.rs
parenta1187c12ee4156a6e633f19dae5f48faa34cd2e7 (diff)
downloadservo-abc9f785e82d437936fcd7a4edebdeabe43691b3.tar.gz
servo-abc9f785e82d437936fcd7a4edebdeabe43691b3.zip
Issue #15017: Properly handle and report network errors on page loads.
Diffstat (limited to 'components/script/dom/servoparser/mod.rs')
-rw-r--r--components/script/dom/servoparser/mod.rs27
1 files changed, 17 insertions, 10 deletions
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs
index aaa36a2098b..9b4d6698439 100644
--- a/components/script/dom/servoparser/mod.rs
+++ b/components/script/dom/servoparser/mod.rs
@@ -431,6 +431,7 @@ impl FetchResponseListener for ParserContext {
fn process_response(&mut self, meta_result: Result<FetchMetadata, NetworkError>) {
let mut ssl_error = None;
+ let mut network_error = None;
let metadata = match meta_result {
Ok(meta) => {
Some(match meta {
@@ -445,6 +446,13 @@ impl FetchResponseListener for ParserContext {
meta.set_content_type(mime.as_ref());
Some(meta)
},
+ Err(NetworkError::Internal(reason)) => {
+ network_error = Some(reason);
+ let mut meta = Metadata::default(self.url.clone());
+ let mime: Option<Mime> = "text/html".parse().ok();
+ meta.set_content_type(mime.as_ref());
+ Some(meta)
+ },
Err(_) => None,
};
let content_type = metadata.clone().and_then(|meta| meta.content_type).map(Serde::into_inner);
@@ -486,6 +494,14 @@ impl FetchResponseListener for ParserContext {
parser.push_input_chunk(page);
parser.parse_sync();
}
+ if let Some(reason) = network_error {
+ self.is_synthesized_document = true;
+ let page_bytes = read_resource_file("neterror.html").unwrap();
+ let page = String::from_utf8(page_bytes).unwrap();
+ let page = page.replace("${reason}", &reason);
+ parser.push_input_chunk(page);
+ parser.parse_sync();
+ }
},
Some(ContentType(Mime(TopLevel::Text, SubLevel::Xml, _))) => {}, // Handle text/xml
Some(ContentType(Mime(toplevel, sublevel, _))) => {
@@ -527,16 +543,7 @@ impl FetchResponseListener for ParserContext {
None => return,
};
- if let Err(NetworkError::Internal(ref reason)) = status {
- // Show an error page for network errors,
- // certificate errors are handled earlier.
- self.is_synthesized_document = true;
- let page_bytes = read_resource_file("neterror.html").unwrap();
- let page = String::from_utf8(page_bytes).unwrap();
- let page = page.replace("${reason}", reason);
- parser.push_input_chunk(page);
- parser.parse_sync();
- } else if let Err(err) = status {
+ if let Err(err) = status {
// TODO(Savago): we should send a notification to callers #5463.
debug!("Failed to load page URL {}, error: {:?}", self.url, err);
}