diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-10 16:11:00 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2016-10-11 15:08:37 +0200 |
commit | 1405be691776e48836f651c3c616dc12322a0932 (patch) | |
tree | ae98c4b4e517879cfec1742464e1e44dca1afb4e /components/script/parse/html.rs | |
parent | 609299e1e45e93939f75f8439fc7ac3276ca5881 (diff) | |
download | servo-1405be691776e48836f651c3c616dc12322a0932.tar.gz servo-1405be691776e48836f651c3c616dc12322a0932.zip |
Unify ServoHTMLParser and ServoXMLParser in ServoParser
Diffstat (limited to 'components/script/parse/html.rs')
-rw-r--r-- | components/script/parse/html.rs | 54 |
1 files changed, 45 insertions, 9 deletions
diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index 39684bd1b3e..dd4a17c40c8 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -23,17 +23,18 @@ use dom::htmltemplateelement::HTMLTemplateElement; use dom::node::{document_from_node, window_from_node}; use dom::node::Node; use dom::processinginstruction::ProcessingInstruction; -use dom::servohtmlparser; -use dom::servohtmlparser::{FragmentContext, ServoHTMLParser}; +use dom::servoparser::{ServoParser, Tokenizer}; use dom::text::Text; use html5ever::Attribute; use html5ever::serialize::{AttrRef, Serializable, Serializer}; use html5ever::serialize::TraversalScope; use html5ever::serialize::TraversalScope::{ChildrenOnly, IncludeNode}; use html5ever::tendril::StrTendril; -use html5ever::tree_builder::{NextParserState, NodeOrText, QuirksMode, TreeSink}; +use html5ever::tokenizer::{Tokenizer as HtmlTokenizer, TokenizerOpts}; +use html5ever::tree_builder::{NextParserState, NodeOrText, QuirksMode}; +use html5ever::tree_builder::{TreeBuilder, TreeBuilderOpts, TreeSink}; use msg::constellation_msg::PipelineId; -use parse::Parser; +use parse::Sink; use std::borrow::Cow; use std::io::{self, Write}; use string_cache::QualName; @@ -53,7 +54,7 @@ fn insert(parent: &Node, reference_child: Option<&Node>, child: NodeOrText<JS<No } } -impl<'a> TreeSink for servohtmlparser::Sink { +impl<'a> TreeSink for Sink { type Output = Self; fn finish(self) -> Self { self } @@ -246,6 +247,14 @@ impl<'a> Serializable for &'a Node { } } +/// FragmentContext is used only to pass this group of related values +/// into functions. +#[derive(Copy, Clone)] +pub struct FragmentContext<'a> { + pub context_elem: &'a Node, + pub form_elem: Option<&'a Node>, +} + pub enum ParseContext<'a> { Fragment(FragmentContext<'a>), Owner(Option<PipelineId>), @@ -255,11 +264,38 @@ pub fn parse_html(document: &Document, input: DOMString, url: Url, context: ParseContext) { + let sink = Sink { + base_url: url, + document: JS::from_ref(document), + }; + + let options = TreeBuilderOpts { + ignore_missing_rules: true, + .. Default::default() + }; + let parser = match context { - ParseContext::Owner(owner) => - ServoHTMLParser::new(Some(url), document, owner), - ParseContext::Fragment(fc) => - ServoHTMLParser::new_for_fragment(Some(url), document, fc), + ParseContext::Owner(owner) => { + let tb = TreeBuilder::new(sink, options); + let tok = HtmlTokenizer::new(tb, Default::default()); + + ServoParser::new(document, owner, Tokenizer::HTML(tok), false) + }, + ParseContext::Fragment(fc) => { + let tb = TreeBuilder::new_for_fragment( + sink, + JS::from_ref(fc.context_elem), + fc.form_elem.map(|n| JS::from_ref(n)), + options); + + let tok_options = TokenizerOpts { + initial_state: Some(tb.tokenizer_state_for_context_elem()), + .. Default::default() + }; + let tok = HtmlTokenizer::new(tb, tok_options); + + ServoParser::new(document, None, Tokenizer::HTML(tok), true) + } }; parser.parse_chunk(String::from(input)); } |