diff --git a/Tests/LibWeb/Text/expected/HTML/data-transfer.txt b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt new file mode 100644 index 00000000000..59aa6d4f348 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/data-transfer.txt @@ -0,0 +1,2 @@ +dropEffect: none +effectAllowed: none diff --git a/Tests/LibWeb/Text/input/HTML/data-transfer.html b/Tests/LibWeb/Text/input/HTML/data-transfer.html new file mode 100644 index 00000000000..af33a611f6d --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/data-transfer.html @@ -0,0 +1,8 @@ + + diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp index a569403d543..9686a57674d 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.cpp @@ -27,14 +27,31 @@ ENUMERATE_DATA_TRANSFER_EFFECTS } -JS::NonnullGCPtr DataTransfer::construct_impl(JS::Realm& realm) +JS::NonnullGCPtr DataTransfer::create(JS::Realm& realm, NonnullRefPtr drag_data_store) { - return realm.heap().allocate(realm, realm); + return realm.heap().allocate(realm, realm, move(drag_data_store)); } -DataTransfer::DataTransfer(JS::Realm& realm) - : PlatformObject(realm) +// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransfer +JS::NonnullGCPtr DataTransfer::construct_impl(JS::Realm& realm) { + // 1. Set the drag data store's item list to be an empty list. + auto drag_data_store = DragDataStore::create(); + + // 2. Set the drag data store's mode to read/write mode. + drag_data_store->set_mode(DragDataStore::Mode::ReadWrite); + + // 3. Set the dropEffect and effectAllowed to "none". + // NOTE: This is done by the default-initializers. + + return realm.heap().allocate(realm, realm, move(drag_data_store)); +} + +DataTransfer::DataTransfer(JS::Realm& realm, NonnullRefPtr drag_data_store) + : PlatformObject(realm) + , m_associated_drag_data_store(move(drag_data_store)) +{ + update_data_transfer_types_list(); } DataTransfer::~DataTransfer() = default; @@ -195,12 +212,6 @@ JS::NonnullGCPtr DataTransfer::files() const return files; } -void DataTransfer::associate_with_drag_data_store(NonnullRefPtr drag_data_store) -{ - m_associated_drag_data_store = move(drag_data_store); - update_data_transfer_types_list(); -} - void DataTransfer::disassociate_with_drag_data_store() { m_associated_drag_data_store.clear(); diff --git a/Userland/Libraries/LibWeb/HTML/DataTransfer.h b/Userland/Libraries/LibWeb/HTML/DataTransfer.h index c6d327ab6fd..eb6941df74d 100644 --- a/Userland/Libraries/LibWeb/HTML/DataTransfer.h +++ b/Userland/Libraries/LibWeb/HTML/DataTransfer.h @@ -37,6 +37,7 @@ class DataTransfer : public Bindings::PlatformObject { JS_DECLARE_ALLOCATOR(DataTransfer); public: + static JS::NonnullGCPtr create(JS::Realm&, NonnullRefPtr); static JS::NonnullGCPtr construct_impl(JS::Realm&); virtual ~DataTransfer() override; @@ -55,11 +56,10 @@ public: String get_data(String const& format) const; JS::NonnullGCPtr files() const; - void associate_with_drag_data_store(NonnullRefPtr drag_data_store); void disassociate_with_drag_data_store(); private: - DataTransfer(JS::Realm&); + DataTransfer(JS::Realm&, NonnullRefPtr); virtual void initialize(JS::Realm&) override; virtual void visit_edges(JS::Cell::Visitor&) override; diff --git a/Userland/Libraries/LibWeb/Page/DragAndDropEventHandler.cpp b/Userland/Libraries/LibWeb/Page/DragAndDropEventHandler.cpp index 8f2fa3db242..d202e6a0508 100644 --- a/Userland/Libraries/LibWeb/Page/DragAndDropEventHandler.cpp +++ b/Userland/Libraries/LibWeb/Page/DragAndDropEventHandler.cpp @@ -506,8 +506,7 @@ JS::NonnullGCPtr DragAndDropEventHandler::fire_a_drag_and_drop_ } // 6. Let dataTransfer be a newly created DataTransfer object associated with the given drag data store. - auto data_transfer = HTML::DataTransfer::construct_impl(realm); - data_transfer->associate_with_drag_data_store(*m_drag_data_store); + auto data_transfer = HTML::DataTransfer::create(realm, *m_drag_data_store); // 7. Set the effectAllowed attribute to the drag data store's drag data store allowed effects state. data_transfer->set_effect_allowed_internal(m_drag_data_store->allowed_effects_state());