diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index c5b7e6d0251..b5cd0930def 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -5,6 +5,7 @@ use crate::dom::activation::{synthetic_click_activation, ActivationSource}; use crate::dom::attr::Attr; use crate::dom::bindings::codegen::Bindings::EventHandlerBinding::EventHandlerNonNull; +use crate::dom::bindings::codegen::Bindings::EventHandlerBinding::OnErrorEventHandlerNonNull; use crate::dom::bindings::codegen::Bindings::HTMLElementBinding; use crate::dom::bindings::codegen::Bindings::HTMLElementBinding::HTMLElementMethods; use crate::dom::bindings::codegen::Bindings::HTMLLabelElementBinding::HTMLLabelElementMethods; @@ -181,6 +182,35 @@ impl HTMLElementMethods for HTMLElement { self.dataset.or_init(|| DOMStringMap::new(self)) } + // https://html.spec.whatwg.org/multipage/#handler-onerror + fn GetOnerror(&self) -> Option> { + if self.is_body_or_frameset() { + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnerror() + } else { + None + } + } else { + self.upcast::() + .get_event_handler_common("error") + } + } + + // https://html.spec.whatwg.org/multipage/#handler-onerror + fn SetOnerror(&self, listener: Option>) { + if self.is_body_or_frameset() { + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnerror(listener) + } + } else { + // special setter for error + self.upcast::() + .set_error_event_handler("error", listener) + } + } + // https://html.spec.whatwg.org/multipage/#handler-onload fn GetOnload(&self) -> Option> { if self.is_body_or_frameset() { @@ -209,34 +239,6 @@ impl HTMLElementMethods for HTMLElement { } } - // https://html.spec.whatwg.org/multipage/#handler-onresize - fn GetOnresize(&self) -> Option> { - if self.is_body_or_frameset() { - let document = document_from_node(self); - if document.has_browsing_context() { - document.window().GetOnload() - } else { - None - } - } else { - self.upcast::() - .get_event_handler_common("resize") - } - } - - // https://html.spec.whatwg.org/multipage/#handler-onresize - fn SetOnresize(&self, listener: Option>) { - if self.is_body_or_frameset() { - let document = document_from_node(self); - if document.has_browsing_context() { - document.window().SetOnresize(listener); - } - } else { - self.upcast::() - .set_event_handler_common("resize", listener) - } - } - // https://html.spec.whatwg.org/multipage/#handler-onblur fn GetOnblur(&self) -> Option> { if self.is_body_or_frameset() { @@ -293,6 +295,34 @@ impl HTMLElementMethods for HTMLElement { } } + // https://html.spec.whatwg.org/multipage/#handler-onresize + fn GetOnresize(&self) -> Option> { + if self.is_body_or_frameset() { + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().GetOnresize() + } else { + None + } + } else { + self.upcast::() + .get_event_handler_common("resize") + } + } + + // https://html.spec.whatwg.org/multipage/#handler-onresize + fn SetOnresize(&self, listener: Option>) { + if self.is_body_or_frameset() { + let document = document_from_node(self); + if document.has_browsing_context() { + document.window().SetOnresize(listener) + } + } else { + self.upcast::() + .set_event_handler_common("resize", listener) + } + } + // https://html.spec.whatwg.org/multipage/#handler-onscroll fn GetOnscroll(&self) -> Option> { if self.is_body_or_frameset() { diff --git a/components/script/dom/macros.rs b/components/script/dom/macros.rs index fe578f6f675..21124fd37c4 100644 --- a/components/script/dom/macros.rs +++ b/components/script/dom/macros.rs @@ -430,7 +430,9 @@ macro_rules! window_owned_beforeunload_event_handler( // As more methods get added, just update them here. macro_rules! global_event_handlers( () => ( + // These are special when on body/frameset elements event_handler!(blur, GetOnblur, SetOnblur); + error_event_handler!(error, GetOnerror, SetOnerror); event_handler!(focus, GetOnfocus, SetOnfocus); event_handler!(load, GetOnload, SetOnload); event_handler!(resize, GetOnresize, SetOnresize); @@ -460,7 +462,6 @@ macro_rules! global_event_handlers( event_handler!(durationchange, GetOndurationchange, SetOndurationchange); event_handler!(emptied, GetOnemptied, SetOnemptied); event_handler!(ended, GetOnended, SetOnended); - error_event_handler!(error, GetOnerror, SetOnerror); event_handler!(formdata, GetOnformdata, SetOnformdata); event_handler!(input, GetOninput, SetOninput); event_handler!(invalid, GetOninvalid, SetOninvalid); diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini index 62f99bff922..b72fe6022a4 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-body-window.html.ini @@ -1,14 +1,9 @@ [event-handler-attributes-body-window.html] type: testharness - [error] - expected: FAIL [HTMLBodyElement event handlers] expected: FAIL - [shadowed error (document.body)] - expected: FAIL - [not shadowed auxclick (document.body)] expected: FAIL @@ -27,9 +22,6 @@ [not shadowed paste (document.body)] expected: FAIL - [shadowed error (document.createElement("body"))] - expected: FAIL - [not shadowed auxclick (document.createElement("body"))] expected: FAIL @@ -48,27 +40,15 @@ [not shadowed paste (document.createElement("body"))] expected: FAIL - [shadowed resize (window)] - expected: FAIL - [not shadowed loadend (window)] expected: FAIL - [shadowed resize (document.body)] - expected: FAIL - - [shadowed resize (document.createElement("body"))] - expected: FAIL - [not shadowed securitypolicyviolation (window)] expected: FAIL [not shadowed auxclick (window)] expected: FAIL - [shadowed error (window)] - expected: FAIL - [not shadowed slotchange (window)] expected: FAIL @@ -113,4 +93,3 @@ [not shadowed webkitanimationstart (window)] expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini index 459422d322e..c9d948d5eac 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-frameset-window.html.ini @@ -1,19 +1,7 @@ [event-handler-attributes-frameset-window.html] - [shadowed resize (window)] - expected: FAIL - - [shadowed error (document.createElement("frameset"))] - expected: FAIL - [not shadowed paste (document.createElement("frameset"))] expected: FAIL - [shadowed resize (document.body)] - expected: FAIL - - [shadowed resize (document.createElement("frameset"))] - expected: FAIL - [not shadowed securitypolicyviolation (document.body)] expected: FAIL @@ -44,9 +32,6 @@ [not shadowed paste (document.body)] expected: FAIL - [shadowed error (document.body)] - expected: FAIL - [not shadowed copy (document.body)] expected: FAIL @@ -56,9 +41,6 @@ [not shadowed cut (document.createElement("frameset"))] expected: FAIL - [shadowed error (window)] - expected: FAIL - [not shadowed auxclick (document.createElement("frameset"))] expected: FAIL @@ -106,4 +88,3 @@ [not shadowed webkitanimationiteration (document.body)] expected: FAIL - diff --git a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini index a6fc6b39fc1..87953c35e5f 100644 --- a/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini +++ b/tests/wpt/metadata/html/webappapis/scripting/events/event-handler-attributes-windowless-body.html.ini @@ -2,9 +2,6 @@ [event-handler-attributes-windowless-body] expected: FAIL - [Ignore setting of error window event handlers on windowless body] - expected: FAIL - [auxclick is unaffected on a windowless body] expected: FAIL @@ -14,9 +11,6 @@ [securitypolicyviolation is unaffected on a windowless body] expected: FAIL - [Ignore setting of error window event handlers on windowless frameset] - expected: FAIL - [auxclick is unaffected on a windowless frameset] expected: FAIL