Skip to content

Commit

Permalink
Issue #15017: Properly handle and report network errors on page loads.
Browse files Browse the repository at this point in the history
  • Loading branch information
simartin committed Jan 28, 2017
1 parent a1187c1 commit abc9f78
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 10 deletions.
27 changes: 17 additions & 10 deletions components/script/dom/servoparser/mod.rs
Expand Up @@ -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 {
Expand All @@ -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);
Expand Down Expand Up @@ -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, _))) => {
Expand Down Expand Up @@ -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);
}
Expand Down
6 changes: 6 additions & 0 deletions tests/wpt/mozilla/meta/MANIFEST.json
Expand Up @@ -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",
Expand Down
13 changes: 13 additions & 0 deletions tests/wpt/mozilla/tests/mozilla/network_error_page_load.html
@@ -0,0 +1,13 @@
<!doctype html>
<meta charset="utf-8">
<title>Test for issue #15017</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<html>
<iframe src="http://aowiejfoiawjef" id="foo"></iframe>
</html>
<script>
var t = async_test("Load resource with network error")
var iframe = document.getElementById('foo')
iframe.onload = t.step_func(function(e) { t.done() })
</script>

0 comments on commit abc9f78

Please sign in to comment.