diff --git a/Tests/LibWeb/Text/input/HTML/data-transfer.html b/Tests/LibWeb/Text/input/HTML/data-transfer.html
index 1fe866a662..2fec8c148f 100644
--- a/Tests/LibWeb/Text/input/HTML/data-transfer.html
+++ b/Tests/LibWeb/Text/input/HTML/data-transfer.html
@@ -12,6 +12,10 @@
println(`stringItem: ${stringItem}`);
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
+ if (dataTransferItemList[0] !== stringItem) {
+ println("FAILED");
+ }
+
try {
dataTransferItemList.add("well hello friends", "custom-type");
println("FAILED");
@@ -24,5 +28,13 @@
let fileItem = dataTransferItemList.add(file);
println(`fileItem: ${fileItem}`);
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
+
+ if (dataTransferItemList[1] !== fileItem) {
+ println("FAILED");
+ }
+
+ if (dataTransferItemList[2] !== undefined) {
+ println("FAILED");
+ }
});
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp
index 40e34d802e..fdd44e77b4 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp
+++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp
@@ -260,6 +260,12 @@ bool DataTransfer::contains_item_with_type(DragDataStoreItem::Kind kind, String
return false;
}
+JS::NonnullGCPtr DataTransfer::item(size_t index) const
+{
+ VERIFY(index < m_item_list.size());
+ return m_item_list[index];
+}
+
size_t DataTransfer::length() const
{
if (m_associated_drag_data_store)
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.h b/Userland/Libraries/LibWeb/HTML/DataTransfer.h
index 597b3936cf..f613fdedd1 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransfer.h
+++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.h
@@ -61,6 +61,7 @@ public:
JS::NonnullGCPtr add_item(DragDataStoreItem item);
bool contains_item_with_type(DragDataStoreItem::Kind, String const& type) const;
+ JS::NonnullGCPtr item(size_t index) const;
size_t length() const;
private:
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp
index 5dbdcb75b6..41db4be45b 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp
@@ -9,6 +9,7 @@
#include
#include
#include
+#include
#include
#include
@@ -25,6 +26,7 @@ DataTransferItemList::DataTransferItemList(JS::Realm& realm, JS::NonnullGCPtr DataTransferItemList::add(JS::NonnullGCPtr DataTransferItemList::item_value(size_t index) const
+{
+ // To determine the value of an indexed property i of a DataTransferItemList object, the user agent must return a
+ // DataTransferItem object representing the ith item in the drag data store. The same object must be returned each
+ // time a particular item is obtained from this DataTransferItemList object. The DataTransferItem object must be
+ // associated with the same DataTransfer object as the DataTransferItemList object when it is first created.
+ if (index < m_data_transfer->length())
+ return m_data_transfer->item(index);
+ return {};
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h
index cad1c0a4a9..d1a6d39a6a 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h
@@ -33,6 +33,8 @@ private:
virtual void initialize(JS::Realm&) override;
virtual void visit_edges(JS::Cell::Visitor&) override;
+ virtual Optional item_value(size_t index) const override;
+
JS::NonnullGCPtr m_data_transfer;
};
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl
index 435e51f1be..07aff3a620 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl
@@ -5,7 +5,7 @@
[Exposed=Window]
interface DataTransferItemList {
readonly attribute unsigned long length;
- [FIXME] getter DataTransferItem (unsigned long index);
+ getter DataTransferItem (unsigned long index);
DataTransferItem? add(DOMString data, DOMString type);
DataTransferItem? add(File data);
[FIXME] undefined remove(unsigned long index);