diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-12-01 03:57:14 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-01 03:57:14 -0800 |
commit | 5abbc9f69668f23469a9c01937c68e305fa36cd8 (patch) | |
tree | b52900197ca1fe3b29ede8cda9863be7e9994c0c /components/script/dom/servoparser/mod.rs | |
parent | 94eefc4001e0998fcea5a35943da73624ea82b13 (diff) | |
parent | c1bdd3d5ce0e971c7b3eec0dadcfaf7dd448e9a3 (diff) | |
download | servo-5abbc9f69668f23469a9c01937c68e305fa36cd8.tar.gz servo-5abbc9f69668f23469a9c01937c68e305fa36cd8.zip |
Auto merge of #14423 - nox:xml-document, r=Ms2ger
Properly mark application/xhtml+xml documents as XML
<!-- Reviewable:start -->
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14423)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/servoparser/mod.rs')
-rw-r--r-- | components/script/dom/servoparser/mod.rs | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/components/script/dom/servoparser/mod.rs b/components/script/dom/servoparser/mod.rs index ff90674c1d2..c6f4364925b 100644 --- a/components/script/dom/servoparser/mod.rs +++ b/components/script/dom/servoparser/mod.rs @@ -14,11 +14,12 @@ use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::str::DOMString; use dom::document::{Document, DocumentSource, IsHTMLDocument}; +use dom::element::Element; use dom::globalscope::GlobalScope; use dom::htmlformelement::HTMLFormElement; use dom::htmlimageelement::HTMLImageElement; use dom::htmlscriptelement::HTMLScriptElement; -use dom::node::{Node, document_from_node, window_from_node}; +use dom::node::{Node, NodeSiblingIterator}; use encoding::all::UTF_8; use encoding::types::{DecoderTrap, Encoding}; use html5ever::tokenizer::buffer_queue::BufferQueue; @@ -96,17 +97,15 @@ impl ServoParser { } // https://html.spec.whatwg.org/multipage/#parsing-html-fragments - pub fn parse_html_fragment( - context_node: &Node, - input: DOMString, - output: &Node) { - let window = window_from_node(context_node); - let context_document = document_from_node(context_node); + pub fn parse_html_fragment(context: &Element, input: DOMString) -> FragmentParsingResult { + let context_node = context.upcast::<Node>(); + let context_document = context_node.owner_doc(); + let window = context_document.window(); let url = context_document.url(); // Step 1. let loader = DocumentLoader::new(&*context_document.loader()); - let document = Document::new(&window, None, Some(url.clone()), + let document = Document::new(window, None, Some(url.clone()), IsHTMLDocument::HTMLDocument, None, None, DocumentSource::FromParser, @@ -134,9 +133,7 @@ impl ServoParser { // Step 14. let root_element = document.GetDocumentElement().expect("no document element"); - for child in root_element.upcast::<Node>().children() { - output.AppendChild(&child).unwrap(); - } + FragmentParsingResult { inner: root_element.upcast::<Node>().children() } } pub fn parse_xml_document( @@ -349,6 +346,23 @@ impl ServoParser { } } +pub struct FragmentParsingResult { + inner: NodeSiblingIterator, +} + +impl Iterator for FragmentParsingResult { + type Item = Root<Node>; + + fn next(&mut self) -> Option<Root<Node>> { + let next = match self.inner.next() { + Some(next) => next, + None => return None, + }; + next.remove_self(); + Some(next) + } +} + #[derive(HeapSizeOf, JSTraceable)] #[must_root] enum Tokenizer { |