From abc9f785e82d437936fcd7a4edebdeabe43691b3 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Sat, 28 Jan 2017 21:28:36 +0100 Subject: [PATCH] Issue #15017: Properly handle and report network errors on page loads. --- components/script/dom/servoparser/mod.rs | 27 ++++++++++++------- tests/wpt/mozilla/meta/MANIFEST.json | 6 +++++ .../mozilla/network_error_page_load.html | 13 +++++++++ 3 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 tests/wpt/mozilla/tests/mozilla/network_error_page_load.html diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index aaa36a2098bb..9b4d66984393 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) { 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 = "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); } diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 50a3787a9ce3..ff0b1bda1ac0 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -8768,6 +8768,12 @@ "url": "/_mozilla/mozilla/nested_asap_script.html" } ], + "mozilla/network_error_page_load.html": [ + { + "path": "mozilla/network_error_page_load.html", + "url": "/_mozilla/mozilla/network_error_page_load.html" + } + ], "mozilla/node_compareDocumentPosition.html": [ { "path": "mozilla/node_compareDocumentPosition.html", diff --git a/tests/wpt/mozilla/tests/mozilla/network_error_page_load.html b/tests/wpt/mozilla/tests/mozilla/network_error_page_load.html new file mode 100644 index 000000000000..7304ea34515b --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/network_error_page_load.html @@ -0,0 +1,13 @@ + + +Test for issue #15017 + + + + + +