diff --git a/Userland/Libraries/LibWeb/DOM/Document.h b/Userland/Libraries/LibWeb/DOM/Document.h index 143ae6908d..640a42a51e 100644 --- a/Userland/Libraries/LibWeb/DOM/Document.h +++ b/Userland/Libraries/LibWeb/DOM/Document.h @@ -353,7 +353,7 @@ private: explicit Document(const AK::URL&); // ^HTML::GlobalEventHandlers - virtual EventTarget& global_event_handlers_to_event_target() final { return *this; } + virtual EventTarget& global_event_handlers_to_event_target(FlyString const&) final { return *this; } void tear_down_layout_tree(); diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp index a995a360b0..b56a23498a 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp @@ -218,7 +218,7 @@ ExceptionOr EventTarget::dispatch_event_binding(NonnullRefPtr event } // https://html.spec.whatwg.org/multipage/webappapis.html#window-reflecting-body-element-event-handler-set -static bool is_window_reflecting_body_element_event_handler(FlyString const& name) +bool is_window_reflecting_body_element_event_handler(FlyString const& name) { return name.is_one_of( HTML::EventNames::blur, diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.h b/Userland/Libraries/LibWeb/DOM/EventTarget.h index c0098efc47..3cef8cd7f3 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.h +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.h @@ -86,4 +86,6 @@ private: JS::ThrowCompletionOr process_event_handler_for_event(FlyString const& name, Event& event); }; +bool is_window_reflecting_body_element_event_handler(FlyString const& name); + } diff --git a/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.cpp b/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.cpp index 78e72e7d90..c45a016023 100644 --- a/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.cpp +++ b/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.cpp @@ -16,14 +16,14 @@ namespace Web::HTML { #undef __ENUMERATE -#define __ENUMERATE(attribute_name, event_name) \ - void GlobalEventHandlers::set_##attribute_name(Optional value) \ - { \ - global_event_handlers_to_event_target().set_event_handler_attribute(event_name, move(value)); \ - } \ - Bindings::CallbackType* GlobalEventHandlers::attribute_name() \ - { \ - return global_event_handlers_to_event_target().event_handler_attribute(event_name); \ +#define __ENUMERATE(attribute_name, event_name) \ + void GlobalEventHandlers::set_##attribute_name(Optional value) \ + { \ + global_event_handlers_to_event_target(event_name).set_event_handler_attribute(event_name, move(value)); \ + } \ + Bindings::CallbackType* GlobalEventHandlers::attribute_name() \ + { \ + return global_event_handlers_to_event_target(event_name).event_handler_attribute(event_name); \ } ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE) #undef __ENUMERATE diff --git a/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.h b/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.h index 7fad45cc29..facdc97a23 100644 --- a/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.h +++ b/Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.h @@ -91,7 +91,7 @@ public: #undef __ENUMERATE protected: - virtual DOM::EventTarget& global_event_handlers_to_event_target() = 0; + virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) = 0; }; } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.cpp index ad0d688c6f..b3b64a6625 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.cpp @@ -57,10 +57,14 @@ void HTMLBodyElement::parse_attribute(FlyString const& name, String const& value } } -DOM::EventTarget& HTMLBodyElement::global_event_handlers_to_event_target() +DOM::EventTarget& HTMLBodyElement::global_event_handlers_to_event_target(FlyString const& event_name) { // NOTE: This is a little weird, but IIUC document.body.onload actually refers to window.onload - return document().window(); + // NOTE: document.body can return either a HTMLBodyElement or HTMLFrameSetElement, so both these elements must support this mapping. + if (DOM::is_window_reflecting_body_element_event_handler(event_name)) + return document().window(); + + return *this; } } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h b/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h index 2aef6df4d5..21e9b3a2ef 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h @@ -22,7 +22,7 @@ public: private: // ^HTML::GlobalEventHandlers - virtual EventTarget& global_event_handlers_to_event_target() override; + virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override; RefPtr m_background_style_value; }; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLElement.h b/Userland/Libraries/LibWeb/HTML/HTMLElement.h index c4f0ba8bfc..694a3630bc 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLElement.h @@ -54,7 +54,7 @@ protected: private: // ^HTML::GlobalEventHandlers - virtual DOM::EventTarget& global_event_handlers_to_event_target() override { return *this; } + virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; } enum class ContentEditableState { True, diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.cpp index 7e793918b6..50aa75edf9 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.cpp @@ -14,4 +14,15 @@ HTMLFrameSetElement::HTMLFrameSetElement(DOM::Document& document, DOM::Qualified } HTMLFrameSetElement::~HTMLFrameSetElement() = default; + +DOM::EventTarget& HTMLFrameSetElement::global_event_handlers_to_event_target(FlyString const& event_name) +{ + // NOTE: This is a little weird, but IIUC document.body.onload actually refers to window.onload + // NOTE: document.body can return either a HTMLBodyElement or HTMLFrameSetElement, so both these elements must support this mapping. + if (DOM::is_window_reflecting_body_element_event_handler(event_name)) + return document().window(); + + return *this; +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.h b/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.h index 998bb60637..e6170a5607 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.h @@ -17,6 +17,10 @@ public: HTMLFrameSetElement(DOM::Document&, DOM::QualifiedName); virtual ~HTMLFrameSetElement() override; + +private: + // ^HTML::GlobalEventHandlers + virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override; }; } diff --git a/Userland/Libraries/LibWeb/HTML/Window.h b/Userland/Libraries/LibWeb/HTML/Window.h index 52aa16fe03..df4b56fa9b 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.h +++ b/Userland/Libraries/LibWeb/HTML/Window.h @@ -128,7 +128,7 @@ private: explicit Window(DOM::Document&); // ^HTML::GlobalEventHandlers - virtual DOM::EventTarget& global_event_handlers_to_event_target() override { return *this; } + virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; } enum class Repeat { Yes,