diff --git a/src/components/script/dom/htmlareaelement.rs b/src/components/script/dom/htmlareaelement.rs index 61f7890945c..339355c844f 100644 --- a/src/components/script/dom/htmlareaelement.rs +++ b/src/components/script/dom/htmlareaelement.rs @@ -4,13 +4,15 @@ use dom::bindings::codegen::Bindings::HTMLAreaElementBinding; use dom::bindings::codegen::InheritTypes::HTMLAreaElementDerived; +use dom::bindings::codegen::InheritTypes::{HTMLElementCast, NodeCast}; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; use dom::element::HTMLAreaElementTypeId; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; -use dom::node::{Node, ElementNodeTypeId}; +use dom::node::{Node, NodeHelpers, ElementNodeTypeId}; +use dom::virtualmethods::VirtualMethods; use servo_util::str::DOMString; #[deriving(Encodable)] @@ -37,6 +39,39 @@ impl HTMLAreaElement { } } +impl<'a> VirtualMethods for JSRef<'a, HTMLAreaElement> { + fn super_type<'a>(&'a self) -> Option<&'a VirtualMethods> { + let htmlelement: &JSRef = HTMLElementCast::from_ref(self); + Some(htmlelement as &VirtualMethods) + } + + fn after_set_attr(&self, name: DOMString, value: DOMString) { + match self.super_type() { + Some(ref s) => s.after_set_attr(name.clone(), value.clone()), + _ => (), + } + + let node: &JSRef = NodeCast::from_ref(self); + match name.as_slice() { + "href" => node.set_enabled_state(true), + _ => () + } + } + + fn before_remove_attr(&self, name: DOMString, value: DOMString) { + match self.super_type() { + Some(ref s) => s.before_remove_attr(name.clone(), value.clone()), + _ => (), + } + + let node: &JSRef = NodeCast::from_ref(self); + match name.as_slice() { + "href" => node.set_enabled_state(false), + _ => () + } + } +} + impl Reflectable for HTMLAreaElement { fn reflector<'a>(&'a self) -> &'a Reflector { self.htmlelement.reflector() diff --git a/src/components/script/dom/virtualmethods.rs b/src/components/script/dom/virtualmethods.rs index 24cd91ccea7..ae3b3b702e3 100644 --- a/src/components/script/dom/virtualmethods.rs +++ b/src/components/script/dom/virtualmethods.rs @@ -5,6 +5,7 @@ use dom::attr::{AttrValue, StringAttrValue}; use dom::bindings::codegen::InheritTypes::ElementCast; use dom::bindings::codegen::InheritTypes::HTMLAnchorElementCast; +use dom::bindings::codegen::InheritTypes::HTMLAreaElementCast; use dom::bindings::codegen::InheritTypes::HTMLBodyElementCast; use dom::bindings::codegen::InheritTypes::HTMLButtonElementCast; use dom::bindings::codegen::InheritTypes::HTMLCanvasElementCast; @@ -23,6 +24,7 @@ use dom::bindings::js::JSRef; use dom::element::Element; use dom::element::ElementTypeId; use dom::element::HTMLAnchorElementTypeId; +use dom::element::HTMLAreaElementTypeId; use dom::element::HTMLBodyElementTypeId; use dom::element::HTMLButtonElementTypeId; use dom::element::HTMLCanvasElementTypeId; @@ -38,6 +40,7 @@ use dom::element::HTMLStyleElementTypeId; use dom::element::HTMLTextAreaElementTypeId; use dom::event::Event; use dom::htmlanchorelement::HTMLAnchorElement; +use dom::htmlareaelement::HTMLAreaElement; use dom::htmlbodyelement::HTMLBodyElement; use dom::htmlbuttonelement::HTMLButtonElement; use dom::htmlcanvaselement::HTMLCanvasElement; @@ -136,6 +139,10 @@ pub fn vtable_for<'a>(node: &'a JSRef) -> &'a VirtualMethods { let element: &JSRef = HTMLAnchorElementCast::to_ref(node).unwrap(); element as &VirtualMethods } + ElementNodeTypeId(HTMLAreaElementTypeId) => { + let element: &JSRef = HTMLAreaElementCast::to_ref(node).unwrap(); + element as &VirtualMethods + } ElementNodeTypeId(HTMLBodyElementTypeId) => { let element: &JSRef = HTMLBodyElementCast::to_ref(node).unwrap(); element as &VirtualMethods