diff --git a/Userland/Libraries/LibWeb/HTML/EventNames.h b/Userland/Libraries/LibWeb/HTML/EventNames.h
index dda9ee49aa5..a061c0f31cb 100644
--- a/Userland/Libraries/LibWeb/HTML/EventNames.h
+++ b/Userland/Libraries/LibWeb/HTML/EventNames.h
@@ -34,6 +34,7 @@ namespace Web::HTML::EventNames {
__ENUMERATE_HTML_EVENT(close) \
__ENUMERATE_HTML_EVENT(complete) \
__ENUMERATE_HTML_EVENT(connect) \
+ __ENUMERATE_HTML_EVENT(controllerchange) \
__ENUMERATE_HTML_EVENT(contextmenu) \
__ENUMERATE_HTML_EVENT(copy) \
__ENUMERATE_HTML_EVENT(cuechange) \
diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.cpp b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.cpp
index 7f0f0c622c2..1f8d6b56a1c 100644
--- a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.cpp
+++ b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.cpp
@@ -31,28 +31,17 @@ JS::NonnullGCPtr ServiceWorkerContainer::create(JS::Real
return realm.heap().allocate(realm, realm);
}
-// https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessage
-WebIDL::CallbackType* ServiceWorkerContainer::onmessage()
-{
- return event_handler_attribute(HTML::EventNames::message);
-}
-
-// https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessage
-void ServiceWorkerContainer::set_onmessage(WebIDL::CallbackType* event_handler)
-{
- set_event_handler_attribute(HTML::EventNames::message, event_handler);
-}
-
-// https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessageerror
-WebIDL::CallbackType* ServiceWorkerContainer::onmessageerror()
-{
- return event_handler_attribute(HTML::EventNames::messageerror);
-}
-
-// https://w3c.github.io/ServiceWorker/#dom-serviceworkercontainer-onmessageerror
-void ServiceWorkerContainer::set_onmessageerror(WebIDL::CallbackType* event_handler)
-{
- set_event_handler_attribute(HTML::EventNames::messageerror, event_handler);
-}
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name) \
+ void ServiceWorkerContainer::set_##attribute_name(WebIDL::CallbackType* value) \
+ { \
+ set_event_handler_attribute(event_name, move(value)); \
+ } \
+ WebIDL::CallbackType* ServiceWorkerContainer::attribute_name() \
+ { \
+ return event_handler_attribute(event_name); \
+ }
+ENUMERATE_SERVICE_WORKER_CONTAINER_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
}
diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.h b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.h
index 164de1fc53a..eeb289b4bc8 100644
--- a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.h
+++ b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.h
@@ -9,6 +9,11 @@
#include
+#define ENUMERATE_SERVICE_WORKER_CONTAINER_EVENT_HANDLERS(E) \
+ E(oncontrollerchange, HTML::EventNames::controllerchange) \
+ E(onmessage, HTML::EventNames::message) \
+ E(onmessageerror, HTML::EventNames::messageerror)
+
namespace Web::HTML {
class ServiceWorkerContainer : public DOM::EventTarget {
@@ -19,10 +24,12 @@ public:
[[nodiscard]] static JS::NonnullGCPtr create(JS::Realm& realm);
virtual ~ServiceWorkerContainer() override = default;
- WebIDL::CallbackType* onmessage();
- void set_onmessage(WebIDL::CallbackType*);
- WebIDL::CallbackType* onmessageerror();
- void set_onmessageerror(WebIDL::CallbackType*);
+#undef __ENUMERATE
+#define __ENUMERATE(attribute_name, event_name) \
+ void set_##attribute_name(WebIDL::CallbackType*); \
+ WebIDL::CallbackType* attribute_name();
+ ENUMERATE_SERVICE_WORKER_CONTAINER_EVENT_HANDLERS(__ENUMERATE)
+#undef __ENUMERATE
private:
explicit ServiceWorkerContainer(JS::Realm&);
diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.idl b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.idl
index ecf5163dd7b..3884eb7d987 100644
--- a/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.idl
+++ b/Userland/Libraries/LibWeb/HTML/ServiceWorkerContainer.idl
@@ -17,7 +17,7 @@ interface ServiceWorkerContainer : EventTarget {
[FIXME] undefined startMessages();
// events
- [FIXME] attribute EventHandler oncontrollerchange;
+ attribute EventHandler oncontrollerchange;
attribute EventHandler onmessage; // event.source of message events is ServiceWorker object
attribute EventHandler onmessageerror;
};