@@ -210,40 +210,8 @@ impl<Handle, Sink> TreeBuilderActions<Handle>
210
210
211
211
// Insert at the "appropriate place for inserting a node".
212
212
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) ;
247
215
}
248
216
249
217
fn adoption_agency ( & mut self , subject : LocalName ) {
@@ -775,10 +743,40 @@ impl<Handle, Sink> TreeBuilderActions<Handle>
775
743
// FIXME: application cache selection algorithm
776
744
}
777
745
746
+ // https://html.spec.whatwg.org/multipage/#create-an-element-for-the-token
778
747
fn insert_element ( & mut self , push : PushFlag , ns : Namespace , name : LocalName , attrs : Vec < Attribute > )
779
748
-> 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
+
782
780
match push {
783
781
Push => self . push ( & elem) ,
784
782
NoPush => ( ) ,
0 commit comments