From 3440d2b843331fca7392d29ea1b776935d1310de Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Sun, 1 Sep 2024 12:52:14 +0100 Subject: [PATCH] LibWeb: Implement AbstractWorker This effectively implements Worker.onerror, and in future SharedWorker.onerror. --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../Libraries/LibWeb/HTML/AbstractWorker.cpp | 25 +++++++++++++++++++ .../Libraries/LibWeb/HTML/AbstractWorker.h | 25 +++++++++++++++++++ .../Libraries/LibWeb/HTML/AbstractWorker.idl | 4 +++ Userland/Libraries/LibWeb/HTML/Worker.h | 8 +++++- Userland/Libraries/LibWeb/HTML/Worker.idl | 3 +++ 6 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 Userland/Libraries/LibWeb/HTML/AbstractWorker.cpp create mode 100644 Userland/Libraries/LibWeb/HTML/AbstractWorker.h create mode 100644 Userland/Libraries/LibWeb/HTML/AbstractWorker.idl diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index bb8943c4da6..7d899cf6d19 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -258,6 +258,7 @@ set(SOURCES Geometry/DOMRect.cpp Geometry/DOMRectList.cpp Geometry/DOMRectReadOnly.cpp + HTML/AbstractWorker.cpp HTML/AnimatedBitmapDecodedImageData.cpp HTML/AttributeNames.cpp HTML/AudioTrack.cpp diff --git a/Userland/Libraries/LibWeb/HTML/AbstractWorker.cpp b/Userland/Libraries/LibWeb/HTML/AbstractWorker.cpp new file mode 100644 index 00000000000..de57348fa5a --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/AbstractWorker.cpp @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::HTML { + +// https://html.spec.whatwg.org/multipage/workers.html#handler-abstractworker-onerror +WebIDL::CallbackType* AbstractWorker::onerror() +{ + return this_event_target().event_handler_attribute(HTML::EventNames::error); +} + +// https://html.spec.whatwg.org/multipage/workers.html#handler-abstractworker-onerror +void AbstractWorker::set_onerror(WebIDL::CallbackType* event_handler) +{ + this_event_target().set_event_handler_attribute(HTML::EventNames::error, event_handler); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/AbstractWorker.h b/Userland/Libraries/LibWeb/HTML/AbstractWorker.h new file mode 100644 index 00000000000..8db179252d6 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/AbstractWorker.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::HTML { + +// https://html.spec.whatwg.org/multipage/workers.html#abstractworker +class AbstractWorker { +public: + virtual ~AbstractWorker() = default; + + WebIDL::CallbackType* onerror(); + void set_onerror(WebIDL::CallbackType*); + +protected: + virtual DOM::EventTarget& this_event_target() = 0; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/AbstractWorker.idl b/Userland/Libraries/LibWeb/HTML/AbstractWorker.idl new file mode 100644 index 00000000000..d91221e1341 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/AbstractWorker.idl @@ -0,0 +1,4 @@ +// https://html.spec.whatwg.org/multipage/workers.html#abstractworker +interface mixin AbstractWorker { + attribute EventHandler onerror; +}; diff --git a/Userland/Libraries/LibWeb/HTML/Worker.h b/Userland/Libraries/LibWeb/HTML/Worker.h index 2057bf5da42..e67aa8da688 100644 --- a/Userland/Libraries/LibWeb/HTML/Worker.h +++ b/Userland/Libraries/LibWeb/HTML/Worker.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -27,7 +28,9 @@ namespace Web::HTML { // https://html.spec.whatwg.org/multipage/workers.html#dedicated-workers-and-the-worker-interface -class Worker : public DOM::EventTarget { +class Worker + : public DOM::EventTarget + , public HTML::AbstractWorker { WEB_PLATFORM_OBJECT(Worker, DOM::EventTarget); JS_DECLARE_ALLOCATOR(Worker); @@ -57,6 +60,9 @@ public: protected: Worker(String const&, WorkerOptions const&, DOM::Document&); + // ^AbstractWorker + virtual DOM::EventTarget& this_event_target() override { return *this; } + private: virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; diff --git a/Userland/Libraries/LibWeb/HTML/Worker.idl b/Userland/Libraries/LibWeb/HTML/Worker.idl index e5cb4a85e07..b439406b6e7 100644 --- a/Userland/Libraries/LibWeb/HTML/Worker.idl +++ b/Userland/Libraries/LibWeb/HTML/Worker.idl @@ -1,5 +1,6 @@ #import #import +#import #import // https://html.spec.whatwg.org/#worker @@ -21,3 +22,5 @@ dictionary WorkerOptions { USVString credentials = "same-origin"; DOMString name = ""; }; + +Worker includes AbstractWorker;