diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 722e0283d1e..2ac8f234524 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -367,6 +367,9 @@ impl Document { self.loader.borrow_mut() } + #[inline] + pub fn has_browsing_context(&self) -> bool { self.has_browsing_context } + /// https://html.spec.whatwg.org/multipage/#concept-document-bc #[inline] pub fn browsing_context(&self) -> Option> { diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index 6725fdb5dfb..9caa85225ef 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -151,7 +151,12 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onload fn GetOnload(&self) -> Option> { if self.is_body_or_frameset() { - window_from_node(self).GetOnload() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnload() + } else { + None + } } else { self.upcast::().get_event_handler_common("load") } @@ -160,7 +165,10 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onload fn SetOnload(&self, listener: Option>) { if self.is_body_or_frameset() { - window_from_node(self).SetOnload(listener) + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnload(listener) + } } else { self.upcast::().set_event_handler_common("load", listener) } @@ -169,7 +177,12 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onresize fn GetOnresize(&self) -> Option> { if self.is_body_or_frameset() { - window_from_node(self).GetOnload() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnload() + } else { + None + } } else { self.upcast::().get_event_handler_common("resize") } @@ -178,7 +191,10 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onresize fn SetOnresize(&self, listener: Option>) { if self.is_body_or_frameset() { - window_from_node(self).SetOnresize(listener); + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnresize(listener); + } } else { self.upcast::().set_event_handler_common("resize", listener) } @@ -187,7 +203,12 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onblur fn GetOnblur(&self) -> Option> { if self.is_body_or_frameset() { - window_from_node(self).GetOnblur() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnblur() + } else { + None + } } else { self.upcast::().get_event_handler_common("blur") } @@ -196,7 +217,10 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onblur fn SetOnblur(&self, listener: Option>) { if self.is_body_or_frameset() { - window_from_node(self).SetOnblur(listener) + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnblur(listener) + } } else { self.upcast::().set_event_handler_common("blur", listener) } @@ -205,7 +229,12 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onfocus fn GetOnfocus(&self) -> Option> { if self.is_body_or_frameset() { - window_from_node(self).GetOnfocus() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnfocus() + } else { + None + } } else { self.upcast::().get_event_handler_common("focus") } @@ -214,7 +243,10 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onfocus fn SetOnfocus(&self, listener: Option>) { if self.is_body_or_frameset() { - window_from_node(self).SetOnfocus(listener) + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnfocus(listener) + } } else { self.upcast::().set_event_handler_common("focus", listener) } @@ -223,7 +255,12 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onscroll fn GetOnscroll(&self) -> Option> { if self.is_body_or_frameset() { - window_from_node(self).GetOnscroll() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnscroll() + } else { + None + } } else { self.upcast::().get_event_handler_common("scroll") } @@ -232,7 +269,10 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#handler-onscroll fn SetOnscroll(&self, listener: Option>) { if self.is_body_or_frameset() { - window_from_node(self).SetOnscroll(listener) + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnscroll(listener) + } } else { self.upcast::().set_event_handler_common("scroll", listener) } diff --git a/components/script/dom/htmlframesetelement.rs b/components/script/dom/htmlframesetelement.rs index b238692dc11..c2c95ea58c7 100644 --- a/components/script/dom/htmlframesetelement.rs +++ b/components/script/dom/htmlframesetelement.rs @@ -10,7 +10,7 @@ use dom::bindings::js::Root; use dom::bindings::str::DOMString; use dom::document::Document; use dom::htmlelement::HTMLElement; -use dom::node::{Node, window_from_node}; +use dom::node::{Node, document_from_node}; use html5ever_atoms::LocalName; #[dom_struct] diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index f2174bdd552..14c05bd3cee 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -354,11 +354,19 @@ macro_rules! define_event_handler( macro_rules! define_window_owned_event_handler( ($handler: ident, $event_type: ident, $getter: ident, $setter: ident) => ( fn $getter(&self) -> Option<::std::rc::Rc<$handler>> { - window_from_node(self).$getter() + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().$getter() + } else { + None + } } fn $setter(&self, listener: Option<::std::rc::Rc<$handler>>) { - window_from_node(self).$setter(listener) + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().$setter(listener) + } } ) ); diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 51d045d6c52..26692c67f87 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -45890,6 +45890,12 @@ "path": "html/semantics/embedded-content/the-img-element/not-rendered-dimension-getter.html", "url": "/html/semantics/embedded-content/the-img-element/not-rendered-dimension-getter.html" } + ], + "html/webappapis/scripting/events/body-exposed-window-event-handlers.html": [ + { + "path": "html/webappapis/scripting/events/body-exposed-window-event-handlers.html", + "url": "/html/webappapis/scripting/events/body-exposed-window-event-handlers.html" + } ] } }, diff --git a/tests/wpt/web-platform-tests/html/webappapis/scripting/events/body-exposed-window-event-handlers.html b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/body-exposed-window-event-handlers.html new file mode 100644 index 00000000000..0bd26dc7576 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/webappapis/scripting/events/body-exposed-window-event-handlers.html @@ -0,0 +1,49 @@ + + + + + + + +