diff --git a/dom_sink/src/owned_dom.rs b/dom_sink/src/owned_dom.rs index 559fa04e..a9c08b51 100644 --- a/dom_sink/src/owned_dom.rs +++ b/dom_sink/src/owned_dom.rs @@ -197,6 +197,17 @@ impl TreeSink for Sink { x == y } + fn same_home_subtree(&self, _x: Handle, _y: Handle) -> bool { + true + } + + fn associate_with_form(&mut self, _target: Handle, _form: Handle) { + } + + fn has_parent_node(&self, node: Handle) -> bool { + !node.parent.is_null() + } + fn elem_name(&self, target: Handle) -> QualName { match target.node { Element(ref name, _) => name.clone(), @@ -230,8 +241,9 @@ impl TreeSink for Sink { fn append_before_sibling(&mut self, sibling: Handle, - child: NodeOrText) -> Result<(), NodeOrText> { - let (mut parent, i) = unwrap_or_return!(get_parent_and_index(sibling), Err(child)); + child: NodeOrText) { + let (mut parent, i) = get_parent_and_index(sibling) + .expect("append_before_sibling called on node without parent"); let mut child = match (child, i) { // No previous node. @@ -241,7 +253,7 @@ impl TreeSink for Sink { (AppendText(text), i) => { let prev = parent.children[i-1]; if append_to_existing_text(prev, &text) { - return Ok(()); + return; } self.new_node(Text(text)) } @@ -259,7 +271,6 @@ impl TreeSink for Sink { child.parent = parent; parent.children.insert(i, child); - Ok(()) } fn append_doctype_to_document(&mut self, name: String, public_id: String, system_id: String) { diff --git a/dom_sink/src/rcdom.rs b/dom_sink/src/rcdom.rs index a09b2a88..2f690be6 100644 --- a/dom_sink/src/rcdom.rs +++ b/dom_sink/src/rcdom.rs @@ -163,6 +163,18 @@ impl TreeSink for RcDom { new_node(Comment(text)) } + fn same_home_subtree(&self, _x: Handle, _y: Handle) -> bool { + true + } + + fn associate_with_form(&mut self, _target: Handle, _form: Handle) { + } + + fn has_parent_node(&self, node: Handle) -> bool { + let node = node.borrow(); + node.parent.is_some() + } + fn append(&mut self, parent: Handle, child: NodeOrText) { // Append to an existing Text node if we have one. match child { @@ -181,8 +193,9 @@ impl TreeSink for RcDom { fn append_before_sibling(&mut self, sibling: Handle, - child: NodeOrText) -> Result<(), NodeOrText> { - let (parent, i) = unwrap_or_return!(get_parent_and_index(&sibling), Err(child)); + child: NodeOrText) { + let (parent, i) = get_parent_and_index(&sibling) + .expect("append_before_sibling called on node without parent"); let child = match (child, i) { // No previous node. @@ -193,7 +206,7 @@ impl TreeSink for RcDom { let parent = parent.borrow(); let prev = &parent.children[i-1]; if append_to_existing_text(prev, &text) { - return Ok(()); + return; } new_node(Text(text)) } @@ -211,7 +224,6 @@ impl TreeSink for RcDom { child.borrow_mut().parent = Some(parent.clone().downgrade()); parent.borrow_mut().children.insert(i, child); - Ok(()) } fn append_doctype_to_document(&mut self, name: String, public_id: String, system_id: String) { diff --git a/examples/noop-tree-builder.rs b/examples/noop-tree-builder.rs index ce1306b8..fdc97108 100644 --- a/examples/noop-tree-builder.rs +++ b/examples/noop-tree-builder.rs @@ -46,6 +46,10 @@ impl TreeSink for Sink { x == y } + fn same_home_subtree(&self, _x: usize, _y: usize) -> bool { + true + } + fn elem_name(&self, target: usize) -> QualName { self.names.get(&target).expect("not an element").clone() } @@ -60,13 +64,15 @@ impl TreeSink for Sink { self.get_id() } + fn has_parent_node(&self, _node: usize) -> bool { + // `node` will have a parent unless a script moved it, and we're + // not running scripts. Therefore we can aways return true. + true + } + fn append_before_sibling(&mut self, _sibling: usize, - _new_node: NodeOrText) -> Result<(), NodeOrText> { - // `sibling` will have a parent unless a script moved it, and we're - // not running scripts. Therefore we can aways return `Ok(())`. - Ok(()) - } + _new_node: NodeOrText) { } fn parse_error(&mut self, _msg: Cow<'static, str>) { } fn set_quirks_mode(&mut self, _mode: QuirksMode) { } @@ -74,6 +80,7 @@ impl TreeSink for Sink { fn append_doctype_to_document(&mut self, _name: String, _public_id: String, _system_id: String) { } fn add_attrs_if_missing(&mut self, _target: usize, _attrs: Vec) { } + fn associate_with_form(&mut self, _target: usize, _form: usize) { } fn remove_from_parent(&mut self, _target: usize) { } fn reparent_children(&mut self, _node: usize, _new_parent: usize) { } fn mark_script_already_started(&mut self, _node: usize) { } diff --git a/examples/print-tree-actions.rs b/examples/print-tree-actions.rs index 11846e5b..19d66bde 100644 --- a/examples/print-tree-actions.rs +++ b/examples/print-tree-actions.rs @@ -56,6 +56,10 @@ impl TreeSink for Sink { x == y } + fn same_home_subtree(&self, _x: usize, _y: usize) -> bool { + true + } + fn elem_name(&self, target: usize) -> QualName { self.names.get(&target).expect("not an element").clone() } @@ -73,6 +77,12 @@ impl TreeSink for Sink { id } + fn has_parent_node(&self, _node: usize) -> bool { + // `node` will have a parent unless a script moved it, and we're + // not running scripts. Therefore we can aways return true + true + } + fn append(&mut self, parent: usize, child: NodeOrText) { match child { AppendNode(n) @@ -84,17 +94,13 @@ impl TreeSink for Sink { fn append_before_sibling(&mut self, sibling: usize, - new_node: NodeOrText) -> Result<(), NodeOrText> { + new_node: NodeOrText) { match new_node { AppendNode(n) => println!("Append node {} before {}", n, sibling), AppendText(t) => println!("Append text before {}: \"{}\"", sibling, t.escape_default()), } - - // `sibling` will have a parent unless a script moved it, and we're - // not running scripts. Therefore we can aways return `Ok(())`. - Ok(()) } fn append_doctype_to_document(&mut self, name: String, public_id: String, system_id: String) { @@ -108,6 +114,12 @@ impl TreeSink for Sink { } } + fn associate_with_form(&mut self, _target: usize, _form: usize) { + // No form owner support. Since same_home_subtree always returns + // true we cannot be sure that this associate_with_form call is + // valid + } + fn remove_from_parent(&mut self, target: usize) { println!("Remove {} from parent", target); } diff --git a/src/tree_builder/actions.rs b/src/tree_builder/actions.rs index 25bc99ca..873d90ed 100644 --- a/src/tree_builder/actions.rs +++ b/src/tree_builder/actions.rs @@ -207,40 +207,8 @@ impl TreeBuilderActions // Insert at the "appropriate place for inserting a node". fn insert_appropriately(&mut self, child: NodeOrText, override_target: Option) { - declare_tag_set!(foster_target = table tbody tfoot thead tr); - let target = override_target.unwrap_or_else(|| self.current_node()); - if !(self.foster_parenting && self.elem_in(target.clone(), foster_target)) { - // No foster parenting (the common case). - return self.sink.append(target, child); - } - - // Foster parenting - // FIXME: