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