diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 88f8a7cf01..cefef712fa 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/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 diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 85f5af61b2..9ea06df22e 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/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; diff --git a/Userland/Libraries/LibWeb/HTML/FormDataEvent.cpp b/Userland/Libraries/LibWeb/HTML/FormDataEvent.cpp new file mode 100644 index 0000000000..aa5fa25f11 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/FormDataEvent.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::HTML { + +WebIDL::ExceptionOr> FormDataEvent::construct_impl(JS::Realm& realm, DeprecatedString const& event_name, FormDataEventInit const& event_init) +{ + return MUST_OR_THROW_OOM(realm.heap().allocate(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 FormDataEvent::initialize(JS::Realm& realm) +{ + MUST_OR_THROW_OOM(Base::initialize(realm)); + set_prototype(&Bindings::ensure_web_prototype(realm, "FormDataEvent")); + + return {}; +} + +void FormDataEvent::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_form_data); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/FormDataEvent.h b/Userland/Libraries/LibWeb/HTML/FormDataEvent.h new file mode 100644 index 0000000000..3c2a4254e2 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/FormDataEvent.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2023, Kenneth Myhra + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::HTML { + +struct FormDataEventInit : public DOM::EventInit { + JS::GCPtr form_data {}; +}; + +class FormDataEvent final : public DOM::Event { + WEB_PLATFORM_OBJECT(FormDataEvent, DOM::Event); + +public: + static WebIDL::ExceptionOr> construct_impl(JS::Realm&, DeprecatedString const& event_name, FormDataEventInit const& event_init); + + virtual ~FormDataEvent() override; + + JS::GCPtr form_data() const { return m_form_data; } + +private: + FormDataEvent(JS::Realm&, DeprecatedString const& event_name, FormDataEventInit const& event_init); + + JS::ThrowCompletionOr initialize(JS::Realm&) override; + + virtual void visit_edges(Cell::Visitor&) override; + + JS::GCPtr m_form_data; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/FormDataEvent.idl b/Userland/Libraries/LibWeb/HTML/FormDataEvent.idl new file mode 100644 index 0000000000..3b198d7658 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/FormDataEvent.idl @@ -0,0 +1,14 @@ +#import +#import + +// 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; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index e28ec3f418..bb83d83a7b 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/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)