diff --git a/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp b/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp index c7d4a067b9..7e26b4b9e3 100644 --- a/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp +++ b/Userland/Libraries/LibWeb/Bindings/EventWrapperFactory.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include namespace Web::Bindings { @@ -31,6 +32,8 @@ EventWrapper* wrap(JS::GlobalObject& global_object, DOM::Event& event) return static_cast(wrap_impl(global_object, static_cast(event))); if (is(event)) return static_cast(wrap_impl(global_object, static_cast(event))); + if (is(event)) + return static_cast(wrap_impl(global_object, static_cast(event))); if (is(event)) return static_cast(wrap_impl(global_object, static_cast(event))); if (is(event)) diff --git a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h index 0bc087e1a2..49239fb903 100644 --- a/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h +++ b/Userland/Libraries/LibWeb/Bindings/WindowObjectHelper.h @@ -231,6 +231,8 @@ #include #include #include +#include +#include #include #include #include @@ -396,6 +398,7 @@ ADD_WINDOW_OBJECT_INTERFACE(PerformanceTiming) \ ADD_WINDOW_OBJECT_INTERFACE(ProcessingInstruction) \ ADD_WINDOW_OBJECT_INTERFACE(ProgressEvent) \ + ADD_WINDOW_OBJECT_INTERFACE(PromiseRejectionEvent) \ ADD_WINDOW_OBJECT_INTERFACE(Range) \ ADD_WINDOW_OBJECT_INTERFACE(ResizeObserver) \ ADD_WINDOW_OBJECT_INTERFACE(Screen) \ diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 214ed38de6..7bd0d6b7d3 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -468,6 +468,7 @@ libweb_js_wrapper(HTML/MessageChannel) libweb_js_wrapper(HTML/MessageEvent) libweb_js_wrapper(HTML/MessagePort) libweb_js_wrapper(HTML/PageTransitionEvent) +libweb_js_wrapper(HTML/PromiseRejectionEvent) libweb_js_wrapper(HTML/SubmitEvent) libweb_js_wrapper(HTML/WebSocket) libweb_js_wrapper(HighResolutionTime/Performance) diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 7aa1e1ba59..c545a04e2e 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -195,6 +195,7 @@ class MessageChannel; class MessageEvent; class MessagePort; class PageTransitionEvent; +class PromiseRejectionEvent; class SubmitEvent; class WebSocket; } @@ -400,6 +401,7 @@ class PerformanceTimingWrapper; class PerformanceWrapper; class ProcessingInstructionWrapper; class ProgressEventWrapper; +class PromiseRejectionEventWrapper; class ResizeObserverWrapper; class ScreenWrapper; class ScriptExecutionContext; diff --git a/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.h b/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.h new file mode 100644 index 0000000000..944c8f1b8d --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021, Linus Groh + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::HTML { + +struct PromiseRejectionEventInit : public DOM::EventInit { + JS::Handle promise; + JS::Value reason; +}; + +class PromiseRejectionEvent : public DOM::Event { +public: + using WrapperType = Bindings::PromiseRejectionEventWrapper; + + static NonnullRefPtr create(FlyString const& event_name, PromiseRejectionEventInit const& event_init = {}) + { + return adopt_ref(*new PromiseRejectionEvent(event_name, event_init)); + } + static NonnullRefPtr create_with_global_object(Bindings::WindowObject&, FlyString const& event_name, PromiseRejectionEventInit const& event_init) + { + return PromiseRejectionEvent::create(event_name, event_init); + } + + virtual ~PromiseRejectionEvent() override = default; + + // Needs to return a pointer for the generated JS bindings to work. + JS::Promise const* promise() const { return m_promise.cell(); } + JS::Value reason() const { return m_reason; } + +protected: + PromiseRejectionEvent(FlyString const& event_name, PromiseRejectionEventInit const& event_init) + : DOM::Event(event_name, event_init) + , m_promise(event_init.promise) + , m_reason(event_init.reason) + { + } + + JS::Handle m_promise; + // FIXME: Protect this from GC! Currently we have no handle for arbitrary JS::Value. + JS::Value m_reason; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.idl b/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.idl new file mode 100644 index 0000000000..44438306a4 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/PromiseRejectionEvent.idl @@ -0,0 +1,14 @@ +#import + +[Exposed=(Window,Worker)] +interface PromiseRejectionEvent : Event { + constructor(DOMString type, PromiseRejectionEventInit eventInitDict); + + readonly attribute Promise promise; + readonly attribute any reason; +}; + +dictionary PromiseRejectionEventInit : EventInit { + required Promise promise; + any reason; +};