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