From ebf21846369745618e3749fb3c111bf354b0abf7 Mon Sep 17 00:00:00 2001 From: Luke Wilde Date: Mon, 27 Jun 2022 19:20:09 +0100 Subject: [PATCH] LibWeb: Only make certain and events apply to Window Previously we forwarded all event handler attributes to Window from these two elements, however, we are only supposed to forward blur, error, focus, load, resize and scroll. --- Userland/Libraries/LibWeb/DOM/Document.h | 2 +- Userland/Libraries/LibWeb/DOM/EventTarget.cpp | 2 +- Userland/Libraries/LibWeb/DOM/EventTarget.h | 2 ++ .../LibWeb/HTML/GlobalEventHandlers.cpp | 16 ++++++++-------- .../Libraries/LibWeb/HTML/GlobalEventHandlers.h | 2 +- .../Libraries/LibWeb/HTML/HTMLBodyElement.cpp | 8 ++++++-- Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h | 2 +- Userland/Libraries/LibWeb/HTML/HTMLElement.h | 2 +- .../LibWeb/HTML/HTMLFrameSetElement.cpp | 11 +++++++++++ .../Libraries/LibWeb/HTML/HTMLFrameSetElement.h | 4 ++++ Userland/Libraries/LibWeb/HTML/Window.h | 2 +- 11 files changed, 37 insertions(+), 16 deletions(-) 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,