From 2e9aec984cc3c75f10ea3e6f50ea2ed34f4bd2b6 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 23 Aug 2024 19:41:56 +0100 Subject: [PATCH] LibWeb/HTML: Implement DataTransferItem.webkitGetAsEntry() --- .../Text/expected/HTML/data-transfer.txt | 1 + .../LibWeb/Text/input/HTML/data-transfer.html | 3 +++ .../LibWeb/HTML/DataTransferItem.cpp | 23 +++++++++++++++++++ .../Libraries/LibWeb/HTML/DataTransferItem.h | 3 +++ .../LibWeb/HTML/DataTransferItem.idl | 4 ++++ 5 files changed, 34 insertions(+) diff --git a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt index c1b8b1c671e..42fbe506549 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 5d2379dbd79..e79ad26f9e8 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 4a25b0f854b..c4ea795138d 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 ed3fb5b8ca3..a536d3bfec6 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 d483976b800..8a8031d6a61 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(); };