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;
};
}