Skip to content

Commit 09b6194

Browse files
committed
Update appropriate_place_for_insertion
1 parent 599a96d commit 09b6194

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

src/tree_builder/mod.rs

+24-19
Original file line numberDiff line numberDiff line change
@@ -370,39 +370,44 @@ impl<Handle, Sink> TreeBuilder<Handle, Sink>
370370
self.context_elem.is_some()
371371
}
372372

373-
fn appropriate_place_for_insertion(&self, override_target: Option<Handle>) -> InsertionPoint<Handle> {
373+
fn appropriate_place_for_insertion(&mut self,
374+
override_target: Option<Handle>)
375+
-> InsertionPoint<Handle> {
374376
use self::tag_sets::*;
375377

376378
declare_tag_set!(foster_target = "table" "tbody" "tfoot" "thead" "tr");
377379
let target = override_target.unwrap_or_else(|| self.current_node());
378380
if !(self.foster_parenting && self.elem_in(target.clone(), foster_target)) {
379-
// No foster parenting (the common case).
380-
return LastChild(target)
381+
if self.html_elem_named(target.clone(), local_name!("template")) {
382+
// No foster parenting (inside template).
383+
let contents = self.sink.get_template_contents(target);
384+
return LastChild(contents);
385+
} else {
386+
// No foster parenting (the common case).
387+
return LastChild(target);
388+
}
381389
}
382390

383391
// Foster parenting
384-
// FIXME: <template>
385-
let last_table = self.open_elems.iter()
386-
.enumerate()
387-
.rev()
388-
.filter(|&(_, e)| self.html_elem_named(e.clone(), local_name!("table")))
389-
.next();
390-
391-
match last_table {
392-
None => {
393-
LastChild(self.html_elem())
394-
}
395-
Some((idx, last_table)) => {
392+
let mut iter = self.open_elems.iter().rev().peekable();
393+
while let Some(elem) = iter.next() {
394+
if self.html_elem_named(elem.clone(), local_name!("template")) {
395+
let contents = self.sink.get_template_contents(elem.clone());
396+
return LastChild(contents);
397+
} else if self.html_elem_named(elem.clone(), local_name!("table")) {
396398
// Try inserting "inside last table's parent node, immediately before last table"
397-
if self.sink.has_parent_node(last_table.clone()) {
398-
BeforeSibling(last_table.clone())
399+
if self.sink.has_parent_node(elem.clone()) {
400+
return BeforeSibling(elem.clone());
399401
} else {
402+
// If elem has no parent, we regain ownership of the child.
400403
// Insert "inside previous element, after its last child (if any)"
401-
let previous_element = self.open_elems[idx-1].clone();
402-
LastChild(previous_element)
404+
let previous_element = (*iter.peek().unwrap()).clone();
405+
return LastChild(previous_element);
403406
}
404407
}
405408
}
409+
let html_elem = self.html_elem();
410+
LastChild(html_elem)
406411
}
407412

408413
fn insert_at(&mut self, insertion_point: InsertionPoint<Handle>, child: NodeOrText<Handle>) {

0 commit comments

Comments
 (0)