aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servohtmlparser.rs
diff options
context:
space:
mode:
authorrohan.prinja <rohan.prinja@samsung.com>2015-11-03 19:01:23 +0900
committerrohan.prinja <rohan.prinja@samsung.com>2015-11-03 19:01:23 +0900
commit6e774ea6eb6d719b98f924ab5bd0629d92fb27d0 (patch)
treefa48b89bb313a2e9514124b556bbcff5ed526a0f /components/script/dom/servohtmlparser.rs
parent7032a5d1dee9bb2ba0bee45f1fda984dadfa0609 (diff)
parent4f51710ed387baa1ad0a6e4cdb0fc5eee44093d5 (diff)
downloadservo-6e774ea6eb6d719b98f924ab5bd0629d92fb27d0.tar.gz
servo-6e774ea6eb6d719b98f924ab5bd0629d92fb27d0.zip
merge from master
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r--components/script/dom/servohtmlparser.rs33
1 files changed, 25 insertions, 8 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs
index 5f113c4dd54..3465dc723fc 100644
--- a/components/script/dom/servohtmlparser.rs
+++ b/components/script/dom/servohtmlparser.rs
@@ -45,7 +45,7 @@ impl Sink {
#[allow(unrooted_must_root)] // method is only run at parse time
pub fn get_or_create(&self, child: NodeOrText<JS<Node>>) -> Root<Node> {
match child {
- NodeOrText::AppendNode(n) => n.root(),
+ NodeOrText::AppendNode(n) => Root::from_ref(&*n),
NodeOrText::AppendText(t) => {
let text = Text::new(t.into(), &self.document);
Root::upcast(text)
@@ -68,8 +68,8 @@ pub type Tokenizer = tokenizer::Tokenizer<TreeBuilder<JS<Node>, Sink>>;
pub struct ParserContext {
/// The parser that initiated the request.
parser: Option<Trusted<ServoHTMLParser>>,
- /// Is this document a synthesized document for a single image?
- is_image_document: bool,
+ /// Is this a synthesized document
+ is_synthesized_document: bool,
/// The pipeline associated with this document.
id: PipelineId,
/// The subpage associated with this document.
@@ -85,7 +85,7 @@ impl ParserContext {
url: Url) -> ParserContext {
ParserContext {
parser: None,
- is_image_document: false,
+ is_synthesized_document: false,
id: id,
subpage: subpage,
script_chan: script_chan,
@@ -111,12 +111,12 @@ impl AsyncResponseListener for ParserContext {
match content_type {
Some(ContentType(Mime(TopLevel::Image, _, _))) => {
- self.is_image_document = true;
+ self.is_synthesized_document = true;
let page = format!("<html><body><img src='{}' /></body></html>",
self.url.serialize());
parser.pending_input.borrow_mut().push(page);
parser.parse_sync();
- }
+ },
Some(ContentType(Mime(TopLevel::Text, SubLevel::Plain, _))) => {
// FIXME: When servo/html5ever#109 is fixed remove <plaintext> usage and
// replace with fix from that issue.
@@ -130,12 +130,29 @@ impl AsyncResponseListener for ParserContext {
parser.pending_input.borrow_mut().push(page);
parser.parse_sync();
},
- _ => {}
+ Some(ContentType(Mime(TopLevel::Text, SubLevel::Html, _))) => {}, // Handle text/html
+ Some(ContentType(Mime(toplevel, sublevel, _))) => {
+ if toplevel.as_str() == "application" && sublevel.as_str() == "xhtml+xml" {
+ // Handle xhtml (application/xhtml+xml).
+ return;
+ }
+
+ // Show warning page for unknown mime types.
+ let page = format!("<html><body><p>Unknown content type ({}/{}).</p></body></html>",
+ toplevel.as_str(), sublevel.as_str());
+ self.is_synthesized_document = true;
+ parser.pending_input.borrow_mut().push(page);
+ parser.parse_sync();
+ },
+ None => {
+ // No content-type header.
+ // Merge with #4212 when fixed.
+ }
}
}
fn data_available(&mut self, payload: Vec<u8>) {
- if !self.is_image_document {
+ if !self.is_synthesized_document {
// FIXME: use Vec<u8> (html5ever #34)
let data = UTF_8.decode(&payload, DecoderTrap::Replace).unwrap();
let parser = match self.parser.as_ref() {