aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servoparser/mod.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2016-12-01 03:57:14 -0800
committerGitHub <noreply@github.com>2016-12-01 03:57:14 -0800
commit5abbc9f69668f23469a9c01937c68e305fa36cd8 (patch)
treeb52900197ca1fe3b29ede8cda9863be7e9994c0c /components/script/dom/servoparser/mod.rs
parent94eefc4001e0998fcea5a35943da73624ea82b13 (diff)
parentc1bdd3d5ce0e971c7b3eec0dadcfaf7dd448e9a3 (diff)
downloadservo-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.rs36
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 {