From c2ef506b4abbf0797a73b3c32a440b762a5d005a Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Wed, 13 Mar 2024 15:35:39 -0400 Subject: [PATCH] LibWeb: Add an empty DataTransfer IDL implementation This does not implement any of the IDL methods, but GitHub requires the interface exists to upload files via an element. Their JS handles uploads via this element and via drag-and-drop in one function, and check if the uploaded file is `instanceof DataTransfer` to decide how to handle it. --- .../Userland/Libraries/LibWeb/HTML/BUILD.gn | 1 + .../Userland/Libraries/LibWeb/idl_files.gni | 1 + Userland/Libraries/LibWeb/CMakeLists.txt | 1 + .../Libraries/LibWeb/HTML/DataTransfer.cpp | 33 +++++++++++++++++++ Userland/Libraries/LibWeb/HTML/DataTransfer.h | 28 ++++++++++++++++ .../Libraries/LibWeb/HTML/DataTransfer.idl | 19 +++++++++++ Userland/Libraries/LibWeb/idl_files.cmake | 1 + 7 files changed, 84 insertions(+) create mode 100644 Userland/Libraries/LibWeb/HTML/DataTransfer.cpp create mode 100644 Userland/Libraries/LibWeb/HTML/DataTransfer.h create mode 100644 Userland/Libraries/LibWeb/HTML/DataTransfer.idl diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn index 901bdc3a7a..428cd033e9 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/HTML/BUILD.gn @@ -24,6 +24,7 @@ source_set("HTML") { "CloseEvent.cpp", "DOMParser.cpp", "DOMStringMap.cpp", + "DataTransfer.cpp", "Dates.cpp", "DecodedImageData.cpp", "DocumentState.cpp", diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index d28de606f4..28ab9687c8 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -113,6 +113,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/HTML/CustomElements/CustomElementRegistry.idl", "//Userland/Libraries/LibWeb/HTML/DOMParser.idl", "//Userland/Libraries/LibWeb/HTML/DOMStringMap.idl", + "//Userland/Libraries/LibWeb/HTML/DataTransfer.idl", "//Userland/Libraries/LibWeb/HTML/ErrorEvent.idl", "//Userland/Libraries/LibWeb/HTML/FormDataEvent.idl", "//Userland/Libraries/LibWeb/HTML/History.idl", diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 6495c098e3..96850dc0dc 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -260,6 +260,7 @@ set(SOURCES HTML/DocumentState.cpp HTML/DOMParser.cpp HTML/DOMStringMap.cpp + HTML/DataTransfer.cpp HTML/ErrorEvent.cpp HTML/EventHandler.cpp HTML/EventLoop/EventLoop.cpp diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp new file mode 100644 index 0000000000..091a3ee221 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2024, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::HTML { + +JS_DEFINE_ALLOCATOR(DataTransfer); + +JS::NonnullGCPtr DataTransfer::construct_impl(JS::Realm& realm) +{ + return realm.heap().allocate(realm, realm); +} + +DataTransfer::DataTransfer(JS::Realm& realm) + : PlatformObject(realm) +{ +} + +DataTransfer::~DataTransfer() = default; + +void DataTransfer::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + set_prototype(&Bindings::ensure_web_prototype(realm, "DataTransfer"_fly_string)); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.h b/Userland/Libraries/LibWeb/HTML/DataTransfer.h new file mode 100644 index 0000000000..5073a6a894 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2024, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::HTML { + +class DataTransfer : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(DataTransfer, Bindings::PlatformObject); + JS_DECLARE_ALLOCATOR(DataTransfer); + +public: + static JS::NonnullGCPtr construct_impl(JS::Realm&); + virtual ~DataTransfer() override; + +private: + DataTransfer(JS::Realm&); + + virtual void initialize(JS::Realm&) override; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.idl b/Userland/Libraries/LibWeb/HTML/DataTransfer.idl new file mode 100644 index 0000000000..cad37aa4ab --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.idl @@ -0,0 +1,19 @@ +// https://html.spec.whatwg.org/multipage/dnd.html#datatransfer +[Exposed=Window] +interface DataTransfer { + constructor(); + + // FIXME: attribute DOMString dropEffect; + // FIXME: attribute DOMString effectAllowed; + + // FIXME: [SameObject] readonly attribute DataTransferItemList items; + + // FIXME: undefined setDragImage(Element image, long x, long y); + + // old interface + // FIXME: readonly attribute FrozenArray types; + // FIXME: DOMString getData(DOMString format); + // FIXME: undefined setData(DOMString format, DOMString data); + // FIXME: undefined clearData(optional DOMString format); + // FIXME: [SameObject] readonly attribute FileList files; +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 39b11c6722..464e468ba0 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -97,6 +97,7 @@ libweb_js_bindings(HTML/CloseEvent) libweb_js_bindings(HTML/CustomElements/CustomElementRegistry) libweb_js_bindings(HTML/DOMParser) libweb_js_bindings(HTML/DOMStringMap) +libweb_js_bindings(HTML/DataTransfer) libweb_js_bindings(HTML/ErrorEvent) libweb_js_bindings(HTML/FormDataEvent) libweb_js_bindings(HTML/History)