diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-03 15:00:47 +0200 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2017-09-03 15:00:47 +0200 |
commit | 86285e542aa62c29ab3487eb9e493c768947a653 (patch) | |
tree | 672bc19e245c1f1c086d0041fcc742a0904826fd /components/script/dom/element.rs | |
parent | 7dcd3ae50d090170fec4217248cc7864a1d2413a (diff) | |
download | servo-86285e542aa62c29ab3487eb9e493c768947a653.tar.gz servo-86285e542aa62c29ab3487eb9e493c768947a653.zip |
Properly change the kind of the given attribute in SetAttributeNode
The given argument may have special meaning for the element to which we add it,
and thus may have a specific representation to which we should switch the
attribute current's value.
Fixes #18357.
Diffstat (limited to 'components/script/dom/element.rs')
-rw-r--r-- | components/script/dom/element.rs | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 11df4f6bd42..6896d25b9e4 100644 --- a/components/script/dom/element.rs +++ b/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<Option<Root<Attr>>> { - // 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()))); } |