Implement displaying of text/plain documents

This is done by detecting the content type as text/plain
and following the requirements from:
https://html.spec.whatwg.org/multipage/browsers.html#read-text
This commit is contained in:
Chris Double 2015-03-13 16:42:43 +13:00
parent 82c52a7a1c
commit 618142fac7
4 changed files with 40 additions and 25 deletions

View file

@ -55,6 +55,11 @@ fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cooki
let mut url = load_data.url.clone(); let mut url = load_data.url.clone();
let mut redirected_to = HashSet::new(); let mut redirected_to = HashSet::new();
let senders = ResponseSenders {
immediate_consumer: start_chan,
eventual_consumer: load_data.consumer
};
// If the URL is a view-source scheme then the scheme data contains the // If the URL is a view-source scheme then the scheme data contains the
// real URL that should be used for which the source is to be viewed. // real URL that should be used for which the source is to be viewed.
// Change our existing URL to that and keep note that we are viewing // Change our existing URL to that and keep note that we are viewing
@ -62,16 +67,19 @@ fn load(mut load_data: LoadData, start_chan: Sender<TargetedLoadResponse>, cooki
let viewing_source = if url.scheme == "view-source" { let viewing_source = if url.scheme == "view-source" {
let inner_url = load_data.url.non_relative_scheme_data().unwrap(); let inner_url = load_data.url.non_relative_scheme_data().unwrap();
url = Url::parse(inner_url).unwrap(); url = Url::parse(inner_url).unwrap();
match url.scheme.as_slice() {
"http" | "https" => {}
_ => {
let s = format!("The {} scheme with view-source is not supported", url.scheme);
send_error(url, s, senders);
return;
}
};
true true
} else { } else {
false false
}; };
let senders = ResponseSenders {
immediate_consumer: start_chan,
eventual_consumer: load_data.consumer
};
// Loop to handle redirects. // Loop to handle redirects.
loop { loop {
iters = iters + 1; iters = iters + 1;

View file

@ -180,6 +180,22 @@ pub fn parse_html(document: JSRef<Document>,
task_state::enter(IN_HTML_PARSER); task_state::enter(IN_HTML_PARSER);
} }
fn parse_progress(parser: &JSRef<ServoHTMLParser>, url: &Url, load_response: &LoadResponse) {
for msg in load_response.progress_port.iter() {
match msg {
ProgressMsg::Payload(data) => {
// FIXME: use Vec<u8> (html5ever #34)
let data = UTF_8.decode(data.as_slice(), DecoderTrap::Replace).unwrap();
parser.parse_chunk(data);
}
ProgressMsg::Done(Err(err)) => {
panic!("Failed to load page URL {}, error: {}", url.serialize(), err);
}
ProgressMsg::Done(Ok(())) => break,
}
}
};
match input { match input {
HTMLInput::InputString(s) => { HTMLInput::InputString(s) => {
parser.parse_chunk(s); parser.parse_chunk(s);
@ -205,19 +221,7 @@ pub fn parse_html(document: JSRef<Document>,
parse_progress(&parser, url, &load_response); parse_progress(&parser, url, &load_response);
}, },
_ => { _ => {
for msg in load_response.progress_port.iter() { parse_progress(&parser, url, &load_response);
match msg {
ProgressMsg::Payload(data) => {
// FIXME: use Vec<u8> (html5ever #34)
let data = UTF_8.decode(data.as_slice(), DecoderTrap::Replace).unwrap();
parser.parse_chunk(data);
}
ProgressMsg::Done(Err(err)) => {
panic!("Failed to load page URL {}, error: {}", url.serialize(), err);
}
ProgressMsg::Done(Ok(())) => break,
}
}
} }
} }
} }

View file

@ -82,6 +82,7 @@ use js;
use url::Url; use url::Url;
use libc; use libc;
use std::ascii::AsciiExt;
use std::any::Any; use std::any::Any;
use std::borrow::ToOwned; use std::borrow::ToOwned;
use std::cell::{Cell, RefCell}; use std::cell::{Cell, RefCell};
@ -984,10 +985,18 @@ impl ScriptTask {
headers.get().map(|&LastModified(ref tm)| dom_last_modified(tm)) headers.get().map(|&LastModified(ref tm)| dom_last_modified(tm))
}); });
let content_type = match response.metadata.content_type {
Some((ref t, ref st)) if t.as_slice().eq_ignore_ascii_case("text") &&
st.as_slice().eq_ignore_ascii_case("plain") => {
Some("text/plain".to_owned())
}
_ => None
};
let document = Document::new(window.r(), let document = Document::new(window.r(),
Some(final_url.clone()), Some(final_url.clone()),
IsHTMLDocument::HTMLDocument, IsHTMLDocument::HTMLDocument,
None, content_type,
last_modified, last_modified,
DocumentSource::FromParser).root(); DocumentSource::FromParser).root();

View file

@ -1,11 +1,5 @@
[load-text-plain.html] [load-text-plain.html]
type: testharness type: testharness
[Checking document metadata for text file]
expected: FAIL
[Checking DOM for text file]
expected: FAIL
[Checking contents for text file] [Checking contents for text file]
expected: FAIL expected: FAIL