Kaynağa Gözat

LibWeb: Make DOM::Window into an EventTarget

This will allow us to dispatch window events.
Andreas Kling 4 yıl önce
ebeveyn
işleme
b92bc9c6e5
2 değiştirilmiş dosya ile 26 ekleme ve 2 silme
  1. 14 1
      Libraries/LibWeb/DOM/Window.cpp
  2. 12 1
      Libraries/LibWeb/DOM/Window.h

+ 14 - 1
Libraries/LibWeb/DOM/Window.cpp

@@ -28,6 +28,8 @@
 #include <LibGUI/MessageBox.h>
 #include <LibJS/Runtime/Function.h>
 #include <LibWeb/DOM/Document.h>
+#include <LibWeb/DOM/Event.h>
+#include <LibWeb/DOM/EventDispatcher.h>
 #include <LibWeb/DOM/Timer.h>
 #include <LibWeb/DOM/Window.h>
 #include <LibWeb/HighResolutionTime/Performance.h>
@@ -42,7 +44,8 @@ NonnullRefPtr<Window> Window::create_with_document(Document& document)
 }
 
 Window::Window(Document& document)
-    : m_document(document)
+    : EventTarget(static_cast<Bindings::ScriptExecutionContext&>(document))
+    , m_document(document)
     , m_performance(make<HighResolutionTime::Performance>(*this))
 {
 }
@@ -157,4 +160,14 @@ void Window::did_call_location_reload(Badge<Bindings::LocationObject>)
     frame->loader().load(document().url(), FrameLoader::Type::Reload);
 }
 
+void Window::dispatch_event(NonnullRefPtr<Event> event)
+{
+    EventDispatcher::dispatch(*this, event);
+}
+
+Bindings::EventTargetWrapper* Window::create_wrapper(JS::GlobalObject&)
+{
+    ASSERT_NOT_REACHED();
+}
+
 }

+ 12 - 1
Libraries/LibWeb/DOM/Window.h

@@ -32,14 +32,25 @@
 #include <AK/RefPtr.h>
 #include <LibWeb/Bindings/WindowObject.h>
 #include <LibWeb/Bindings/Wrappable.h>
+#include <LibWeb/DOM/EventTarget.h>
 
 namespace Web::DOM {
 
-class Window : public RefCounted<Window> {
+class Window final
+    : public RefCounted<Window>
+    , public EventTarget {
 public:
     static NonnullRefPtr<Window> create_with_document(Document&);
     ~Window();
 
+    using RefCounted::ref;
+    using RefCounted::unref;
+
+    virtual void ref_event_target() override { RefCounted::ref(); }
+    virtual void unref_event_target() override { RefCounted::unref(); }
+    virtual void dispatch_event(NonnullRefPtr<Event>) override;
+    virtual Bindings::EventTargetWrapper* create_wrapper(JS::GlobalObject&) override;
+
     const Document& document() const { return m_document; }
     Document& document() { return m_document; }