Browse Source

LibWeb: Implement AbstractWorker

This effectively implements Worker.onerror, and in future
SharedWorker.onerror.
Jamie Mansfield 11 months ago
parent
commit
3440d2b843

+ 1 - 0
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

+ 25 - 0
Userland/Libraries/LibWeb/HTML/AbstractWorker.cpp

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/DOM/EventTarget.h>
+#include <LibWeb/HTML/AbstractWorker.h>
+#include <LibWeb/HTML/EventNames.h>
+
+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);
+}
+
+}

+ 25 - 0
Userland/Libraries/LibWeb/HTML/AbstractWorker.h

@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024, Jamie Mansfield <jmansfield@cadixdev.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/DOM/EventTarget.h>
+
+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;
+};
+
+}

+ 4 - 0
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;
+};

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

@@ -10,6 +10,7 @@
 #include <LibURL/Parser.h>
 #include <LibWeb/Bindings/MainThreadVM.h>
 #include <LibWeb/Forward.h>
+#include <LibWeb/HTML/AbstractWorker.h>
 #include <LibWeb/HTML/MessageEvent.h>
 #include <LibWeb/HTML/MessagePort.h>
 #include <LibWeb/HTML/Scripting/ClassicScript.h>
@@ -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;

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

@@ -1,5 +1,6 @@
 #import <DOM/EventTarget.idl>
 #import <DOM/EventHandler.idl>
+#import <HTML/AbstractWorker.idl>
 #import <HTML/MessagePort.idl>
 
 // https://html.spec.whatwg.org/#worker
@@ -21,3 +22,5 @@ dictionary WorkerOptions {
     USVString credentials = "same-origin";
     DOMString name = "";
 };
+
+Worker includes AbstractWorker;