@@ -210,40 +210,8 @@ impl<Handle, Sink> TreeBuilderActions<Handle>
210210
211211 // Insert at the "appropriate place for inserting a node".
212212 fn insert_appropriately ( & mut self , child : NodeOrText < Handle > , override_target : Option < Handle > ) {
213- declare_tag_set ! ( foster_target = "table" "tbody" "tfoot" "thead" "tr" ) ;
214- let target = override_target. unwrap_or_else ( || self . current_node ( ) ) ;
215- if !( self . foster_parenting && self . elem_in ( target. clone ( ) , foster_target) ) {
216- if self . html_elem_named ( target. clone ( ) , local_name ! ( "template" ) ) {
217- // No foster parenting (inside template).
218- let contents = self . sink . get_template_contents ( target) ;
219- self . sink . append ( contents, child) ;
220- } else {
221- // No foster parenting (the common case).
222- self . sink . append ( target, child) ;
223- }
224- return ;
225- }
226-
227- // Foster parenting
228- let mut iter = self . open_elems . iter ( ) . rev ( ) . peekable ( ) ;
229- while let Some ( elem) = iter. next ( ) {
230- if self . html_elem_named ( elem. clone ( ) , local_name ! ( "template" ) ) {
231- let contents = self . sink . get_template_contents ( elem. clone ( ) ) ;
232- self . sink . append ( contents, child) ;
233- return ;
234- } else if self . html_elem_named ( elem. clone ( ) , local_name ! ( "table" ) ) {
235- // Try inserting "inside last table's parent node, immediately before last table"
236- if let Err ( child) = self . sink . append_before_sibling ( elem. clone ( ) , child) {
237- // If last_table has no parent, we regain ownership of the child.
238- // Insert "inside previous element, after its last child (if any)"
239- let previous_element = ( * iter. peek ( ) . unwrap ( ) ) . clone ( ) ;
240- self . sink . append ( previous_element, child) ;
241- }
242- return ;
243- }
244- }
245- let html_elem = self . html_elem ( ) ;
246- self . sink . append ( html_elem, child) ;
213+ let insertion_point = self . appropriate_place_for_insertion ( override_target) ;
214+ self . insert_at ( insertion_point, child) ;
247215 }
248216
249217 fn adoption_agency ( & mut self , subject : LocalName ) {
@@ -775,10 +743,40 @@ impl<Handle, Sink> TreeBuilderActions<Handle>
775743 // FIXME: application cache selection algorithm
776744 }
777745
746+ // https://html.spec.whatwg.org/multipage/#create-an-element-for-the-token
778747 fn insert_element ( & mut self , push : PushFlag , ns : Namespace , name : LocalName , attrs : Vec < Attribute > )
779748 -> Handle {
780- let elem = self . sink . create_element ( QualName :: new ( ns, name) , attrs) ;
781- self . insert_appropriately ( AppendNode ( elem. clone ( ) ) , None ) ;
749+ declare_tag_set ! ( form_associatable =
750+ "button" "fieldset" "input" "object"
751+ "output" "select" "textarea" "img" ) ;
752+
753+ declare_tag_set ! ( listed = [ form_associatable] - "img" ) ;
754+
755+ // Step 7.
756+ let qname = QualName :: new ( ns, name) ;
757+ let elem = self . sink . create_element ( qname. clone ( ) , attrs. clone ( ) ) ;
758+
759+ let insertion_point = self . appropriate_place_for_insertion ( None ) ;
760+ let tree_node = match insertion_point {
761+ LastChild ( ref p) |
762+ BeforeSibling ( ref p) => p. clone ( )
763+ } ;
764+
765+ // Step 12.
766+ if form_associatable ( qname. clone ( ) ) &&
767+ self . form_elem . is_some ( ) &&
768+ !self . in_html_elem_named ( local_name ! ( "template" ) ) &&
769+ !( listed ( qname. clone ( ) ) &&
770+ attrs. iter ( ) . any ( |a| a. name == qualname ! ( "" , "form" ) ) ) {
771+
772+ let form = self . form_elem . as_ref ( ) . unwrap ( ) . clone ( ) ;
773+ if self . sink . same_tree ( tree_node, form. clone ( ) ) {
774+ self . sink . associate_with_form ( elem. clone ( ) , form)
775+ }
776+ }
777+
778+ self . insert_at ( insertion_point, AppendNode ( elem. clone ( ) ) ) ;
779+
782780 match push {
783781 Push => self . push ( & elem) ,
784782 NoPush => ( ) ,
0 commit comments