aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/script/dom/attr.rs
diff options
context:
space:
mode:
authorTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-04-15 14:52:16 +0900
committerTetsuharu OHZEKI <saneyuki.snyk@gmail.com>2014-04-22 16:15:15 +0900
commitb2fa6fa2215cb2914617f2cdb6e092626614b59e (patch)
tree871f5a9db139cdb47d5d27af1065e199a6b68081 /src/components/script/dom/attr.rs
parenta74397432ee8d9311e5c7558cfcea2ec5c843143 (diff)
downloadservo-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.rs30
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 {