From ad725e87eceb6398460c24c790ff1c0020927900 Mon Sep 17 00:00:00 2001 From: Mykola Humanov Date: Wed, 5 Aug 2026 12:33:37 +0300 Subject: [PATCH 1/2] refactor(tree-builder): avoid unnecessary attribute clone in `TreeBuilder::insert_element`. --- html5ever/src/tree_builder/mod.rs | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs index 3fcfaec3..ffe80c1b 100644 --- a/html5ever/src/tree_builder/mod.rs +++ b/html5ever/src/tree_builder/mod.rs @@ -1370,14 +1370,6 @@ where declare_tag_set!(listed = [form_associatable] - "img"); // Step 7. - let qname = QualName::new(None, ns, name); - let elem = create_element_with_flags( - &self.sink, - qname.clone(), - attrs.clone(), - had_duplicate_attributes, - ); - let insertion_point = self.appropriate_place_for_insertion(None); let (node1, node2) = match insertion_point { InsertionPoint::LastChild(ref p) | InsertionPoint::BeforeSibling(ref p) => { @@ -1388,16 +1380,20 @@ where ref prev_element, } => (element.clone(), Some(prev_element.clone())), }; - // Step 12. - if form_associatable(qname.expanded()) + let qname = QualName::new(None, ns, name); + let form_is_associatable = form_associatable(qname.expanded()) && self.form_elem.borrow().is_some() && !self.in_html_elem_named(local_name!("template")) && !(listed(qname.expanded()) && attrs .iter() - .any(|a| a.name.expanded() == expanded_name!("", "form"))) - { + .any(|a| a.name.expanded() == expanded_name!("", "form"))); + + // check the form is associatable, then create element, and we are avoiding of cloning attributes. + let elem = create_element_with_flags(&self.sink, qname, attrs, had_duplicate_attributes); + + if form_is_associatable { let form = self.form_elem.borrow().as_ref().unwrap().clone(); self.sink .associate_with_form(&elem, &form, (&node1, node2.as_ref())); From 9958c09437f97eb29b9814d3c5fa1169537424cc Mon Sep 17 00:00:00 2001 From: Mykola Humanov Date: Thu, 6 Aug 2026 12:27:27 +0300 Subject: [PATCH 2/2] fix stylistic nits -- apply suggestions from code review Co-authored-by: Martin Robinson Signed-off-by: Mykola Humanov --- html5ever/src/tree_builder/mod.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs index ffe80c1b..afa10f2c 100644 --- a/html5ever/src/tree_builder/mod.rs +++ b/html5ever/src/tree_builder/mod.rs @@ -1380,6 +1380,7 @@ where ref prev_element, } => (element.clone(), Some(prev_element.clone())), }; + // Step 12. let qname = QualName::new(None, ns, name); let form_is_associatable = form_associatable(qname.expanded()) @@ -1390,7 +1391,8 @@ where .iter() .any(|a| a.name.expanded() == expanded_name!("", "form"))); - // check the form is associatable, then create element, and we are avoiding of cloning attributes. + // By checking whether the form is associatable first, then creating the element + // we can avoid cloning the attributes. let elem = create_element_with_flags(&self.sink, qname, attrs, had_duplicate_attributes); if form_is_associatable {