瀏覽代碼

LibWeb: Introduce the FormDataEvent interface

Kenneth Myhra 2 年之前
父節點
當前提交
a6cdf6374f

+ 1 - 0
Userland/Libraries/LibWeb/CMakeLists.txt

@@ -186,6 +186,7 @@ set(SOURCES
     HTML/Focus.cpp
     HTML/FormAssociatedElement.cpp
     HTML/FormControlInfrastructure.cpp
+    HTML/FormDataEvent.cpp
     HTML/GlobalEventHandlers.cpp
     HTML/History.cpp
     HTML/HTMLAnchorElement.cpp

+ 1 - 0
Userland/Libraries/LibWeb/Forward.h

@@ -246,6 +246,7 @@ struct EnvironmentSettingsObject;
 class ErrorEvent;
 class EventHandler;
 class EventLoop;
+class FormDataEvent;
 class HTMLAnchorElement;
 class HTMLAreaElement;
 class HTMLAudioElement;

+ 40 - 0
Userland/Libraries/LibWeb/HTML/FormDataEvent.cpp

@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2023, Kenneth Myhra <kennethmyhra@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibWeb/Bindings/FormDataEventPrototype.h>
+#include <LibWeb/Bindings/Intrinsics.h>
+#include <LibWeb/HTML/FormDataEvent.h>
+
+namespace Web::HTML {
+
+WebIDL::ExceptionOr<JS::NonnullGCPtr<FormDataEvent>> FormDataEvent::construct_impl(JS::Realm& realm, DeprecatedString const& event_name, FormDataEventInit const& event_init)
+{
+    return MUST_OR_THROW_OOM(realm.heap().allocate<FormDataEvent>(realm, realm, event_name, event_init));
+}
+
+FormDataEvent::FormDataEvent(JS::Realm& realm, DeprecatedString const& event_name, FormDataEventInit const& event_init)
+    : DOM::Event(realm, event_name, event_init)
+    , m_form_data(event_init.form_data)
+{
+}
+
+FormDataEvent::~FormDataEvent() = default;
+
+JS::ThrowCompletionOr<void> FormDataEvent::initialize(JS::Realm& realm)
+{
+    MUST_OR_THROW_OOM(Base::initialize(realm));
+    set_prototype(&Bindings::ensure_web_prototype<Bindings::FormDataEventPrototype>(realm, "FormDataEvent"));
+
+    return {};
+}
+
+void FormDataEvent::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+    visitor.visit(m_form_data);
+}
+
+}

+ 38 - 0
Userland/Libraries/LibWeb/HTML/FormDataEvent.h

@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2023, Kenneth Myhra <kennethmyhra@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/DOM/Event.h>
+#include <LibWeb/XHR/FormData.h>
+
+namespace Web::HTML {
+
+struct FormDataEventInit : public DOM::EventInit {
+    JS::GCPtr<XHR::FormData> form_data {};
+};
+
+class FormDataEvent final : public DOM::Event {
+    WEB_PLATFORM_OBJECT(FormDataEvent, DOM::Event);
+
+public:
+    static WebIDL::ExceptionOr<JS::NonnullGCPtr<FormDataEvent>> construct_impl(JS::Realm&, DeprecatedString const& event_name, FormDataEventInit const& event_init);
+
+    virtual ~FormDataEvent() override;
+
+    JS::GCPtr<XHR::FormData> form_data() const { return m_form_data; }
+
+private:
+    FormDataEvent(JS::Realm&, DeprecatedString const& event_name, FormDataEventInit const& event_init);
+
+    JS::ThrowCompletionOr<void> initialize(JS::Realm&) override;
+
+    virtual void visit_edges(Cell::Visitor&) override;
+
+    JS::GCPtr<XHR::FormData> m_form_data;
+};
+
+}

+ 14 - 0
Userland/Libraries/LibWeb/HTML/FormDataEvent.idl

@@ -0,0 +1,14 @@
+#import <DOM/Event.idl>
+#import <XHR/FormData.idl>
+
+// https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-formdataevent-interface
+[Exposed=Window]
+interface FormDataEvent : Event {
+    constructor(DOMString type, FormDataEventInit eventInitDict);
+
+    readonly attribute FormData formData;
+};
+
+dictionary FormDataEventInit : EventInit {
+    required FormData formData;
+};

+ 1 - 0
Userland/Libraries/LibWeb/idl_files.cmake

@@ -71,6 +71,7 @@ libweb_js_bindings(HTML/CloseEvent)
 libweb_js_bindings(HTML/DOMParser)
 libweb_js_bindings(HTML/DOMStringMap)
 libweb_js_bindings(HTML/ErrorEvent)
+libweb_js_bindings(HTML/FormDataEvent)
 libweb_js_bindings(HTML/History)
 libweb_js_bindings(HTML/HTMLAnchorElement)
 libweb_js_bindings(HTML/HTMLAreaElement)