diff --git a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.cpp b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.cpp index 150b09c3e0e..b61b231b577 100644 --- a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.cpp +++ b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.cpp @@ -27,6 +27,13 @@ PointerEvent::PointerEvent(JS::Realm& realm, FlyString const& type, PointerEvent , m_is_primary(event_init.is_primary) , m_persistent_device_id(event_init.persistent_device_id) { + m_coalesced_events.ensure_capacity(event_init.coalesced_events.size()); + for (auto const& coalesced_event : event_init.coalesced_events) + m_coalesced_events.unchecked_append(*coalesced_event); + + m_predicted_events.ensure_capacity(event_init.predicted_events.size()); + for (auto const& predicted_event : event_init.predicted_events) + m_predicted_events.unchecked_append(*predicted_event); } PointerEvent::~PointerEvent() = default; @@ -37,6 +44,13 @@ void PointerEvent::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(PointerEvent); } +void PointerEvent::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_coalesced_events); + visitor.visit(m_predicted_events); +} + JS::NonnullGCPtr PointerEvent::create(JS::Realm& realm, FlyString const& type, PointerEventInit const& event_init, double page_x, double page_y, double offset_x, double offset_y) { return realm.heap().allocate(realm, realm, type, event_init, page_x, page_y, offset_x, offset_y); diff --git a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.h b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.h index df93ff48ff2..4cfd9a51414 100644 --- a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.h +++ b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.h @@ -25,6 +25,8 @@ struct PointerEventInit : public MouseEventInit { String pointer_type; bool is_primary { false }; WebIDL::Long persistent_device_id { 0 }; + AK::Vector> coalesced_events; + AK::Vector> predicted_events; }; // https://w3c.github.io/pointerevents/#pointerevent-interface @@ -51,6 +53,8 @@ public: String const& pointer_type() const { return m_pointer_type; } bool is_primary() const { return m_is_primary; } WebIDL::Long persistent_device_id() const { return m_persistent_device_id; } + AK::ReadonlySpan> get_coalesced_events() const { return m_coalesced_events; } + AK::ReadonlySpan> get_predicted_events() const { return m_predicted_events; } // https://w3c.github.io/pointerevents/#dom-pointerevent-pressure // For hardware and platforms that do not support pressure, the value MUST be 0.5 when in the active buttons state and 0 otherwise. @@ -60,6 +64,7 @@ protected: PointerEvent(JS::Realm&, FlyString const& type, PointerEventInit const&, double page_x, double page_y, double offset_x, double offset_y); virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; private: virtual bool is_pointer_event() const final { return true; } @@ -125,6 +130,12 @@ private: // A unique identifier for the pointing device. // https://w3c.github.io/pointerevents/#dom-pointerevent-persistentdeviceid WebIDL::Long m_persistent_device_id { 0 }; + + // https://w3c.github.io/pointerevents/#dom-pointerevent-getcoalescedevents + AK::Vector> m_coalesced_events; + + // https://w3c.github.io/pointerevents/#dom-pointerevent-getpredictedevents + AK::Vector> m_predicted_events; }; } diff --git a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.idl b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.idl index e2b056182fa..bd66306a6f8 100644 --- a/Userland/Libraries/LibWeb/UIEvents/PointerEvent.idl +++ b/Userland/Libraries/LibWeb/UIEvents/PointerEvent.idl @@ -15,8 +15,8 @@ dictionary PointerEventInit : MouseEventInit { DOMString pointerType = ""; boolean isPrimary = false; long persistentDeviceId = 0; - // FIXME: sequence coalescedEvents = []; - // FIXME: sequence predictedEvents = []; + sequence coalescedEvents = []; + sequence predictedEvents = []; }; // https://w3c.github.io/pointerevents/#pointerevent-interface @@ -36,6 +36,6 @@ interface PointerEvent : MouseEvent { readonly attribute DOMString pointerType; readonly attribute boolean isPrimary; readonly attribute long persistentDeviceId; - [FIXME, SecureContext] sequence getCoalescedEvents(); - [FIXME] sequence getPredictedEvents(); + [SecureContext] sequence getCoalescedEvents(); + sequence getPredictedEvents(); };