mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 12:19:54 +00:00
LibWeb: Implement the DataTransferItem kind and type attributes
This commit is contained in:
parent
ceb9e30d42
commit
001d8384e5
Notes:
github-actions[bot]
2024-08-22 12:22:21 +00:00
Author: https://github.com/trflynn89
Commit: 001d8384e5
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1158
Reviewed-by: https://github.com/shannonbooth
7 changed files with 65 additions and 6 deletions
|
@ -1,7 +1,7 @@
|
||||||
dropEffect: none
|
dropEffect: none
|
||||||
effectAllowed: none
|
effectAllowed: none
|
||||||
length=0, types=
|
length=0, types=
|
||||||
stringItem: [object DataTransferItem]
|
stringItem: kind=string, type=custom-type
|
||||||
length=1, types=custom-type
|
length=1, types=custom-type
|
||||||
fileItem: [object DataTransferItem]
|
fileItem: kind=file, type=text/plain
|
||||||
length=2, types=custom-type,Files
|
length=2, types=custom-type,Files
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
||||||
|
|
||||||
let stringItem = dataTransferItemList.add("well hello friends", "custom-type");
|
let stringItem = dataTransferItemList.add("well hello friends", "custom-type");
|
||||||
println(`stringItem: ${stringItem}`);
|
println(`stringItem: kind=${stringItem.kind}, type=${stringItem.type}`);
|
||||||
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
||||||
|
|
||||||
if (dataTransferItemList[0] !== stringItem) {
|
if (dataTransferItemList[0] !== stringItem) {
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
});
|
});
|
||||||
|
|
||||||
let fileItem = dataTransferItemList.add(file);
|
let fileItem = dataTransferItemList.add(file);
|
||||||
println(`fileItem: ${fileItem}`);
|
println(`fileItem: kind=${fileItem.kind}, type=${fileItem.type}`);
|
||||||
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
println(`length=${dataTransferItemList.length}, types=${dataTransfer.types}`);
|
||||||
|
|
||||||
if (dataTransferItemList[1] !== fileItem) {
|
if (dataTransferItemList[1] !== fileItem) {
|
||||||
|
|
|
@ -266,6 +266,14 @@ JS::NonnullGCPtr<DataTransferItem> DataTransfer::item(size_t index) const
|
||||||
return m_item_list[index];
|
return m_item_list[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DragDataStoreItem const& DataTransfer::drag_data(size_t index) const
|
||||||
|
{
|
||||||
|
VERIFY(m_associated_drag_data_store);
|
||||||
|
VERIFY(index < m_item_list.size());
|
||||||
|
|
||||||
|
return m_associated_drag_data_store->item_list()[index];
|
||||||
|
}
|
||||||
|
|
||||||
size_t DataTransfer::length() const
|
size_t DataTransfer::length() const
|
||||||
{
|
{
|
||||||
if (m_associated_drag_data_store)
|
if (m_associated_drag_data_store)
|
||||||
|
|
|
@ -62,6 +62,7 @@ public:
|
||||||
JS::NonnullGCPtr<DataTransferItem> add_item(DragDataStoreItem item);
|
JS::NonnullGCPtr<DataTransferItem> add_item(DragDataStoreItem item);
|
||||||
bool contains_item_with_type(DragDataStoreItem::Kind, String const& type) const;
|
bool contains_item_with_type(DragDataStoreItem::Kind, String const& type) const;
|
||||||
JS::NonnullGCPtr<DataTransferItem> item(size_t index) const;
|
JS::NonnullGCPtr<DataTransferItem> item(size_t index) const;
|
||||||
|
DragDataStoreItem const& drag_data(size_t index) const;
|
||||||
size_t length() const;
|
size_t length() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -40,4 +40,49 @@ void DataTransferItem::visit_edges(JS::Cell::Visitor& visitor)
|
||||||
visitor.visit(m_data_transfer);
|
visitor.visit(m_data_transfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitem-kind
|
||||||
|
String DataTransferItem::kind() const
|
||||||
|
{
|
||||||
|
// The kind attribute must return the empty string if the DataTransferItem object is in the disabled mode; otherwise
|
||||||
|
// it must return the string given in the cell from the second column of the following table from the row whose cell
|
||||||
|
// in the first column contains the drag data item kind of the item represented by the DataTransferItem object:
|
||||||
|
//
|
||||||
|
// Kind | String
|
||||||
|
// ---------------
|
||||||
|
// Text | "string"
|
||||||
|
// File | "file"
|
||||||
|
if (!mode().has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto const& item = m_data_transfer->drag_data(*m_item_index);
|
||||||
|
|
||||||
|
switch (item.kind) {
|
||||||
|
case DragDataStoreItem::Kind::Text:
|
||||||
|
return "string"_string;
|
||||||
|
case DragDataStoreItem::Kind::File:
|
||||||
|
return "file"_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
VERIFY_NOT_REACHED();
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://html.spec.whatwg.org/multipage/dnd.html#dom-datatransferitem-type
|
||||||
|
String DataTransferItem::type() const
|
||||||
|
{
|
||||||
|
// The type attribute must return the empty string if the DataTransferItem object is in the disabled mode; otherwise
|
||||||
|
// it must return the drag data item type string of the item represented by the DataTransferItem object.
|
||||||
|
if (!mode().has_value())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
auto const& item = m_data_transfer->drag_data(*m_item_index);
|
||||||
|
return item.type_string;
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<DragDataStore::Mode> DataTransferItem::mode() const
|
||||||
|
{
|
||||||
|
if (!m_item_index.has_value())
|
||||||
|
return {};
|
||||||
|
return m_data_transfer->mode();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,12 +22,17 @@ public:
|
||||||
static JS::NonnullGCPtr<DataTransferItem> create(JS::Realm&, JS::NonnullGCPtr<DataTransfer>, size_t item_index);
|
static JS::NonnullGCPtr<DataTransferItem> create(JS::Realm&, JS::NonnullGCPtr<DataTransfer>, size_t item_index);
|
||||||
virtual ~DataTransferItem() override;
|
virtual ~DataTransferItem() override;
|
||||||
|
|
||||||
|
String kind() const;
|
||||||
|
String type() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DataTransferItem(JS::Realm&, JS::NonnullGCPtr<DataTransfer>, size_t item_index);
|
DataTransferItem(JS::Realm&, JS::NonnullGCPtr<DataTransfer>, size_t item_index);
|
||||||
|
|
||||||
virtual void initialize(JS::Realm&) override;
|
virtual void initialize(JS::Realm&) override;
|
||||||
virtual void visit_edges(JS::Cell::Visitor&) override;
|
virtual void visit_edges(JS::Cell::Visitor&) override;
|
||||||
|
|
||||||
|
Optional<DragDataStore::Mode> mode() const;
|
||||||
|
|
||||||
JS::NonnullGCPtr<DataTransfer> m_data_transfer;
|
JS::NonnullGCPtr<DataTransfer> m_data_transfer;
|
||||||
Optional<size_t> m_item_index;
|
Optional<size_t> m_item_index;
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,8 +5,8 @@ callback FunctionStringCallback = undefined (DOMString data);
|
||||||
// https://html.spec.whatwg.org/multipage/dnd.html#datatransferitem
|
// https://html.spec.whatwg.org/multipage/dnd.html#datatransferitem
|
||||||
[Exposed=Window]
|
[Exposed=Window]
|
||||||
interface DataTransferItem {
|
interface DataTransferItem {
|
||||||
[FIXME] readonly attribute DOMString kind;
|
readonly attribute DOMString kind;
|
||||||
[FIXME] readonly attribute DOMString type;
|
readonly attribute DOMString type;
|
||||||
[FIXME] undefined getAsString(FunctionStringCallback? _callback);
|
[FIXME] undefined getAsString(FunctionStringCallback? _callback);
|
||||||
[FIXME] File? getAsFile();
|
[FIXME] File? getAsFile();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue