diff --git a/Userland/Libraries/LibWeb/CSS/MediaQueryList.cpp b/Userland/Libraries/LibWeb/CSS/MediaQueryList.cpp index 43f5695d91..0af48b7676 100644 --- a/Userland/Libraries/LibWeb/CSS/MediaQueryList.cpp +++ b/Userland/Libraries/LibWeb/CSS/MediaQueryList.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace Web::CSS { @@ -46,4 +47,27 @@ JS::Object* MediaQueryList::create_wrapper(JS::GlobalObject& global_object) return wrap(global_object, *this); } +// https://www.w3.org/TR/cssom-view/#dom-mediaquerylist-addlistener +void MediaQueryList::add_listener(RefPtr listener) +{ + // 1. If listener is null, terminate these steps. + if (!listener) + return; + + // 2. Append an event listener to the associated list of event listeners with type set to change, + // callback set to listener, and capture set to false, unless there already is an event listener + // in that list with the same type, callback, and capture. + // (NOTE: capture is set to false by default) + add_event_listener(HTML::EventNames::change, listener); +} + +// https://www.w3.org/TR/cssom-view/#dom-mediaquerylist-removelistener +void MediaQueryList::remove_listener(RefPtr listener) +{ + // 1. Remove an event listener from the associated list of event listeners, whose type is change, callback is listener, and capture is false. + // NOTE: While the spec doesn't technically use remove_event_listener and instead manipulates the list directly, every major engine uses remove_event_listener. + // This means if an event listener removes another event listener that comes after it, the removed event listener will not be invoked. + remove_event_listener(HTML::EventNames::change, listener); +} + } diff --git a/Userland/Libraries/LibWeb/CSS/MediaQueryList.h b/Userland/Libraries/LibWeb/CSS/MediaQueryList.h index 67aa0c4e6f..7d503a7d3b 100644 --- a/Userland/Libraries/LibWeb/CSS/MediaQueryList.h +++ b/Userland/Libraries/LibWeb/CSS/MediaQueryList.h @@ -42,6 +42,9 @@ public: virtual bool dispatch_event(NonnullRefPtr) override; virtual JS::Object* create_wrapper(JS::GlobalObject&) override; + void add_listener(RefPtr listener); + void remove_listener(RefPtr listener); + private: MediaQueryList(DOM::Document&, String); diff --git a/Userland/Libraries/LibWeb/CSS/MediaQueryList.idl b/Userland/Libraries/LibWeb/CSS/MediaQueryList.idl index d714211554..d5cb27209a 100644 --- a/Userland/Libraries/LibWeb/CSS/MediaQueryList.idl +++ b/Userland/Libraries/LibWeb/CSS/MediaQueryList.idl @@ -3,7 +3,7 @@ interface MediaQueryList : EventTarget { readonly attribute CSSOMString media; readonly attribute boolean matches; // TODO: - // undefined addListener(EventListener? callback); - // undefined removeListener(EventListener? callback); + undefined addListener(EventListener? callback); + undefined removeListener(EventListener? callback); // attribute EventHandler onchange; };