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 901bdc3a7a6..428cd033e95 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 d28de606f40..28ab9687c84 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 6495c098e30..96850dc0dc8 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 00000000000..091a3ee2217 --- /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 00000000000..5073a6a8943 --- /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 00000000000..cad37aa4ab7 --- /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 39b11c6722e..464e468ba0f 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)