瀏覽代碼

LibWeb: Implement the DataTransferItemList indexed getter

Timothy Flynn 11 月之前
父節點
當前提交
ceb9e30d42

+ 12 - 0
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");
+        }
     });
 </script>

+ 6 - 0
Userland/Libraries/LibWeb/HTML/DataTransfer.cpp

@@ -260,6 +260,12 @@ bool DataTransfer::contains_item_with_type(DragDataStoreItem::Kind kind, String
     return false;
 }
 
+JS::NonnullGCPtr<DataTransferItem> 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)

+ 1 - 0
Userland/Libraries/LibWeb/HTML/DataTransfer.h

@@ -61,6 +61,7 @@ public:
 
     JS::NonnullGCPtr<DataTransferItem> add_item(DragDataStoreItem item);
     bool contains_item_with_type(DragDataStoreItem::Kind, String const& type) const;
+    JS::NonnullGCPtr<DataTransferItem> item(size_t index) const;
     size_t length() const;
 
 private:

+ 14 - 0
Userland/Libraries/LibWeb/HTML/DataTransferItemList.cpp

@@ -9,6 +9,7 @@
 #include <LibWeb/Bindings/Intrinsics.h>
 #include <LibWeb/FileAPI/File.h>
 #include <LibWeb/HTML/DataTransfer.h>
+#include <LibWeb/HTML/DataTransferItem.h>
 #include <LibWeb/HTML/DataTransferItemList.h>
 #include <LibWeb/Infra/Strings.h>
 
@@ -25,6 +26,7 @@ DataTransferItemList::DataTransferItemList(JS::Realm& realm, JS::NonnullGCPtr<Da
     : PlatformObject(realm)
     , m_data_transfer(data_transfer)
 {
+    m_legacy_platform_object_flags = LegacyPlatformObjectFlags { .supports_indexed_properties = true };
 }
 
 DataTransferItemList::~DataTransferItemList() = default;
@@ -108,4 +110,16 @@ JS::GCPtr<DataTransferItem> DataTransferItemList::add(JS::NonnullGCPtr<FileAPI::
     return item;
 }
 
+// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitemlist-item
+Optional<JS::Value> 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 {};
+}
+
 }

+ 2 - 0
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<JS::Value> item_value(size_t index) const override;
+
     JS::NonnullGCPtr<DataTransfer> m_data_transfer;
 };
 

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