aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/element.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2017-09-03 15:00:47 +0200
committerAnthony Ramine <n.oxyde@gmail.com>2017-09-03 15:00:47 +0200
commit86285e542aa62c29ab3487eb9e493c768947a653 (patch)
tree672bc19e245c1f1c086d0041fcc742a0904826fd /components/script/dom/element.rs
parent7dcd3ae50d090170fec4217248cc7864a1d2413a (diff)
downloadservo-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.rs15
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())));
}