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