diff options
Diffstat (limited to 'src/components/script/dom')
-rw-r--r-- | src/components/script/dom/htmlbuttonelement.rs | 84 | ||||
-rw-r--r-- | src/components/script/dom/virtualmethods.rs | 19 | ||||
-rw-r--r-- | src/components/script/dom/webidls/HTMLButtonElement.webidl | 2 |
3 files changed, 97 insertions, 8 deletions
diff --git a/src/components/script/dom/htmlbuttonelement.rs b/src/components/script/dom/htmlbuttonelement.rs index 4e89545737b..d0fb4bb16a6 100644 --- a/src/components/script/dom/htmlbuttonelement.rs +++ b/src/components/script/dom/htmlbuttonelement.rs @@ -4,15 +4,17 @@ use dom::bindings::codegen::Bindings::HTMLButtonElementBinding; use dom::bindings::codegen::Bindings::HTMLButtonElementBinding::HTMLButtonElementMethods; -use dom::bindings::codegen::InheritTypes::HTMLButtonElementDerived; +use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLElementCast, NodeCast}; +use dom::bindings::codegen::InheritTypes::{HTMLButtonElementDerived, HTMLFieldSetElementDerived}; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::utils::{Reflectable, Reflector}; use dom::document::Document; -use dom::element::HTMLButtonElementTypeId; +use dom::element::{AttributeHandlers, Element, HTMLButtonElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; -use dom::node::{Node, ElementNodeTypeId, window_from_node}; +use dom::node::{DisabledStateHelpers, Node, NodeHelpers, ElementNodeTypeId, window_from_node}; use dom::validitystate::ValidityState; +use dom::virtualmethods::VirtualMethods; use servo_util::str::DOMString; #[deriving(Encodable)] @@ -44,6 +46,82 @@ impl<'a> HTMLButtonElementMethods for JSRef<'a, HTMLButtonElement> { let window = window_from_node(self).root(); ValidityState::new(&*window) } + + // http://www.whatwg.org/html/#dom-fe-disabled + fn Disabled(&self) -> bool { + let elem: &JSRef<Element> = ElementCast::from_ref(self); + elem.has_attribute("disabled") + } + + // http://www.whatwg.org/html/#dom-fe-disabled + fn SetDisabled(&self, disabled: bool) { + let elem: &JSRef<Element> = ElementCast::from_ref(self); + elem.set_bool_attribute("disabled", disabled) + } +} + +impl<'a> VirtualMethods for JSRef<'a, HTMLButtonElement> { + fn super_type<'a>(&'a self) -> Option<&'a VirtualMethods> { + let htmlelement: &JSRef<HTMLElement> = 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<Node> = NodeCast::from_ref(self); + match name.as_slice() { + "disabled" => { + node.set_disabled_state(true); + node.set_enabled_state(false); + }, + _ => () + } + } + + fn before_remove_attr(&self, name: DOMString, value: DOMString) { + match self.super_type() { + Some(ref s) => s.before_remove_attr(name.clone(), value), + _ => (), + } + + let node: &JSRef<Node> = NodeCast::from_ref(self); + match name.as_slice() { + "disabled" => { + node.set_disabled_state(false); + node.set_enabled_state(true); + node.check_ancestors_disabled_state_for_form_control(); + }, + _ => () + } + } + + fn bind_to_tree(&self, tree_in_doc: bool) { + match self.super_type() { + Some(ref s) => s.bind_to_tree(tree_in_doc), + _ => (), + } + + let node: &JSRef<Node> = NodeCast::from_ref(self); + node.check_ancestors_disabled_state_for_form_control(); + } + + fn unbind_from_tree(&self, tree_in_doc: bool) { + match self.super_type() { + Some(ref s) => s.unbind_from_tree(tree_in_doc), + _ => (), + } + + let node: &JSRef<Node> = NodeCast::from_ref(self); + if node.ancestors().any(|ancestor| ancestor.is_htmlfieldsetelement()) { + node.check_ancestors_disabled_state_for_form_control(); + } else { + node.check_disabled_attribute(); + } + } } impl Reflectable for HTMLButtonElement { diff --git a/src/components/script/dom/virtualmethods.rs b/src/components/script/dom/virtualmethods.rs index 042420d7479..df618c7a8ff 100644 --- a/src/components/script/dom/virtualmethods.rs +++ b/src/components/script/dom/virtualmethods.rs @@ -6,6 +6,7 @@ use dom::attr::{AttrValue, StringAttrValue}; use dom::bindings::codegen::InheritTypes::ElementCast; use dom::bindings::codegen::InheritTypes::HTMLAnchorElementCast; use dom::bindings::codegen::InheritTypes::HTMLBodyElementCast; +use dom::bindings::codegen::InheritTypes::HTMLButtonElementCast; use dom::bindings::codegen::InheritTypes::HTMLCanvasElementCast; use dom::bindings::codegen::InheritTypes::HTMLElementCast; use dom::bindings::codegen::InheritTypes::HTMLIFrameElementCast; @@ -14,13 +15,19 @@ use dom::bindings::codegen::InheritTypes::HTMLObjectElementCast; use dom::bindings::codegen::InheritTypes::HTMLStyleElementCast; use dom::bindings::js::JSRef; use dom::element::Element; -use dom::element::{ElementTypeId, HTMLAnchorElementTypeId}; -use dom::element::{HTMLBodyElementTypeId, HTMLCanvasElementTypeId}; -use dom::element::{HTMLIFrameElementTypeId, HTMLImageElementTypeId}; -use dom::element::{HTMLObjectElementTypeId, HTMLStyleElementTypeId}; +use dom::element::ElementTypeId; +use dom::element::HTMLAnchorElementTypeId; +use dom::element::HTMLBodyElementTypeId; +use dom::element::HTMLButtonElementTypeId; +use dom::element::HTMLCanvasElementTypeId; +use dom::element::HTMLIFrameElementTypeId; +use dom::element::HTMLImageElementTypeId; +use dom::element::HTMLObjectElementTypeId; +use dom::element::HTMLStyleElementTypeId; use dom::event::Event; use dom::htmlanchorelement::HTMLAnchorElement; use dom::htmlbodyelement::HTMLBodyElement; +use dom::htmlbuttonelement::HTMLButtonElement; use dom::htmlcanvaselement::HTMLCanvasElement; use dom::htmlelement::HTMLElement; use dom::htmliframeelement::HTMLIFrameElement; @@ -115,6 +122,10 @@ pub fn vtable_for<'a>(node: &'a JSRef<Node>) -> &'a VirtualMethods { let element: &JSRef<HTMLBodyElement> = HTMLBodyElementCast::to_ref(node).unwrap(); element as &VirtualMethods } + ElementNodeTypeId(HTMLButtonElementTypeId) => { + let element: &JSRef<HTMLButtonElement> = HTMLButtonElementCast::to_ref(node).unwrap(); + element as &VirtualMethods + } ElementNodeTypeId(HTMLCanvasElementTypeId) => { let element: &JSRef<HTMLCanvasElement> = HTMLCanvasElementCast::to_ref(node).unwrap(); element as &VirtualMethods diff --git a/src/components/script/dom/webidls/HTMLButtonElement.webidl b/src/components/script/dom/webidls/HTMLButtonElement.webidl index 6425ed3e119..ad21e11370f 100644 --- a/src/components/script/dom/webidls/HTMLButtonElement.webidl +++ b/src/components/script/dom/webidls/HTMLButtonElement.webidl @@ -6,7 +6,7 @@ // http://www.whatwg.org/html/#htmlbuttonelement interface HTMLButtonElement : HTMLElement { // attribute boolean autofocus; - // attribute boolean disabled; + attribute boolean disabled; //readonly attribute HTMLFormElement? form; // attribute DOMString formAction; // attribute DOMString formEnctype; |