@@ -370,39 +370,44 @@ impl<Handle, Sink> TreeBuilder<Handle, Sink>
370
370
self . context_elem . is_some ( )
371
371
}
372
372
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 > {
374
376
use self :: tag_sets:: * ;
375
377
376
378
declare_tag_set ! ( foster_target = "table" "tbody" "tfoot" "thead" "tr" ) ;
377
379
let target = override_target. unwrap_or_else ( || self . current_node ( ) ) ;
378
380
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
+ }
381
389
}
382
390
383
391
// 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" ) ) {
396
398
// 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 ( ) ) ;
399
401
} else {
402
+ // If elem has no parent, we regain ownership of the child.
400
403
// 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) ;
403
406
}
404
407
}
405
408
}
409
+ let html_elem = self . html_elem ( ) ;
410
+ LastChild ( html_elem)
406
411
}
407
412
408
413
fn insert_at ( & mut self , insertion_point : InsertionPoint < Handle > , child : NodeOrText < Handle > ) {
0 commit comments