瀏覽代碼

LibWeb: Implement MediaQueryList.{addListener,removeListener}

Luke Wilde 3 年之前
父節點
當前提交
e946316618

+ 24 - 0
Userland/Libraries/LibWeb/CSS/MediaQueryList.cpp

@@ -8,6 +8,7 @@
 #include <LibWeb/CSS/MediaQueryList.h>
 #include <LibWeb/DOM/Document.h>
 #include <LibWeb/DOM/EventDispatcher.h>
+#include <LibWeb/DOM/EventListener.h>
 
 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<DOM::EventListener> 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<DOM::EventListener> 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);
+}
+
 }

+ 3 - 0
Userland/Libraries/LibWeb/CSS/MediaQueryList.h

@@ -42,6 +42,9 @@ public:
     virtual bool dispatch_event(NonnullRefPtr<DOM::Event>) override;
     virtual JS::Object* create_wrapper(JS::GlobalObject&) override;
 
+    void add_listener(RefPtr<DOM::EventListener> listener);
+    void remove_listener(RefPtr<DOM::EventListener> listener);
+
 private:
     MediaQueryList(DOM::Document&, String);
 

+ 2 - 2
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;
 };