diff --git a/servo/components/script/dom/element.rs b/servo/components/script/dom/element.rs index 11df4f6bd42a..6896d25b9e44 100644 --- a/servo/components/script/dom/element.rs +++ b/servo/components/script/dom/element.rs @@ -1649,10 +1649,6 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-setattributenode fn SetAttributeNode(&self, attr: &Attr) -> Fallible>> { - // Workaround for https://github.com/servo/servo/issues/17366 - // This ensures that if this is an "id" attr, its value is an Atom - attr.swap_value(&mut self.parse_plain_attribute(attr.local_name(), attr.Value())); - // Step 1. if let Some(owner) = attr.GetOwnerElement() { if &*owner != self { @@ -1660,6 +1656,15 @@ impl ElementMethods for Element { } } + let vtable = vtable_for(self.upcast()); + + // This ensures that the attribute is of the expected kind for this + // specific element. This is inefficient and should probably be done + // differently. + attr.swap_value( + &mut vtable.parse_plain_attribute(attr.local_name(), attr.Value()), + ); + // Step 2. let position = self.attrs.borrow().iter().position(|old_attr| { attr.namespace() == old_attr.namespace() && attr.local_name() == old_attr.local_name() @@ -1688,7 +1693,7 @@ impl ElementMethods for Element { self.attrs.borrow_mut()[position] = JS::from_ref(attr); old_attr.set_owner(None); if attr.namespace() == &ns!() { - vtable_for(self.upcast()).attribute_mutated( + vtable.attribute_mutated( &attr, AttributeMutation::Set(Some(&old_attr.value()))); }