diff options
author | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-04-15 14:52:16 +0900 |
---|---|---|
committer | Tetsuharu OHZEKI <saneyuki.snyk@gmail.com> | 2014-04-22 16:15:15 +0900 |
commit | b2fa6fa2215cb2914617f2cdb6e092626614b59e (patch) | |
tree | 871f5a9db139cdb47d5d27af1065e199a6b68081 /src/components/script/dom/attr.rs | |
parent | a74397432ee8d9311e5c7558cfcea2ec5c843143 (diff) | |
download | servo-b2fa6fa2215cb2914617f2cdb6e092626614b59e.tar.gz servo-b2fa6fa2215cb2914617f2cdb6e092626614b59e.zip |
Make Attr::SetValue to reflect attribute change.
Diffstat (limited to 'src/components/script/dom/attr.rs')
-rw-r--r-- | src/components/script/dom/attr.rs | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/components/script/dom/attr.rs b/src/components/script/dom/attr.rs index 07c22fa019d..dd289ff3b88 100644 --- a/src/components/script/dom/attr.rs +++ b/src/components/script/dom/attr.rs @@ -3,9 +3,14 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::AttrBinding; +use dom::bindings::codegen::InheritTypes::NodeCast; use dom::bindings::js::JS; use dom::bindings::utils::{Reflectable, Reflector, reflect_dom_object}; +use dom::element::Element; +use dom::node::Node; use dom::window::Window; +use dom::virtualmethods::vtable_for; +use servo_util::namespace; use servo_util::namespace::Namespace; use servo_util::str::DOMString; @@ -16,7 +21,10 @@ pub struct Attr { value: DOMString, name: DOMString, namespace: Namespace, - prefix: Option<DOMString> + prefix: Option<DOMString>, + + /// the element that owns this attribute. + owner: JS<Element>, } impl Reflectable for Attr { @@ -32,26 +40,38 @@ impl Reflectable for Attr { impl Attr { fn new_inherited(local_name: DOMString, value: DOMString, name: DOMString, namespace: Namespace, - prefix: Option<DOMString>) -> Attr { + prefix: Option<DOMString>, owner: JS<Element>) -> Attr { Attr { reflector_: Reflector::new(), local_name: local_name, value: value, name: name, //TODO: Intern attribute names namespace: namespace, - prefix: prefix + prefix: prefix, + owner: owner, } } pub fn new(window: &JS<Window>, local_name: DOMString, value: DOMString, name: DOMString, namespace: Namespace, - prefix: Option<DOMString>) -> JS<Attr> { - let attr = Attr::new_inherited(local_name, value, name, namespace, prefix); + prefix: Option<DOMString>, owner: JS<Element>) -> JS<Attr> { + let attr = Attr::new_inherited(local_name, value, name, namespace, prefix, owner); reflect_dom_object(~attr, window, AttrBinding::Wrap) } pub fn set_value(&mut self, value: DOMString) { + let node: JS<Node> = 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()); + } + self.value = value; + + if namespace_is_null { + vtable_for(&node).after_set_attr(self.local_name.clone(), self.value.clone()); + } } pub fn value_ref<'a>(&'a self) -> &'a str { |