aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servoparser/mod.rs
diff options
context:
space:
mode:
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 {