From 33955f0ab20c5d7edd7f334459822816b2aa031e Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Mon, 21 Apr 2014 22:43:20 -0400 Subject: [PATCH] Implement window forwarding for body event handlers. --- .../script/dom/bindings/codegen/Bindings.conf | 1 - src/components/script/dom/htmlbodyelement.rs | 16 +++++++- src/components/script/dom/htmlelement.rs | 40 +++++++++++++++++-- .../script/dom/webidls/HTMLBodyElement.webidl | 2 +- .../script/dom/webidls/HTMLElement.webidl | 2 + .../content/test_inline_event_handler.html | 17 ++++++++ src/test/content/test_load_event.html | 3 ++ 7 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/test/content/test_inline_event_handler.html diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index b7d728021d1..c4fc466ed6b 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -134,4 +134,3 @@ DOMInterfaces = { 'TestBinding': {}, } - diff --git a/src/components/script/dom/htmlbodyelement.rs b/src/components/script/dom/htmlbodyelement.rs index 37962f3c540..c768444126f 100644 --- a/src/components/script/dom/htmlbodyelement.rs +++ b/src/components/script/dom/htmlbodyelement.rs @@ -10,7 +10,9 @@ use dom::document::Document; use dom::element::HTMLBodyElementTypeId; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; use dom::htmlelement::HTMLElement; -use dom::node::{Node, ElementNodeTypeId}; +use dom::node::{Node, ElementNodeTypeId, window_from_node}; +use dom::window::WindowMethods; +use js::jsapi::{JSContext, JSObject}; use servo_util::str::DOMString; #[deriving(Encodable)] @@ -50,6 +52,8 @@ pub trait HTMLBodyElementMethods { fn SetBgColor(&self, _bg_color: DOMString) -> ErrorResult; fn Background(&self) -> DOMString; fn SetBackground(&self, _background: DOMString) -> ErrorResult; + fn GetOnunload(&self, cx: *mut JSContext) -> *mut JSObject; + fn SetOnunload(&mut self, cx: *mut JSContext, listener: *mut JSObject); } impl<'a> HTMLBodyElementMethods for JSRef<'a, HTMLBodyElement> { @@ -100,4 +104,14 @@ impl<'a> HTMLBodyElementMethods for JSRef<'a, HTMLBodyElement> { fn SetBackground(&self, _background: DOMString) -> ErrorResult { Ok(()) } + + fn GetOnunload(&self, cx: *mut JSContext) -> *mut JSObject { + let win = window_from_node(self).root(); + win.deref().GetOnunload(cx) + } + + fn SetOnunload(&mut self, cx: *mut JSContext, listener: *mut JSObject) { + let mut win = window_from_node(self).root(); + win.SetOnunload(cx, listener) + } } diff --git a/src/components/script/dom/htmlelement.rs b/src/components/script/dom/htmlelement.rs index 81f645a0eca..c5f3fd3ed48 100644 --- a/src/components/script/dom/htmlelement.rs +++ b/src/components/script/dom/htmlelement.rs @@ -3,19 +3,22 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use dom::bindings::codegen::BindingDeclarations::HTMLElementBinding; -use dom::bindings::codegen::InheritTypes::ElementCast; -use dom::bindings::codegen::InheritTypes::HTMLElementDerived; +use dom::bindings::codegen::InheritTypes::{ElementCast, HTMLFrameSetElementDerived}; +use dom::bindings::codegen::InheritTypes::{HTMLElementDerived, HTMLBodyElementDerived}; +use dom::bindings::codegen::InheritTypes::EventTargetCast; use dom::bindings::js::{JSRef, Temporary}; use dom::bindings::error::{ErrorResult, Fallible}; use dom::document::Document; use dom::element::{Element, ElementTypeId, HTMLElementTypeId}; use dom::eventtarget::{EventTarget, NodeTargetTypeId}; -use dom::node::{Node, ElementNodeTypeId}; +use dom::node::{Node, ElementNodeTypeId, window_from_node}; use dom::virtualmethods::VirtualMethods; -use js::jsapi::JSContext; +use dom::window::WindowMethods; +use js::jsapi::{JSContext, JSObject}; use js::jsval::{JSVal, NullValue}; use servo_util::namespace; use servo_util::str::DOMString; +use std::ptr; #[deriving(Encodable)] pub struct HTMLElement { @@ -45,6 +48,17 @@ impl HTMLElement { } } +trait PrivateHTMLElementHelpers { + fn is_body_or_frameset(&self) -> bool; +} + +impl<'a> PrivateHTMLElementHelpers for JSRef<'a, HTMLElement> { + fn is_body_or_frameset(&self) -> bool { + let eventtarget: &JSRef = EventTargetCast::from_ref(self); + eventtarget.is_htmlbodyelement() || eventtarget.is_htmlframesetelement() + } +} + pub trait HTMLElementMethods { fn Title(&self) -> DOMString; fn SetTitle(&mut self, _title: DOMString); @@ -76,6 +90,8 @@ pub trait HTMLElementMethods { fn OffsetLeft(&self) -> i32; fn OffsetWidth(&self) -> i32; fn OffsetHeight(&self) -> i32; + fn GetOnload(&self, cx: *mut JSContext) -> *mut JSObject; + fn SetOnload(&mut self, cx: *mut JSContext, listener: *mut JSObject); } impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> { @@ -195,6 +211,22 @@ impl<'a> HTMLElementMethods for JSRef<'a, HTMLElement> { fn OffsetHeight(&self) -> i32 { 0 } + + fn GetOnload(&self, cx: *mut JSContext) -> *mut JSObject { + if self.is_body_or_frameset() { + let win = window_from_node(self).root(); + win.deref().GetOnload(cx) + } else { + ptr::mut_null() + } + } + + fn SetOnload(&mut self, cx: *mut JSContext, listener: *mut JSObject) { + if self.is_body_or_frameset() { + let mut win = window_from_node(self).root(); + win.SetOnload(cx, listener) + } + } } impl<'a> VirtualMethods for JSRef<'a, HTMLElement> { diff --git a/src/components/script/dom/webidls/HTMLBodyElement.webidl b/src/components/script/dom/webidls/HTMLBodyElement.webidl index 83b8815d122..05d11436371 100644 --- a/src/components/script/dom/webidls/HTMLBodyElement.webidl +++ b/src/components/script/dom/webidls/HTMLBodyElement.webidl @@ -23,4 +23,4 @@ partial interface HTMLBodyElement { [SetterThrows] attribute DOMString background; }; -//HTMLBodyElement implements WindowEventHandlers; +HTMLBodyElement implements WindowEventHandlers; diff --git a/src/components/script/dom/webidls/HTMLElement.webidl b/src/components/script/dom/webidls/HTMLElement.webidl index 8f1315d011d..20d83845d7b 100644 --- a/src/components/script/dom/webidls/HTMLElement.webidl +++ b/src/components/script/dom/webidls/HTMLElement.webidl @@ -54,3 +54,5 @@ partial interface HTMLElement { readonly attribute long offsetWidth; readonly attribute long offsetHeight; }; +HTMLElement implements GlobalEventHandlers; +//HTMLElement implements OnErrorEventHandlerForNodes; diff --git a/src/test/content/test_inline_event_handler.html b/src/test/content/test_inline_event_handler.html new file mode 100644 index 00000000000..2c412a11aed --- /dev/null +++ b/src/test/content/test_inline_event_handler.html @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/src/test/content/test_load_event.html b/src/test/content/test_load_event.html index 2ae84b16233..e3e193bfd72 100644 --- a/src/test/content/test_load_event.html +++ b/src/test/content/test_load_event.html @@ -16,6 +16,9 @@ } } + window.onload = function(ev) { + _fail("this inline handler should be overwritten"); + } window.onload = function(ev) { onloads++; check(ev);