diff options
author | rohan.prinja <rohan.prinja@samsung.com> | 2015-11-03 19:01:23 +0900 |
---|---|---|
committer | rohan.prinja <rohan.prinja@samsung.com> | 2015-11-03 19:01:23 +0900 |
commit | 6e774ea6eb6d719b98f924ab5bd0629d92fb27d0 (patch) | |
tree | fa48b89bb313a2e9514124b556bbcff5ed526a0f /components/script/dom/servohtmlparser.rs | |
parent | 7032a5d1dee9bb2ba0bee45f1fda984dadfa0609 (diff) | |
parent | 4f51710ed387baa1ad0a6e4cdb0fc5eee44093d5 (diff) | |
download | servo-6e774ea6eb6d719b98f924ab5bd0629d92fb27d0.tar.gz servo-6e774ea6eb6d719b98f924ab5bd0629d92fb27d0.zip |
merge from master
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r-- | components/script/dom/servohtmlparser.rs | 33 |
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() { |