diff options
author | Ms2ger <ms2ger@gmail.com> | 2014-06-08 12:00:24 +0200 |
---|---|---|
committer | Ms2ger <ms2ger@gmail.com> | 2014-06-08 18:50:27 +0200 |
commit | 6308ed914c9546e6ac55f47338001885cbd827fe (patch) | |
tree | 06b0c427d862eb04c9b36145a8dd37ff6f2e340a /src/components/script/dom/htmlelement.rs | |
parent | 743dcee0f59d63bfbb820df2412c8e2267b38f66 (diff) | |
download | servo-6308ed914c9546e6ac55f47338001885cbd827fe.tar.gz servo-6308ed914c9546e6ac55f47338001885cbd827fe.zip |
Support GlobalEventHandlers.onclick.
Diffstat (limited to 'src/components/script/dom/htmlelement.rs')
-rw-r--r-- | src/components/script/dom/htmlelement.rs | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/components/script/dom/htmlelement.rs b/src/components/script/dom/htmlelement.rs index 250cdc65dd1..29ac184987b 100644 --- a/src/components/script/dom/htmlelement.rs +++ b/src/components/script/dom/htmlelement.rs @@ -8,9 +8,10 @@ use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFrameSetElementDeriv use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::codegen::InheritTypes::{HTMLElementDerived, HTMLBodyElementDerived}; use dom::bindings::js::{JSRef, Temporary}; +use dom::bindings::utils::Reflectable; use dom::document::Document; use dom::element::{Element, ElementTypeId, HTMLElementTypeId}; -use dom::eventtarget::{EventTarget, NodeTargetTypeId}; +use dom::eventtarget::{EventTarget, EventTargetHelpers, NodeTargetTypeId}; use dom::node::{Node, ElementNodeTypeId, window_from_node}; use dom::virtualmethods::VirtualMethods; use dom::window::WindowMethods; @@ -57,11 +58,23 @@ impl<'a> PrivateHTMLElementHelpers for JSRef<'a, HTMLElement> { } pub trait HTMLElementMethods { + fn GetOnclick(&self) -> Option<EventHandlerNonNull>; + fn SetOnclick(&mut self, listener: Option<EventHandlerNonNull>); fn GetOnload(&self) -> Option<EventHandlerNonNull>; fn SetOnload(&mut self, listener: Option<EventHandlerNonNull>); } impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> { + fn GetOnclick(&self) -> Option<EventHandlerNonNull> { + let eventtarget: &JSRef<EventTarget> = EventTargetCast::from_ref(self); + eventtarget.get_event_handler_common("click") + } + + fn SetOnclick(&mut self, listener: Option<EventHandlerNonNull>) { + let eventtarget: &mut JSRef<EventTarget> = EventTargetCast::from_mut_ref(self); + eventtarget.set_event_handler_common("click", listener) + } + fn GetOnload(&self) -> Option<EventHandlerNonNull> { if self.is_body_or_frameset() { let win = window_from_node(self).root(); @@ -84,4 +97,24 @@ impl<'a> VirtualMethods for JSRef<'a, HTMLElement> { let element: &JSRef<Element> = ElementCast::from_ref(self); Some(element 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()), + _ => (), + } + + if name.as_slice().starts_with("on") { + let mut window = window_from_node(self).root(); + let (cx, url, reflector) = (window.get_cx(), + window.get_url(), + window.reflector().get_jsobject()); + let mut self_alias = self.clone(); + let evtarget: &mut JSRef<EventTarget> = + EventTargetCast::from_mut_ref(&mut self_alias); + evtarget.set_event_handler_uncompiled(cx, url, reflector, + name.as_slice().slice_from(2), + value); + } + } } |