servo: Merge #18358 - Properly change the kind of the given attribute in SetAttributeNode (from servo:change-attr-kind); r=emilio

Fixes #18357.

Source-Repo: https://github.com/servo/servo
Source-Revision: 096912101b2ea8702a0337aae092241b930d6b5d

--HG--
extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear
extra : subtree_revision : 3136bd03aa4f44533fce9a3d705b5b3eae03ccbf
This commit is contained in:
Anthony Ramine 2017-09-03 13:05:00 -05:00
Родитель f3d7d85165
Коммит 697a32a1cb
1 изменённых файлов: 10 добавлений и 5 удалений

Просмотреть файл

@ -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())));
}