Implement Element.innerHTML setter

This commit is contained in:
Chris Paris 2015-02-10 02:27:20 -10:00
parent a521755607
commit 99286e4b4f
9 changed files with 109 additions and 67 deletions

View file

@ -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