From 169163b0023302ae3a0762d875e7b7840cfcb687 Mon Sep 17 00:00:00 2001 From: Jamie Mansfield Date: Fri, 23 Aug 2024 19:41:19 +0100 Subject: [PATCH] LibWeb/EntriesAPI: Implement FileSystemEntry --- .../BindingsGenerator/IDLGenerators.cpp | 1 + .../Libraries/LibWeb/EntriesAPI/BUILD.gn | 5 ++ .../Userland/Libraries/LibWeb/idl_files.gni | 1 + .../Text/expected/all-window-properties.txt | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../LibWeb/EntriesAPI/FileSystemEntry.cpp | 55 +++++++++++++++++++ .../LibWeb/EntriesAPI/FileSystemEntry.h | 39 +++++++++++++ .../LibWeb/EntriesAPI/FileSystemEntry.idl | 10 ++++ Userland/Libraries/LibWeb/Forward.h | 4 ++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 10 files changed, 118 insertions(+) create mode 100644 Meta/gn/secondary/Userland/Libraries/LibWeb/EntriesAPI/BUILD.gn create mode 100644 Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.cpp create mode 100644 Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.h create mode 100644 Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.idl diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 469f573ec53..e9ba8b959a9 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -4186,6 +4186,7 @@ static void generate_using_namespace_definitions(SourceGenerator& generator) using namespace Web::DOMParsing; using namespace Web::DOMURL; using namespace Web::Encoding; + using namespace Web::EntriesAPI; using namespace Web::Fetch; using namespace Web::FileAPI; using namespace Web::Geometry; diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/EntriesAPI/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/EntriesAPI/BUILD.gn new file mode 100644 index 00000000000..07d0dab85d5 --- /dev/null +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/EntriesAPI/BUILD.gn @@ -0,0 +1,5 @@ +source_set("EntriesAPI") { + configs += [ "//Userland/Libraries/LibWeb:configs" ] + deps = [ "//Userland/Libraries/LibWeb:all_generated" ] + sources = [ "FileSystemEntry.cpp" ] +} diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index 02c5347d620..1311d66401a 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -93,6 +93,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/DOMURL/DOMURL.idl", "//Userland/Libraries/LibWeb/Encoding/TextDecoder.idl", "//Userland/Libraries/LibWeb/Encoding/TextEncoder.idl", + "//Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.idl", "//Userland/Libraries/LibWeb/Fetch/Request.idl", "//Userland/Libraries/LibWeb/Fetch/Response.idl", "//Userland/Libraries/LibWeb/FileAPI/Blob.idl", diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 8ca728a4e84..21c443a3b1d 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -97,6 +97,7 @@ EventTarget File FileList FileReader +FileSystemEntry FinalizationRegistry Float32Array Float64Array diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 7c794fc9e7f..bf4a4d7b147 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -211,6 +211,7 @@ set(SOURCES Dump.cpp Encoding/TextDecoder.cpp Encoding/TextEncoder.cpp + EntriesAPI/FileSystemEntry.cpp Fetch/Body.cpp Fetch/BodyInit.cpp Fetch/Enums.cpp diff --git a/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.cpp b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.cpp new file mode 100644 index 00000000000..16ea5d2f9a6 --- /dev/null +++ b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.cpp @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include + +namespace Web::EntriesAPI { + +JS_DEFINE_ALLOCATOR(FileSystemEntry); + +JS::NonnullGCPtr FileSystemEntry::create(JS::Realm& realm, EntryType entry_type, ByteString name) +{ + return realm.heap().allocate(realm, realm, entry_type, name); +} + +FileSystemEntry::FileSystemEntry(JS::Realm& realm, EntryType entry_type, ByteString name) + : PlatformObject(realm) + , m_entry_type(entry_type) + , m_name(name) +{ +} + +void FileSystemEntry::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(FileSystemEntry); +} + +// https://wicg.github.io/entries-api/#dom-filesystementry-isfile +bool FileSystemEntry::is_file() const +{ + // The isFile getter steps are to return true if this is a file entry and false otherwise. + return m_entry_type == EntryType::File; +} + +// https://wicg.github.io/entries-api/#dom-filesystementry-isdirectory +bool FileSystemEntry::is_directory() const +{ + // The isDirectory getter steps are to return true if this is a directory entry and false otherwise. + return m_entry_type == EntryType::Directory; +} + +// https://wicg.github.io/entries-api/#dom-filesystementry-name +ByteString FileSystemEntry::name() const +{ + // The name getter steps are to return this's name. + return m_name; +} + +} diff --git a/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.h b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.h new file mode 100644 index 00000000000..d01cfa32902 --- /dev/null +++ b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.h @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2024, Jamie Mansfield + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::EntriesAPI { + +enum class EntryType { + File, + Directory, +}; + +class FileSystemEntry final : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(FileSystemEntry, Bindings::PlatformObject); + JS_DECLARE_ALLOCATOR(FileSystemEntry); + +public: + static JS::NonnullGCPtr create(JS::Realm&, EntryType entry_type, ByteString name); + virtual ~FileSystemEntry() override = default; + + bool is_file() const; + bool is_directory() const; + ByteString name() const; + +private: + FileSystemEntry(JS::Realm&, EntryType entry_type, ByteString name); + + virtual void initialize(JS::Realm&) override; + + EntryType m_entry_type; + ByteString m_name; +}; + +} diff --git a/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.idl b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.idl new file mode 100644 index 00000000000..a8e2954b5c0 --- /dev/null +++ b/Userland/Libraries/LibWeb/EntriesAPI/FileSystemEntry.idl @@ -0,0 +1,10 @@ +[Exposed=Window] +interface FileSystemEntry { + readonly attribute boolean isFile; + readonly attribute boolean isDirectory; + readonly attribute USVString name; + [FIXME] readonly attribute USVString fullPath; + [FIXME] readonly attribute FileSystem filesystem; + + [FIXME] undefined getParent(optional FileSystemEntryCallback successCallback, optional ErrorCallback errorCallback); +}; diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 9e4e14e6652..a17bf27fe86 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -297,6 +297,10 @@ class TextEncoder; struct TextEncoderEncodeIntoResult; } +namespace Web::EntriesAPI { +class FileSystemEntry; +} + namespace Web::Fetch { class BodyMixin; class Headers; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 8ee5bf58ec2..14a7d4ac587 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -78,6 +78,7 @@ libweb_js_bindings(DOMURL/DOMURL) libweb_js_bindings(DOMURL/URLSearchParams ITERABLE) libweb_js_bindings(Encoding/TextDecoder) libweb_js_bindings(Encoding/TextEncoder) +libweb_js_bindings(EntriesAPI/FileSystemEntry) libweb_js_bindings(Fetch/Headers ITERABLE) libweb_js_bindings(Fetch/Request) libweb_js_bindings(Fetch/Response)