Add basic support for the version of DataTransferItemList.add that takes a File
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Oct 2017 22:28:08 +0000 (22:28 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 4 Oct 2017 22:28:08 +0000 (22:28 +0000)
commit58f41a07ea5d82c2a2bc1ff4b7074f2e428c1ce3
tree72ae6c289a81510aa1145d9ef3f26fb8a40316b4
parent12cbf7828d58b9488f1f3f6e4bf7bfb7eee7bc30
Add basic support for the version of DataTransferItemList.add that takes a File
https://bugs.webkit.org/show_bug.cgi?id=177853
<rdar://problem/34807346>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Adds very basic support for DataTransferItemList.add(File). So far, a File added in this way can only be read
back from the same DataTransfer, during dragstart or copy. This File isn't written to the platform pasteboard
yet, so even dropping or pasting in the same page will not transfer the File, but this brings us closer to
parity with other browsers. See per-method comments for details.

Tests: editing/pasteboard/data-transfer-item-list-add-file-multiple-times.html
       editing/pasteboard/data-transfer-item-list-add-file-on-copy.html
       editing/pasteboard/data-transfer-item-list-add-file-on-drag.html

* dom/DataTransfer.cpp:
(WebCore::DataTransfer::updateFileList):

Recompute the DataTransfer's FileList. This behaves the same way as destroying the FileList altogether and
building it from scratch, but we avoid that approach because the FileList object needs to maintain the same DOM
wrapper after a File-backed item is removed.

(WebCore::DataTransfer::itemListDidAddFile):

Add the newly appended DataTransferItem's File to the DataTransfer's FileList.

(WebCore::DataTransfer::types const):

Return only the "Files" type if there are file-backed items in the DataTransfer's item list.

(WebCore::DataTransfer::updatedFilesForFileList const):
(WebCore::DataTransfer::files const):
* dom/DataTransfer.h:
* dom/DataTransferItem.h:
(WebCore::DataTransferItem::file const):
* dom/DataTransferItemList.cpp:
(WebCore::DataTransferItemList::add):
(WebCore::DataTransferItemList::remove):
(WebCore::DataTransferItemList::clear):

When removing a File, only clear from the DataTransfer's pasteboard if the removed item is not a File (otherwise,
clearing a File that shares the same type as some other item in the pasteboard will erroneously clear that other
item as well). Additionally, call out to the DataTransfer to update the FileList.

* dom/DataTransferItemList.h:
(WebCore::DataTransferItemList::hasItems const):
(WebCore::DataTransferItemList::items const):

Add helpers for directly accessing an item list's items. items() should be used in conjunction with hasItems().
This route is taken to (1) avoid having to copy the vector of Files, and (2) to avoid generating m_items if it
doesn't already exist.

LayoutTests:

Add tests to verify that Files can be added to and removed from the DataTransferItemList, and also read back via
both the item list and the DataTransfer's FileList when copying and dragging. Additionally, adds a test that adds
and removes the same File to the DataTransferItemList multiple times.

* TestExpectations:
* editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt: Added.
* editing/pasteboard/data-transfer-item-list-add-file-multiple-times.html: Added.
* editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt: Added.
* editing/pasteboard/data-transfer-item-list-add-file-on-copy.html: Added.
* editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt: Added.
* editing/pasteboard/data-transfer-item-list-add-file-on-drag.html: Added.
* platform/ios-simulator-wk1/TestExpectations:
* platform/mac-wk1/TestExpectations:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222885 268f45cc-cd09-0410-ab3c-d52691b4dbfc
16 files changed:
LayoutTests/ChangeLog
LayoutTests/TestExpectations
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-multiple-times-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-multiple-times.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-copy-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-copy.html [new file with mode: 0644]
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-drag-expected.txt [new file with mode: 0644]
LayoutTests/editing/pasteboard/data-transfer-item-list-add-file-on-drag.html [new file with mode: 0644]
LayoutTests/platform/ios-simulator-wk1/TestExpectations
LayoutTests/platform/mac-wk1/TestExpectations
Source/WebCore/ChangeLog
Source/WebCore/dom/DataTransfer.cpp
Source/WebCore/dom/DataTransfer.h
Source/WebCore/dom/DataTransferItem.h
Source/WebCore/dom/DataTransferItemList.cpp
Source/WebCore/dom/DataTransferItemList.h