diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index dd289ff3b88..237806c07f8 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -14,6 +14,11 @@ use servo_util::namespace; use servo_util::namespace::Namespace; use servo_util::str::DOMString; +pub enum AttrSettingType { + FirstSetAttr, + ReplacedAttr, +} + #[deriving(Encodable)] pub struct Attr { reflector_: Reflector, @@ -59,12 +64,17 @@ impl Attr { reflect_dom_object(~attr, window, AttrBinding::Wrap) } - pub fn set_value(&mut self, value: DOMString) { + pub fn set_value(&mut self, set_type: AttrSettingType, value: DOMString) { let node: JS = NodeCast::from(&self.owner); let namespace_is_null = self.namespace == namespace::Null; - if namespace_is_null { - vtable_for(&node).before_remove_attr(self.local_name.clone(), self.value.clone()); + match set_type { + ReplacedAttr => { + if namespace_is_null { + vtable_for(&node).before_remove_attr(self.local_name.clone(), self.value.clone()); + } + } + FirstSetAttr => {} } self.value = value; @@ -89,7 +99,7 @@ impl Attr { } pub fn SetValue(&mut self, value: DOMString) { - self.set_value(value); + self.set_value(ReplacedAttr, value); } pub fn Name(&self) -> DOMString { diff --git a/src/components/script/dom/element.rs b/src/components/script/dom/element.rs index 2796b7aa870..d60181f5349 100644 --- a/src/components/script/dom/element.rs +++ b/src/components/script/dom/element.rs @@ -4,7 +4,7 @@ //! Element nodes. -use dom::attr::Attr; +use dom::attr::{Attr, AttrSettingType, ReplacedAttr, FirstSetAttr}; use dom::attrlist::AttrList; use dom::bindings::codegen::ElementBinding; use dom::bindings::codegen::InheritTypes::{ElementDerived, NodeCast}; @@ -263,23 +263,22 @@ impl AttributeHandlers for JS { prefix: Option, cb: |&JS| -> bool) { let node: JS = NodeCast::from(self); let idx = self.get().attrs.iter().position(cb); - match idx { + let (mut attr, set_type): (JS, AttrSettingType) = match idx { Some(idx) => { - self.get_mut().attrs[idx].get_mut().set_value(value.clone()); + let attr = self.get_mut().attrs[idx].clone(); + (attr, ReplacedAttr) } None => { let doc = node.get().owner_doc().get(); - let new_attr = Attr::new(&doc.window, local_name.clone(), value.clone(), + let attr = Attr::new(&doc.window, local_name.clone(), value.clone(), name, namespace.clone(), prefix, self.clone()); - self.get_mut().attrs.push(new_attr); - - // FIXME: This part should be handled in `Attr`. - if namespace == namespace::Null { - vtable_for(&node).after_set_attr(local_name, value); - } + self.get_mut().attrs.push(attr.clone()); + (attr, FirstSetAttr) } - } + }; + + attr.get_mut().set_value(set_type, value); } // http://dom.spec.whatwg.org/#dom-element-setattribute