From 1b703629548950882063495679b9307519271b92 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 20 Aug 2024 18:44:22 -0400 Subject: [PATCH] LibWeb: Implement the DataTransfer items attribute --- Userland/Libraries/LibWeb/HTML/DataTransfer.cpp | 16 ++++++++++++++++ Userland/Libraries/LibWeb/HTML/DataTransfer.h | 6 ++++++ Userland/Libraries/LibWeb/HTML/DataTransfer.idl | 3 ++- .../LibWeb/HTML/DataTransferItemList.cpp | 15 ++++++++++++++- .../Libraries/LibWeb/HTML/DataTransferItemList.h | 6 +++++- 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp index b109537dc58..8cd25b62284 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp @@ -12,6 +12,7 @@ #include #include #include +#include #include namespace Web::HTML { @@ -44,6 +45,12 @@ void DataTransfer::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(DataTransfer); } +void DataTransfer::visit_edges(JS::Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_items); +} + void DataTransfer::set_drop_effect(String const& drop_effect) { set_drop_effect(FlyString { drop_effect }); @@ -82,6 +89,15 @@ void DataTransfer::set_effect_allowed_internal(FlyString effect_allowed) m_effect_allowed = AK::move(effect_allowed); } +// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-items +JS::NonnullGCPtr DataTransfer::items() +{ + // The items attribute must return a DataTransferItemList object associated with the DataTransfer object. + if (!m_items) + m_items = DataTransferItemList::create(realm(), *this); + return *m_items; +} + // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-types ReadonlySpan DataTransfer::types() const { diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.h b/Userland/Libraries/LibWeb/HTML/DataTransfer.h index cc71f3b2f1b..0bdeacb2cb7 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.h +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.h @@ -49,6 +49,8 @@ public: void set_effect_allowed(FlyString); void set_effect_allowed_internal(FlyString); + JS::NonnullGCPtr items(); + ReadonlySpan types() const; String get_data(String const& format) const; JS::NonnullGCPtr files() const; @@ -60,6 +62,7 @@ private: DataTransfer(JS::Realm&); virtual void initialize(JS::Realm&) override; + virtual void visit_edges(JS::Cell::Visitor&) override; void update_data_transfer_types_list(); @@ -69,6 +72,9 @@ private: // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-effectallowed FlyString m_effect_allowed { DataTransferEffect::none }; + // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-items + JS::GCPtr m_items; + // https://html.spec.whatwg.org/multipage/dnd.html#concept-datatransfer-types Vector m_types; diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.idl b/Userland/Libraries/LibWeb/HTML/DataTransfer.idl index bb96818413b..460be573368 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.idl +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.idl @@ -1,4 +1,5 @@ #import +#import // https://html.spec.whatwg.org/multipage/dnd.html#datatransfer [Exposed=Window] @@ -8,7 +9,7 @@ interface DataTransfer { attribute DOMString dropEffect; attribute DOMString effectAllowed; - [FIXME, SameObject] readonly attribute DataTransferItemList items; + [SameObject] readonly attribute DataTransferItemList items; [FIXME] undefined setDragImage(Element image, long x, long y); diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp index fb14dfef8a8..1b10c6eecbd 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp +++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp @@ -7,14 +7,21 @@ #include #include #include +#include #include namespace Web::HTML { JS_DEFINE_ALLOCATOR(DataTransferItemList); -DataTransferItemList::DataTransferItemList(JS::Realm& realm) +JS::NonnullGCPtr DataTransferItemList::create(JS::Realm& realm, JS::NonnullGCPtr data_transfer) +{ + return realm.heap().allocate(realm, realm, data_transfer); +} + +DataTransferItemList::DataTransferItemList(JS::Realm& realm, JS::NonnullGCPtr data_transfer) : PlatformObject(realm) + , m_data_transfer(data_transfer) { } @@ -26,4 +33,10 @@ void DataTransferItemList::initialize(JS::Realm& realm) WEB_SET_PROTOTYPE_FOR_INTERFACE(DataTransferItemList); } +void DataTransferItemList::visit_edges(JS::Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_data_transfer); +} + } diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h index 50e4d1ce13c..5f773de66bc 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h +++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h @@ -17,12 +17,16 @@ class DataTransferItemList : public Bindings::PlatformObject { JS_DECLARE_ALLOCATOR(DataTransferItemList); public: + static JS::NonnullGCPtr create(JS::Realm&, JS::NonnullGCPtr); virtual ~DataTransferItemList() override; private: - DataTransferItemList(JS::Realm&); + DataTransferItemList(JS::Realm&, JS::NonnullGCPtr); virtual void initialize(JS::Realm&) override; + virtual void visit_edges(JS::Cell::Visitor&) override; + + JS::NonnullGCPtr m_data_transfer; }; }