diff --git a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt
index c1b8b1c671..42fbe50654 100644
--- a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt
+++ b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt
@@ -7,3 +7,4 @@ stringItemAsString: data=well hello friends
fileItem: kind=file, type=text/plain
length=2, types=custom-type,Files
fileItemAsFile: name=file.txt, type=text/plain
+fileItemAsEntry: name=file.txt, file=true, directory=false
diff --git a/Tests/LibWeb/Text/input/HTML/data-transfer.html b/Tests/LibWeb/Text/input/HTML/data-transfer.html
index 5d2379dbd7..e79ad26f9e 100644
--- a/Tests/LibWeb/Text/input/HTML/data-transfer.html
+++ b/Tests/LibWeb/Text/input/HTML/data-transfer.html
@@ -40,6 +40,9 @@
let fileItemAsFile = fileItem.getAsFile();
println(`fileItemAsFile: name=${fileItemAsFile.name}, type=${fileItemAsFile.type}`);
+ let fileItemAsEntry = fileItem.webkitGetAsEntry();
+ println(`fileItemAsEntry: name=${fileItemAsEntry.name}, file=${fileItemAsEntry.isFile}, directory=${fileItemAsEntry.isDirectory}`);
+
if (dataTransferItemList[1] !== fileItem) {
println("FAILED");
}
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItem.cpp b/Userland/Libraries/LibWeb/HTML/DataTransferItem.cpp
index 4a25b0f854..c4ea795138 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItem.cpp
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItem.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2024, Tim Flynn
+ * Copyright (c) 2024, Jamie Mansfield
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -148,4 +149,26 @@ JS::GCPtr DataTransferItem::get_as_file() const
return MUST(FileAPI::File::create(realm, { JS::make_handle(blob) }, file_name, move(options)));
}
+// https://wicg.github.io/entries-api/#dom-datatransferitem-webkitgetasentry
+JS::GCPtr DataTransferItem::webkit_get_as_entry() const
+{
+ auto& realm = this->realm();
+
+ // 1. Let store be this's DataTransfer object’s drag data store.
+
+ // 2. If store’s drag data store mode is not read/write mode or read-only mode, return null and abort these steps
+ if (mode() != DragDataStore::Mode::ReadWrite && mode() != DragDataStore::Mode::ReadOnly)
+ return nullptr;
+
+ // 3. Let item be the item in store’s drag data store item list that this represents.
+ auto const& item = m_data_transfer->drag_data(*m_item_index);
+
+ // 4. If item’s kind is not File, then return null and abort these steps.
+ if (item.kind != DragDataStoreItem::Kind::File)
+ return nullptr;
+
+ // 5. Return a new FileSystemEntry object representing the entry.
+ return EntriesAPI::FileSystemEntry::create(realm, EntriesAPI::EntryType::File, item.file_name);
+}
+
}
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItem.h b/Userland/Libraries/LibWeb/HTML/DataTransferItem.h
index ed3fb5b8ca..a536d3bfec 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItem.h
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItem.h
@@ -9,6 +9,7 @@
#include
#include
#include
+#include
#include
namespace Web::HTML {
@@ -28,6 +29,8 @@ public:
void get_as_string(JS::GCPtr) const;
JS::GCPtr get_as_file() const;
+ JS::GCPtr webkit_get_as_entry() const;
+
private:
DataTransferItem(JS::Realm&, JS::NonnullGCPtr, size_t item_index);
diff --git a/Userland/Libraries/LibWeb/HTML/DataTransferItem.idl b/Userland/Libraries/LibWeb/HTML/DataTransferItem.idl
index d483976b80..8a8031d6a6 100644
--- a/Userland/Libraries/LibWeb/HTML/DataTransferItem.idl
+++ b/Userland/Libraries/LibWeb/HTML/DataTransferItem.idl
@@ -1,3 +1,4 @@
+#import
#import
callback FunctionStringCallback = undefined (DOMString data);
@@ -9,4 +10,7 @@ interface DataTransferItem {
readonly attribute DOMString type;
undefined getAsString(FunctionStringCallback? _callback);
File? getAsFile();
+
+ // https://wicg.github.io/entries-api/#dom-datatransferitem-webkitgetasentry
+ FileSystemEntry? webkitGetAsEntry();
};