diff options
author | Chris Paris <cap@chrisparis.org> | 2015-02-10 02:27:20 -1000 |
---|---|---|
committer | Chris Paris <cap@chrisparis.org> | 2015-03-18 11:20:47 -1000 |
commit | 99286e4b4fe267d123fbdd5484612840300ab30e (patch) | |
tree | 1bd121c8d8f32e13e47fbd5ba5d324c577a07b4d /components/script/dom/servohtmlparser.rs | |
parent | a5217556072390131f41a7a4cd07e8eb5a671d06 (diff) | |
download | servo-99286e4b4fe267d123fbdd5484612840300ab30e.tar.gz servo-99286e4b4fe267d123fbdd5484612840300ab30e.zip |
Implement Element.innerHTML setter
Diffstat (limited to 'components/script/dom/servohtmlparser.rs')
-rw-r--r-- | components/script/dom/servohtmlparser.rs | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/components/script/dom/servohtmlparser.rs b/components/script/dom/servohtmlparser.rs index c41cdcdd93c..a1122df4ab1 100644 --- a/components/script/dom/servohtmlparser.rs +++ b/components/script/dom/servohtmlparser.rs @@ -31,6 +31,14 @@ pub struct Sink { pub document: JS<Document>, } +/// FragmentContext is used only to pass this group of related values +/// into functions. +#[derive(Copy)] +pub struct FragmentContext<'a> { + pub context_elem: JSRef<'a, Node>, + pub form_elem: Option<JSRef<'a, Node>>, +} + pub type Tokenizer = tokenizer::Tokenizer<TreeBuilder<JS<Node>, Sink>>; // NB: JSTraceable is *not* auto-derived. @@ -76,6 +84,39 @@ impl ServoHTMLParser { ServoHTMLParserBinding::Wrap) } + #[allow(unrooted_must_root)] + pub fn new_for_fragment(base_url: Option<Url>, document: JSRef<Document>, + fragment_context: FragmentContext) -> Temporary<ServoHTMLParser> { + let window = document.window().root(); + let sink = Sink { + base_url: base_url, + document: JS::from_rooted(document), + }; + + let tb_opts = TreeBuilderOpts { + ignore_missing_rules: true, + .. Default::default() + }; + let tb = TreeBuilder::new_for_fragment(sink, + JS::from_rooted(fragment_context.context_elem), + fragment_context.form_elem.map(|n| JS::from_rooted(n)), + tb_opts); + + let tok_opts = tokenizer::TokenizerOpts { + initial_state: Some(tb.tokenizer_state_for_context_elem()), + .. Default::default() + }; + let tok = tokenizer::Tokenizer::new(tb, tok_opts); + + let parser = ServoHTMLParser { + reflector_: Reflector::new(), + tokenizer: DOMRefCell::new(tok), + }; + + reflect_dom_object(box parser, GlobalRef::Window(window.r()), + ServoHTMLParserBinding::Wrap) + } + #[inline] pub fn tokenizer<'a>(&'a self) -> &'a DOMRefCell<Tokenizer> { &self.tokenizer |