From 8e3593aa670c1bd5d775870c3b75852859bbd572 Mon Sep 17 00:00:00 2001 From: Johann Hofmann Date: Thu, 21 Jul 2016 15:12:12 +0200 Subject: [PATCH] Improve page load error information Fixes #8640. This commit adds a neterror page that displays really really basic information about what went wrong with your request, which is an improvement over the current state of blank page. It also fixes the problem of certificate validation errors not triggering the cert error page, since for some reason the function string seems to have turned lowercase. --- components/net/http_loader.rs | 2 +- components/script/dom/servohtmlparser.rs | 17 ++++++++++++++--- resources/neterror.html | 8 ++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 resources/neterror.html diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 80a7b91e335..a39d284a486 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -1143,7 +1143,7 @@ fn is_cert_verify_error(error: &OpensslError) -> bool { match error { &OpensslError::UnknownError { ref library, ref function, ref reason } => { library == "SSL routines" && - function == "SSL3_GET_SERVER_CERTIFICATE" && + function.to_uppercase() == "SSL3_GET_SERVER_CERTIFICATE" && reason == "certificate verify failed" } } diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index 884ac6c8653..a28612416fc 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -171,13 +171,24 @@ impl AsyncResponseListener for ParserContext { Some(parser) => parser.root(), None => return, }; - parser.r().document().finish_load(LoadType::PageSource(self.url.clone())); - if let Err(err) = status { - debug!("Failed to load page URL {}, error: {:?}", self.url, err); + 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 parser = parser.r(); + let page_bytes = read_resource_file("neterror.html").unwrap(); + let page = String::from_utf8(page_bytes).unwrap(); + let page = page.replace("${reason}", reason); + parser.pending_input().borrow_mut().push(page); + parser.parse_sync(); + } else 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); } + parser.r().document().finish_load(LoadType::PageSource(self.url.clone())); + parser.r().last_chunk_received().set(true); if !parser.r().is_suspended() { parser.r().parse_sync(); diff --git a/resources/neterror.html b/resources/neterror.html new file mode 100644 index 00000000000..8af6cbb2d08 --- /dev/null +++ b/resources/neterror.html @@ -0,0 +1,8 @@ + + + Error loading page + + +

Could not load the requested page: ${reason}

+ +