From ceb9e30d422425582ac1db857ff4c786fb7e212c Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 21 Aug 2024 10:04:16 -0400 Subject: [PATCH] LibWeb: Implement the DataTransferItemList indexed getter --- Tests/LibWeb/Text/input/HTML/data-transfer.html | 12 ++++++++++++ Userland/Libraries/LibWeb/HTML/DataTransfer.cpp | 6 ++++++ Userland/Libraries/LibWeb/HTML/DataTransfer.h | 1 + .../Libraries/LibWeb/HTML/DataTransferItemList.cpp | 14 ++++++++++++++ .../Libraries/LibWeb/HTML/DataTransferItemList.h | 2 ++ .../Libraries/LibWeb/HTML/DataTransferItemList.idl | 2 +- 6 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Tests/LibWeb/Text/input/HTML/data-transfer.html b/Tests/LibWeb/Text/input/HTML/data-transfer.html index 1fe866a6627..2fec8c148fa 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 40e34d802ee..fdd44e77b40 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 597b3936cf6..f613fdedd14 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 5dbdcb75b6b..41db4be45b3 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 cad1c0a4a96..d1a6d39a6ad 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 435e51f1bec..07aff3a6206 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);