mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-11 13:42:52 +00:00
Ownership of the drag data store is a bit weird. In a normal drag-and- drop operation, the DragAndDropEventHandler owns the store. When events are fired for the operation, the DataTransfer object assigned to those events are "associated" with the store. We currently represent that with an Optional<DragDataStore&>. However, it's also possible to create DataTransfer objects from scripts. Those objects create their own drag data store. This puts DataTransfer in a weird situation where it may own a store or just reference one. Rather than coming up with something like Variant<DDS, DDS&> or using MaybeOwned<DDS> here, we can get by with just making the store reference counted.
85 lines
2.8 KiB
C++
85 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2024, Tim Flynn <trflynn89@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibJS/Forward.h>
|
|
#include <LibWeb/Bindings/PlatformObject.h>
|
|
#include <LibWeb/HTML/DragDataStore.h>
|
|
|
|
namespace Web::HTML {
|
|
|
|
#define ENUMERATE_DATA_TRANSFER_EFFECTS \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(none) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(copy) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(copyLink) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(copyMove) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(link) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(linkMove) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(move) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(all) \
|
|
__ENUMERATE_DATA_TRANSFER_EFFECT(uninitialized)
|
|
|
|
namespace DataTransferEffect {
|
|
|
|
#define __ENUMERATE_DATA_TRANSFER_EFFECT(name) extern FlyString name;
|
|
ENUMERATE_DATA_TRANSFER_EFFECTS
|
|
#undef __ENUMERATE_DATA_TRANSFER_EFFECT
|
|
|
|
}
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#the-datatransfer-interface
|
|
class DataTransfer : public Bindings::PlatformObject {
|
|
WEB_PLATFORM_OBJECT(DataTransfer, Bindings::PlatformObject);
|
|
JS_DECLARE_ALLOCATOR(DataTransfer);
|
|
|
|
public:
|
|
static JS::NonnullGCPtr<DataTransfer> construct_impl(JS::Realm&);
|
|
virtual ~DataTransfer() override;
|
|
|
|
FlyString const& drop_effect() const { return m_drop_effect; }
|
|
void set_drop_effect(String const&);
|
|
void set_drop_effect(FlyString);
|
|
|
|
FlyString const& effect_allowed() const { return m_effect_allowed; }
|
|
void set_effect_allowed(String const&);
|
|
void set_effect_allowed(FlyString);
|
|
void set_effect_allowed_internal(FlyString);
|
|
|
|
JS::NonnullGCPtr<DataTransferItemList> items();
|
|
|
|
ReadonlySpan<String> types() const;
|
|
String get_data(String const& format) const;
|
|
JS::NonnullGCPtr<FileAPI::FileList> files() const;
|
|
|
|
void associate_with_drag_data_store(NonnullRefPtr<DragDataStore> drag_data_store);
|
|
void disassociate_with_drag_data_store();
|
|
|
|
private:
|
|
DataTransfer(JS::Realm&);
|
|
|
|
virtual void initialize(JS::Realm&) override;
|
|
virtual void visit_edges(JS::Cell::Visitor&) override;
|
|
|
|
void update_data_transfer_types_list();
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-dropeffect
|
|
FlyString m_drop_effect { DataTransferEffect::none };
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-effectallowed
|
|
FlyString m_effect_allowed { DataTransferEffect::none };
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer-items
|
|
JS::GCPtr<DataTransferItemList> m_items;
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#concept-datatransfer-types
|
|
Vector<String> m_types;
|
|
|
|
// https://html.spec.whatwg.org/multipage/dnd.html#the-datatransfer-interface:drag-data-store-3
|
|
RefPtr<DragDataStore> m_associated_drag_data_store;
|
|
};
|
|
|
|
}
|