diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index fdef9a367e8..6689f21e579 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -284,6 +284,7 @@ set(SOURCES HTML/DOMParser.cpp HTML/DOMStringList.cpp HTML/DOMStringMap.cpp + HTML/DragDataStore.cpp HTML/DragEvent.cpp HTML/ElementInternals.cpp HTML/EmbedderPolicy.cpp diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 6fb89025b16..50f4846b99c 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -360,6 +360,7 @@ class DocumentState; class DOMParser; class DOMStringList; class DOMStringMap; +class DragDataStore; class DragEvent; class ElementInternals; struct EmbedderPolicy; diff --git a/Userland/Libraries/LibWeb/HTML/DragDataStore.cpp b/Userland/Libraries/LibWeb/HTML/DragDataStore.cpp new file mode 100644 index 00000000000..9c1572c9e70 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/DragDataStore.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2024, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::HTML { + +DragDataStore::DragDataStore() + : m_allowed_effects_state(DataTransferEffect::uninitialized) +{ +} + +DragDataStore::~DragDataStore() = default; + +bool DragDataStore::has_text_item() const +{ + for (auto const& item : m_item_list) { + if (item.kind == DragDataStoreItem::Kind::Text && item.type_string == "text/plain"sv) + return true; + } + + return false; +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/DragDataStore.h b/Userland/Libraries/LibWeb/HTML/DragDataStore.h new file mode 100644 index 00000000000..7df8e7a75c2 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/DragDataStore.h @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2024, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +namespace Web::HTML { + +struct DragDataStoreItem { + enum class Kind { + Text, + File, + }; + + // https://html.spec.whatwg.org/multipage/dnd.html#the-drag-data-item-kind + Kind kind { Kind::Text }; + + // https://html.spec.whatwg.org/multipage/dnd.html#the-drag-data-item-type-string + String type_string; + + ByteBuffer data; + ByteString file_name; +}; + +// https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store +class DragDataStore { +public: + enum class Mode { + ReadWrite, + ReadOnly, + Protected, + }; + + DragDataStore(); + ~DragDataStore(); + + void add_item(DragDataStoreItem item) { m_item_list.append(move(item)); } + ReadonlySpan item_list() const { return m_item_list; } + bool has_text_item() const; + + Mode mode() const { return m_mode; } + void set_mode(Mode mode) { m_mode = mode; } + + FlyString allowed_effects_state() const { return m_allowed_effects_state; } + void set_allowed_effects_state(FlyString allowed_effects_state) { m_allowed_effects_state = move(allowed_effects_state); } + +private: + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-item-list + Vector m_item_list; + + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-default-feedback + String m_default_feedback; + + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-bitmap + RefPtr m_bitmap; + + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-hot-spot-coordinate + Gfx::IntPoint m_hot_spot_coordinate; + + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-mode + Mode m_mode { Mode::Protected }; + + // https://html.spec.whatwg.org/multipage/dnd.html#drag-data-store-allowed-effects-state + FlyString m_allowed_effects_state; +}; + +}