diff --git a/html5ever/src/tree_builder/mod.rs b/html5ever/src/tree_builder/mod.rs
index 3c302684..803a398e 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) => {
@@ -1390,14 +1382,20 @@ where
};
// 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")));
+
+ // 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 {
let form = self.form_elem.borrow().as_ref().unwrap().clone();
self.sink
.associate_with_form(&elem, &form, (&node1, node2.as_ref()));