diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/document.rs | 12 | ||||
-rw-r--r-- | src/components/script/dom/htmlelement.rs | 35 | ||||
-rw-r--r-- | src/components/script/dom/webidls/EventHandler.webidl | 5 | ||||
-rw-r--r-- | src/components/script/dom/window.rs | 12 |
4 files changed, 61 insertions, 3 deletions
diff --git a/src/components/script/dom/document.rs b/src/components/script/dom/document.rs index 9b4d7aaf55d..3a0fa2e7f3b 100644 --- a/src/components/script/dom/document.rs +++ b/src/components/script/dom/document.rs @@ -330,6 +330,8 @@ pub trait DocumentMethods { fn Location(&self) -> Temporary<Location>; fn Children(&self) -> Temporary<HTMLCollection>; fn QuerySelector(&self, selectors: DOMString) -> Fallible<Option<Temporary<Element>>>; + fn GetOnclick(&self) -> Option<EventHandlerNonNull>; + fn SetOnclick(&mut self, listener: Option<EventHandlerNonNull>); fn GetOnload(&self) -> Option<EventHandlerNonNull>; fn SetOnload(&mut self, listener: Option<EventHandlerNonNull>); } @@ -819,6 +821,16 @@ impl<'a> DocumentMethods for JSRef<'a, Document> { root.query_selector(selectors) } + 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> { let eventtarget: &JSRef<EventTarget> = EventTargetCast::from_ref(self); eventtarget.get_event_handler_common("load") 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); + } + } } diff --git a/src/components/script/dom/webidls/EventHandler.webidl b/src/components/script/dom/webidls/EventHandler.webidl index dd922cc3f75..48a82e6c038 100644 --- a/src/components/script/dom/webidls/EventHandler.webidl +++ b/src/components/script/dom/webidls/EventHandler.webidl @@ -21,12 +21,13 @@ typedef OnErrorEventHandlerNonNull? OnErrorEventHandler; [NoInterfaceObject] interface GlobalEventHandlers { - attribute EventHandler onload; + attribute EventHandler onclick; + attribute EventHandler onload; }; [NoInterfaceObject] interface WindowEventHandlers { - attribute EventHandler onunload; + attribute EventHandler onunload; }; // The spec has |attribute OnErrorEventHandler onerror;| on diff --git a/src/components/script/dom/window.rs b/src/components/script/dom/window.rs index 170c2bfa657..16e3f39dbba 100644 --- a/src/components/script/dom/window.rs +++ b/src/components/script/dom/window.rs @@ -129,6 +129,8 @@ pub trait WindowMethods { fn Window(&self) -> Temporary<Window>; fn Self(&self) -> Temporary<Window>; fn Performance(&self) -> Temporary<Performance>; + fn GetOnclick(&self) -> Option<EventHandlerNonNull>; + fn SetOnclick(&mut self, listener: Option<EventHandlerNonNull>); fn GetOnload(&self) -> Option<EventHandlerNonNull>; fn SetOnload(&mut self, listener: Option<EventHandlerNonNull>); fn GetOnunload(&self) -> Option<EventHandlerNonNull>; @@ -217,6 +219,16 @@ impl<'a> WindowMethods for JSRef<'a, Window> { Temporary::new(self.performance.get().get_ref().clone()) } + 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> { let eventtarget: &JSRef<EventTarget> = EventTargetCast::from_ref(self); eventtarget.get_event_handler_common("load") |