Просмотр исходного кода

LibWeb: Implement WindowEventHandlers

Luke Wilde 3 лет назад
Родитель
Сommit
3fe66bddf4

+ 3 - 1
Userland/Libraries/LibWeb/Bindings/WindowObject.cpp

@@ -137,10 +137,11 @@ void WindowObject::initialize_global_object()
     // WebAssembly "namespace"
     // WebAssembly "namespace"
     define_direct_property("WebAssembly", heap().allocate<WebAssemblyObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable);
     define_direct_property("WebAssembly", heap().allocate<WebAssemblyObject>(*this, *this), JS::Attribute::Enumerable | JS::Attribute::Configurable);
 
 
-    // HTML::GlobalEventHandlers
+    // HTML::GlobalEventHandlers and HTML::WindowEventHandlers
 #define __ENUMERATE(attribute, event_name) \
 #define __ENUMERATE(attribute, event_name) \
     define_native_accessor(#attribute, attribute##_getter, attribute##_setter, attr);
     define_native_accessor(#attribute, attribute##_getter, attribute##_setter, attr);
     ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE);
     ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE);
+    ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE);
 #undef __ENUMERATE
 #undef __ENUMERATE
 
 
     ADD_WINDOW_OBJECT_INTERFACES;
     ADD_WINDOW_OBJECT_INTERFACES;
@@ -719,6 +720,7 @@ JS_DEFINE_NATIVE_FUNCTION(WindowObject::name_setter)
         return JS::js_undefined();                                                                                         \
         return JS::js_undefined();                                                                                         \
     }
     }
 ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE)
 ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE)
+ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE)
 #undef __ENUMERATE
 #undef __ENUMERATE
 
 
 }
 }

+ 2 - 0
Userland/Libraries/LibWeb/Bindings/WindowObject.h

@@ -17,6 +17,7 @@
 #include <LibWeb/Bindings/CrossOriginAbstractOperations.h>
 #include <LibWeb/Bindings/CrossOriginAbstractOperations.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/Forward.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
+#include <LibWeb/HTML/WindowEventHandlers.h>
 
 
 namespace Web {
 namespace Web {
 namespace Bindings {
 namespace Bindings {
@@ -140,6 +141,7 @@ private:
     JS_DECLARE_NATIVE_FUNCTION(attribute##_getter); \
     JS_DECLARE_NATIVE_FUNCTION(attribute##_getter); \
     JS_DECLARE_NATIVE_FUNCTION(attribute##_setter);
     JS_DECLARE_NATIVE_FUNCTION(attribute##_setter);
     ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE);
     ENUMERATE_GLOBAL_EVENT_HANDLERS(__ENUMERATE);
+    ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE);
 #undef __ENUMERATE
 #undef __ENUMERATE
 
 
     NonnullRefPtr<HTML::Window> m_impl;
     NonnullRefPtr<HTML::Window> m_impl;

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -226,6 +226,7 @@ set(SOURCES
     HTML/TextMetrics.cpp
     HTML/TextMetrics.cpp
     HTML/Timer.cpp
     HTML/Timer.cpp
     HTML/Window.cpp
     HTML/Window.cpp
+    HTML/WindowEventHandlers.cpp
     HTML/Worker.cpp
     HTML/Worker.cpp
     HTML/WorkerDebugConsoleClient.cpp
     HTML/WorkerDebugConsoleClient.cpp
     HTML/WorkerGlobalScope.cpp
     HTML/WorkerGlobalScope.cpp

+ 23 - 0
Userland/Libraries/LibWeb/DOM/EventHandler.idl

@@ -6,6 +6,10 @@ typedef EventHandlerNonNull? EventHandler;
 callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error);
 callback OnErrorEventHandlerNonNull = any ((Event or DOMString) event, optional DOMString source, optional unsigned long lineno, optional unsigned long colno, optional any error);
 typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
 typedef OnErrorEventHandlerNonNull? OnErrorEventHandler;
 
 
+[LegacyTreatNonObjectAsNull]
+callback OnBeforeUnloadEventHandlerNonNull = DOMString? (Event event);
+typedef OnBeforeUnloadEventHandlerNonNull? OnBeforeUnloadEventHandler;
+
 interface mixin GlobalEventHandlers {
 interface mixin GlobalEventHandlers {
     attribute EventHandler onabort;
     attribute EventHandler onabort;
     attribute EventHandler onauxclick;
     attribute EventHandler onauxclick;
@@ -77,3 +81,22 @@ interface mixin GlobalEventHandlers {
     attribute EventHandler onwebkittransitionend;
     attribute EventHandler onwebkittransitionend;
     attribute EventHandler onwheel;
     attribute EventHandler onwheel;
 };
 };
+
+interface mixin WindowEventHandlers {
+    attribute EventHandler onafterprint;
+    attribute EventHandler onbeforeprint;
+    attribute OnBeforeUnloadEventHandler onbeforeunload;
+    attribute EventHandler onhashchange;
+    attribute EventHandler onlanguagechange;
+    attribute EventHandler onmessage;
+    attribute EventHandler onmessageerror;
+    attribute EventHandler onoffline;
+    attribute EventHandler ononline;
+    attribute EventHandler onpagehide;
+    attribute EventHandler onpageshow;
+    attribute EventHandler onpopstate;
+    attribute EventHandler onrejectionhandled;
+    attribute EventHandler onstorage;
+    attribute EventHandler onunhandledrejection;
+    attribute EventHandler onunload;
+};

+ 16 - 0
Userland/Libraries/LibWeb/HTML/AttributeNames.h

@@ -98,7 +98,10 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(novalidate)                 \
     __ENUMERATE_HTML_ATTRIBUTE(novalidate)                 \
     __ENUMERATE_HTML_ATTRIBUTE(nowrap)                     \
     __ENUMERATE_HTML_ATTRIBUTE(nowrap)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onabort)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onabort)                    \
+    __ENUMERATE_HTML_ATTRIBUTE(onafterprint)               \
     __ENUMERATE_HTML_ATTRIBUTE(onauxclick)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onauxclick)                 \
+    __ENUMERATE_HTML_ATTRIBUTE(onbeforeprint)              \
+    __ENUMERATE_HTML_ATTRIBUTE(onbeforeunload)             \
     __ENUMERATE_HTML_ATTRIBUTE(onblur)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onblur)                     \
     __ENUMERATE_HTML_ATTRIBUTE(oncancel)                   \
     __ENUMERATE_HTML_ATTRIBUTE(oncancel)                   \
     __ENUMERATE_HTML_ATTRIBUTE(oncanplay)                  \
     __ENUMERATE_HTML_ATTRIBUTE(oncanplay)                  \
@@ -122,15 +125,19 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(onerror)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onerror)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onfocus)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onfocus)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onformdata)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onformdata)                 \
+    __ENUMERATE_HTML_ATTRIBUTE(onhashchange)               \
     __ENUMERATE_HTML_ATTRIBUTE(oninput)                    \
     __ENUMERATE_HTML_ATTRIBUTE(oninput)                    \
     __ENUMERATE_HTML_ATTRIBUTE(oninvalid)                  \
     __ENUMERATE_HTML_ATTRIBUTE(oninvalid)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onkeydown)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onkeydown)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onkeypress)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onkeypress)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onkeyup)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onkeyup)                    \
+    __ENUMERATE_HTML_ATTRIBUTE(onlanguagechange)           \
     __ENUMERATE_HTML_ATTRIBUTE(onload)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onload)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onloadeddata)               \
     __ENUMERATE_HTML_ATTRIBUTE(onloadeddata)               \
     __ENUMERATE_HTML_ATTRIBUTE(onloadedmetadata)           \
     __ENUMERATE_HTML_ATTRIBUTE(onloadedmetadata)           \
     __ENUMERATE_HTML_ATTRIBUTE(onloadstart)                \
     __ENUMERATE_HTML_ATTRIBUTE(onloadstart)                \
+    __ENUMERATE_HTML_ATTRIBUTE(onmessage)                  \
+    __ENUMERATE_HTML_ATTRIBUTE(onmessageerror)             \
     __ENUMERATE_HTML_ATTRIBUTE(onmousedown)                \
     __ENUMERATE_HTML_ATTRIBUTE(onmousedown)                \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseenter)               \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseenter)               \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseleave)               \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseleave)               \
@@ -138,11 +145,17 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(onmouseout)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseout)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseover)                \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseover)                \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseup)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onmouseup)                  \
+    __ENUMERATE_HTML_ATTRIBUTE(onoffline)                  \
+    __ENUMERATE_HTML_ATTRIBUTE(ononline)                   \
+    __ENUMERATE_HTML_ATTRIBUTE(onpagehide)                 \
+    __ENUMERATE_HTML_ATTRIBUTE(onpageshow)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onpause)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onpause)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onplay)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onplay)                     \
     __ENUMERATE_HTML_ATTRIBUTE(onplaying)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onplaying)                  \
+    __ENUMERATE_HTML_ATTRIBUTE(onpopstate)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onprogress)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onprogress)                 \
     __ENUMERATE_HTML_ATTRIBUTE(onratechange)               \
     __ENUMERATE_HTML_ATTRIBUTE(onratechange)               \
+    __ENUMERATE_HTML_ATTRIBUTE(onrejectionhandled)         \
     __ENUMERATE_HTML_ATTRIBUTE(onreset)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onreset)                    \
     __ENUMERATE_HTML_ATTRIBUTE(onresize)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onresize)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onscroll)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onscroll)                   \
@@ -152,10 +165,13 @@ namespace AttributeNames {
     __ENUMERATE_HTML_ATTRIBUTE(onselect)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onselect)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onslotchange)               \
     __ENUMERATE_HTML_ATTRIBUTE(onslotchange)               \
     __ENUMERATE_HTML_ATTRIBUTE(onstalled)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onstalled)                  \
+    __ENUMERATE_HTML_ATTRIBUTE(onstorage)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onsubmit)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onsubmit)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onsuspend)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onsuspend)                  \
     __ENUMERATE_HTML_ATTRIBUTE(ontimeupdate)               \
     __ENUMERATE_HTML_ATTRIBUTE(ontimeupdate)               \
     __ENUMERATE_HTML_ATTRIBUTE(ontoggle)                   \
     __ENUMERATE_HTML_ATTRIBUTE(ontoggle)                   \
+    __ENUMERATE_HTML_ATTRIBUTE(onunhandledrejection)       \
+    __ENUMERATE_HTML_ATTRIBUTE(onunload)                   \
     __ENUMERATE_HTML_ATTRIBUTE(onvolumechange)             \
     __ENUMERATE_HTML_ATTRIBUTE(onvolumechange)             \
     __ENUMERATE_HTML_ATTRIBUTE(onwaiting)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onwaiting)                  \
     __ENUMERATE_HTML_ATTRIBUTE(onwebkitanimationend)       \
     __ENUMERATE_HTML_ATTRIBUTE(onwebkitanimationend)       \

+ 1 - 5
Userland/Libraries/LibWeb/HTML/GlobalEventHandlers.cpp

@@ -4,11 +4,7 @@
  * SPDX-License-Identifier: BSD-2-Clause
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
-#include <LibJS/Interpreter.h>
-#include <LibJS/Parser.h>
-#include <LibWeb/DOM/Document.h>
-#include <LibWeb/DOM/IDLEventListener.h>
-#include <LibWeb/HTML/EventHandler.h>
+#include <LibWeb/DOM/EventTarget.h>
 #include <LibWeb/HTML/EventNames.h>
 #include <LibWeb/HTML/EventNames.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
 #include <LibWeb/UIEvents/EventNames.h>
 #include <LibWeb/UIEvents/EventNames.h>

+ 15 - 0
Userland/Libraries/LibWeb/HTML/HTMLBodyElement.cpp

@@ -55,6 +55,14 @@ void HTMLBodyElement::parse_attribute(FlyString const& name, String const& value
     } else if (name.equals_ignoring_case("background")) {
     } else if (name.equals_ignoring_case("background")) {
         m_background_style_value = CSS::ImageStyleValue::create(document().parse_url(value));
         m_background_style_value = CSS::ImageStyleValue::create(document().parse_url(value));
     }
     }
+
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name)                     \
+    if (name == HTML::AttributeNames::attribute_name) {             \
+        element_event_handler_attribute_changed(event_name, value); \
+    }
+    ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
 }
 }
 
 
 DOM::EventTarget& HTMLBodyElement::global_event_handlers_to_event_target(FlyString const& event_name)
 DOM::EventTarget& HTMLBodyElement::global_event_handlers_to_event_target(FlyString const& event_name)
@@ -67,4 +75,11 @@ DOM::EventTarget& HTMLBodyElement::global_event_handlers_to_event_target(FlyStri
     return *this;
     return *this;
 }
 }
 
 
+DOM::EventTarget& HTMLBodyElement::window_event_handlers_to_event_target()
+{
+    // All WindowEventHandlers on HTMLFrameSetElement (e.g. document.body.onrejectionhandled) are mapped to window.on{event}.
+    // NOTE: document.body can return either a HTMLBodyElement or HTMLFrameSetElement, so both these elements must support this mapping.
+    return document().window();
+}
+
 }
 }

+ 7 - 1
Userland/Libraries/LibWeb/HTML/HTMLBodyElement.h

@@ -7,10 +7,13 @@
 #pragma once
 #pragma once
 
 
 #include <LibWeb/HTML/HTMLElement.h>
 #include <LibWeb/HTML/HTMLElement.h>
+#include <LibWeb/HTML/WindowEventHandlers.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
-class HTMLBodyElement final : public HTMLElement {
+class HTMLBodyElement final
+    : public HTMLElement
+    , public WindowEventHandlers {
 public:
 public:
     using WrapperType = Bindings::HTMLBodyElementWrapper;
     using WrapperType = Bindings::HTMLBodyElementWrapper;
 
 
@@ -24,6 +27,9 @@ private:
     // ^HTML::GlobalEventHandlers
     // ^HTML::GlobalEventHandlers
     virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override;
     virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override;
 
 
+    // ^HTML::WindowEventHandlers
+    virtual EventTarget& window_event_handlers_to_event_target() override;
+
     RefPtr<CSS::ImageStyleValue> m_background_style_value;
     RefPtr<CSS::ImageStyleValue> m_background_style_value;
 };
 };
 
 

+ 3 - 0
Userland/Libraries/LibWeb/HTML/HTMLBodyElement.idl

@@ -1,3 +1,4 @@
+#import <DOM/EventHandler.idl>
 #import <HTML/HTMLElement.idl>
 #import <HTML/HTMLElement.idl>
 
 
 interface HTMLBodyElement : HTMLElement {
 interface HTMLBodyElement : HTMLElement {
@@ -10,3 +11,5 @@ interface HTMLBodyElement : HTMLElement {
     [Reflect] attribute DOMString background;
     [Reflect] attribute DOMString background;
 
 
 };
 };
+
+HTMLBodyElement includes WindowEventHandlers;

+ 22 - 0
Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.cpp

@@ -4,7 +4,9 @@
  * SPDX-License-Identifier: BSD-2-Clause
  * SPDX-License-Identifier: BSD-2-Clause
  */
  */
 
 
+#include <LibWeb/DOM/Document.h>
 #include <LibWeb/HTML/HTMLFrameSetElement.h>
 #include <LibWeb/HTML/HTMLFrameSetElement.h>
+#include <LibWeb/HTML/Window.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
@@ -15,6 +17,19 @@ HTMLFrameSetElement::HTMLFrameSetElement(DOM::Document& document, DOM::Qualified
 
 
 HTMLFrameSetElement::~HTMLFrameSetElement() = default;
 HTMLFrameSetElement::~HTMLFrameSetElement() = default;
 
 
+void HTMLFrameSetElement::parse_attribute(FlyString const& name, String const& value)
+{
+    HTMLElement::parse_attribute(name, value);
+
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name)                     \
+    if (name == HTML::AttributeNames::attribute_name) {             \
+        element_event_handler_attribute_changed(event_name, value); \
+    }
+    ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
+}
+
 DOM::EventTarget& HTMLFrameSetElement::global_event_handlers_to_event_target(FlyString const& event_name)
 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: This is a little weird, but IIUC document.body.onload actually refers to window.onload
@@ -25,4 +40,11 @@ DOM::EventTarget& HTMLFrameSetElement::global_event_handlers_to_event_target(Fly
     return *this;
     return *this;
 }
 }
 
 
+DOM::EventTarget& HTMLFrameSetElement::window_event_handlers_to_event_target()
+{
+    // All WindowEventHandlers on HTMLFrameSetElement (e.g. document.body.onrejectionhandled) are mapped to window.on{event}.
+    // NOTE: document.body can return either a HTMLBodyElement or HTMLFrameSetElement, so both these elements must support this mapping.
+    return document().window();
+}
+
 }
 }

+ 9 - 1
Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.h

@@ -7,20 +7,28 @@
 #pragma once
 #pragma once
 
 
 #include <LibWeb/HTML/HTMLElement.h>
 #include <LibWeb/HTML/HTMLElement.h>
+#include <LibWeb/HTML/WindowEventHandlers.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
 // NOTE: This element is marked as obsolete, but is still listed as required by the specification.
 // NOTE: This element is marked as obsolete, but is still listed as required by the specification.
-class HTMLFrameSetElement final : public HTMLElement {
+class HTMLFrameSetElement final
+    : public HTMLElement
+    , public WindowEventHandlers {
 public:
 public:
     using WrapperType = Bindings::HTMLFrameSetElementWrapper;
     using WrapperType = Bindings::HTMLFrameSetElementWrapper;
 
 
     HTMLFrameSetElement(DOM::Document&, DOM::QualifiedName);
     HTMLFrameSetElement(DOM::Document&, DOM::QualifiedName);
     virtual ~HTMLFrameSetElement() override;
     virtual ~HTMLFrameSetElement() override;
 
 
+    virtual void parse_attribute(FlyString const&, String const&) override;
+
 private:
 private:
     // ^HTML::GlobalEventHandlers
     // ^HTML::GlobalEventHandlers
     virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override;
     virtual EventTarget& global_event_handlers_to_event_target(FlyString const& event_name) override;
+
+    // ^HTML::WindowEventHandlers
+    virtual EventTarget& window_event_handlers_to_event_target() override;
 };
 };
 
 
 }
 }

+ 3 - 0
Userland/Libraries/LibWeb/HTML/HTMLFrameSetElement.idl

@@ -1,3 +1,4 @@
+#import <DOM/EventHandler.idl>
 #import <HTML/HTMLElement.idl>
 #import <HTML/HTMLElement.idl>
 
 
 interface HTMLFrameSetElement : HTMLElement {
 interface HTMLFrameSetElement : HTMLElement {
@@ -6,3 +7,5 @@ interface HTMLFrameSetElement : HTMLElement {
     [Reflect] attribute DOMString rows;
     [Reflect] attribute DOMString rows;
 
 
 };
 };
+
+HTMLFrameSetElement includes WindowEventHandlers;

+ 6 - 1
Userland/Libraries/LibWeb/HTML/Window.h

@@ -21,6 +21,7 @@
 #include <LibWeb/HTML/AnimationFrameCallbackDriver.h>
 #include <LibWeb/HTML/AnimationFrameCallbackDriver.h>
 #include <LibWeb/HTML/BrowsingContext.h>
 #include <LibWeb/HTML/BrowsingContext.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
 #include <LibWeb/HTML/GlobalEventHandlers.h>
+#include <LibWeb/HTML/WindowEventHandlers.h>
 
 
 namespace Web::HTML {
 namespace Web::HTML {
 
 
@@ -30,7 +31,8 @@ class Window final
     : public RefCounted<Window>
     : public RefCounted<Window>
     , public Weakable<Window>
     , public Weakable<Window>
     , public DOM::EventTarget
     , public DOM::EventTarget
-    , public HTML::GlobalEventHandlers {
+    , public HTML::GlobalEventHandlers
+    , public HTML::WindowEventHandlers {
 public:
 public:
     static NonnullRefPtr<Window> create_with_document(DOM::Document&);
     static NonnullRefPtr<Window> create_with_document(DOM::Document&);
     ~Window();
     ~Window();
@@ -130,6 +132,9 @@ private:
     // ^HTML::GlobalEventHandlers
     // ^HTML::GlobalEventHandlers
     virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; }
     virtual DOM::EventTarget& global_event_handlers_to_event_target(FlyString const&) override { return *this; }
 
 
+    // ^HTML::WindowEventHandlers
+    virtual DOM::EventTarget& window_event_handlers_to_event_target() override { return *this; }
+
     enum class Repeat {
     enum class Repeat {
         Yes,
         Yes,
         No,
         No,

+ 28 - 0
Userland/Libraries/LibWeb/HTML/WindowEventHandlers.cpp

@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/DOM/EventTarget.h>
+#include <LibWeb/HTML/EventNames.h>
+#include <LibWeb/HTML/WindowEventHandlers.h>
+
+namespace Web::HTML {
+
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name)                                                       \
+    void WindowEventHandlers::set_##attribute_name(Optional<Bindings::CallbackType> value)            \
+    {                                                                                                 \
+        window_event_handlers_to_event_target().set_event_handler_attribute(event_name, move(value)); \
+    }                                                                                                 \
+    Bindings::CallbackType* WindowEventHandlers::attribute_name()                                     \
+    {                                                                                                 \
+        return window_event_handlers_to_event_target().event_handler_attribute(event_name);           \
+    }
+ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
+
+WindowEventHandlers::~WindowEventHandlers() = default;
+
+}

+ 47 - 0
Userland/Libraries/LibWeb/HTML/WindowEventHandlers.h

@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2022, Luke Wilde <lukew@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/Forward.h>
+#include <LibWeb/Forward.h>
+
+#define ENUMERATE_WINDOW_EVENT_HANDLERS(E)                        \
+    E(onafterprint, HTML::EventNames::afterprint)                 \
+    E(onbeforeprint, HTML::EventNames::beforeprint)               \
+    E(onbeforeunload, HTML::EventNames::beforeunload)             \
+    E(onhashchange, HTML::EventNames::hashchange)                 \
+    E(onlanguagechange, HTML::EventNames::languagechange)         \
+    E(onmessage, HTML::EventNames::message)                       \
+    E(onmessageerror, HTML::EventNames::messageerror)             \
+    E(onoffline, HTML::EventNames::offline)                       \
+    E(ononline, HTML::EventNames::online)                         \
+    E(onpagehide, HTML::EventNames::pagehide)                     \
+    E(onpageshow, HTML::EventNames::pageshow)                     \
+    E(onpopstate, HTML::EventNames::popstate)                     \
+    E(onrejectionhandled, HTML::EventNames::rejectionhandled)     \
+    E(onstorage, HTML::EventNames::storage)                       \
+    E(onunhandledrejection, HTML::EventNames::unhandledrejection) \
+    E(onunload, HTML::EventNames::unload)
+
+namespace Web::HTML {
+
+class WindowEventHandlers {
+public:
+    virtual ~WindowEventHandlers();
+
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name)                  \
+    void set_##attribute_name(Optional<Bindings::CallbackType>); \
+    Bindings::CallbackType* attribute_name();
+    ENUMERATE_WINDOW_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
+
+protected:
+    virtual DOM::EventTarget& window_event_handlers_to_event_target() = 0;
+};
+
+}