diff --git a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp index eb6d0672a6..8364500ea3 100644 --- a/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp +++ b/Userland/Libraries/LibWeb/CodeGenerators/WrapperGenerator.cpp @@ -499,6 +499,8 @@ static bool is_wrappable_type(const IDL::Type& type) return true; if (type.name.ends_with("Element")) return true; + if (type.name.ends_with("Event")) + return true; if (type.name == "ImageData") return true; return false; diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp index 9616f58a7f..0d0acbacb5 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.cpp +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.cpp @@ -5,6 +5,7 @@ */ #include +#include #include #include @@ -53,4 +54,18 @@ void EventTarget::remove_from_event_listener_list(NonnullRefPtr l }); } +// https://dom.spec.whatwg.org/#dom-eventtarget-dispatchevent +ExceptionOr EventTarget::dispatch_event_binding(NonnullRefPtr event) +{ + if (event->dispatched()) + return DOM::InvalidStateError::create("The event is already being dispatched."); + + if (!event->initialized()) + return DOM::InvalidStateError::create("Cannot dispatch an uninitialized event."); + + event->set_is_trusted(false); + + return dispatch_event(event); +} + } diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.h b/Userland/Libraries/LibWeb/DOM/EventTarget.h index 5374f242a5..adbc689489 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.h +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.h @@ -11,6 +11,7 @@ #include #include #include +#include #include namespace Web::DOM { @@ -31,6 +32,8 @@ public: void remove_from_event_listener_list(NonnullRefPtr); virtual bool dispatch_event(NonnullRefPtr) = 0; + ExceptionOr dispatch_event_binding(NonnullRefPtr); + virtual JS::Object* create_wrapper(JS::GlobalObject&) = 0; Bindings::ScriptExecutionContext* script_execution_context() { return m_script_execution_context; } diff --git a/Userland/Libraries/LibWeb/DOM/EventTarget.idl b/Userland/Libraries/LibWeb/DOM/EventTarget.idl index 2dacfae0e2..eb7f45fc87 100644 --- a/Userland/Libraries/LibWeb/DOM/EventTarget.idl +++ b/Userland/Libraries/LibWeb/DOM/EventTarget.idl @@ -1,6 +1,9 @@ interface EventTarget { + // FIXME: Both of these should take in options undefined addEventListener(DOMString type, EventListener? callback); undefined removeEventListener(DOMString type, EventListener? callback); + [ImplementedAs=dispatch_event_binding] boolean dispatchEvent(Event event); + };