diff --git a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt index 68fbee671ac..e3dd3e966d7 100644 --- a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt +++ b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt @@ -1,4 +1,7 @@ dropEffect: none effectAllowed: none -stringItem: [object DataTransferItem], types=custom-type -fileItem: [object DataTransferItem], types=custom-type,Files +length=0, types= +stringItem: [object DataTransferItem] +length=1, types=custom-type +fileItem: [object DataTransferItem] +length=2, types=custom-type,Files diff --git a/Tests/LibWeb/Text/input/HTML/data-transfer.html b/Tests/LibWeb/Text/input/HTML/data-transfer.html index b174681d1f9..1fe866a6627 100644 --- a/Tests/LibWeb/Text/input/HTML/data-transfer.html +++ b/Tests/LibWeb/Text/input/HTML/data-transfer.html @@ -6,9 +6,11 @@ println(`effectAllowed: ${dataTransfer.effectAllowed}`); let dataTransferItemList = dataTransfer.items; + println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`); let stringItem = dataTransferItemList.add("well hello friends", "custom-type"); - println(`stringItem: ${stringItem}, types=${dataTransfer.types}`); + println(`stringItem: ${stringItem}`); + println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`); try { dataTransferItemList.add("well hello friends", "custom-type"); @@ -20,6 +22,7 @@ }); let fileItem = dataTransferItemList.add(file); - println(`fileItem: ${fileItem}, types=${dataTransfer.types}`); + println(`fileItem: ${fileItem}`); + println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`); }); diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp index 019485fd43e..40e34d802ee 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp @@ -260,6 +260,13 @@ bool DataTransfer::contains_item_with_type(DragDataStoreItem::Kind kind, String return false; } +size_t DataTransfer::length() const +{ + if (m_associated_drag_data_store) + return m_associated_drag_data_store->size(); + return 0; +} + // https://html.spec.whatwg.org/multipage/dnd.html#concept-datatransfer-types void DataTransfer::update_data_transfer_types_list() { diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.h b/Userland/Libraries/LibWeb/HTML/DataTransfer.h index 049dc2a891e..597b3936cf6 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; + size_t length() const; private: DataTransfer(JS::Realm&, NonnullRefPtr); diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp index b901194cd83..5dbdcb75b6b 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp +++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp @@ -41,6 +41,14 @@ void DataTransferItemList::visit_edges(JS::Cell::Visitor& visitor) visitor.visit(m_data_transfer); } +// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitemlist-length +WebIDL::UnsignedLong DataTransferItemList::length() const +{ + // The length attribute must return zero if the object is in the disabled mode; otherwise it must return the number + // of items in the drag data store item list. + return m_data_transfer->length(); +} + // https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitemlist-add WebIDL::ExceptionOr> DataTransferItemList::add(String const& data, String const& type) { diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h index 1574a778b1e..cad1c0a4a96 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h +++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.h @@ -9,6 +9,7 @@ #include #include #include +#include namespace Web::HTML { @@ -21,6 +22,8 @@ public: static JS::NonnullGCPtr create(JS::Realm&, JS::NonnullGCPtr); virtual ~DataTransferItemList() override; + WebIDL::UnsignedLong length() const; + WebIDL::ExceptionOr> add(String const& data, String const& type); JS::GCPtr add(JS::NonnullGCPtr); diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl index ee41a834444..435e51f1bec 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl +++ b/Userland/Libraries/LibWeb/HTML/DataTransferItemList.idl @@ -4,7 +4,7 @@ // https://html.spec.whatwg.org/multipage/dnd.html#datatransferitemlist [Exposed=Window] interface DataTransferItemList { - [FIXME] readonly attribute unsigned long length; + readonly attribute unsigned long length; [FIXME] getter DataTransferItem (unsigned long index); DataTransferItem? add(DOMString data, DOMString type); DataTransferItem? add(File data); diff --git a/Userland/Libraries/LibWeb/HTML/DragDataStore.h b/Userland/Libraries/LibWeb/HTML/DragDataStore.h index ddc6bb8a65f..2d6907ddb6a 100644 --- a/Userland/Libraries/LibWeb/HTML/DragDataStore.h +++ b/Userland/Libraries/LibWeb/HTML/DragDataStore.h @@ -48,6 +48,7 @@ public: void add_item(DragDataStoreItem item) { m_item_list.append(move(item)); } ReadonlySpan item_list() const { return m_item_list; } + size_t size() const { return m_item_list.size(); } bool has_text_item() const; Mode mode() const { return m_mode; }