| Index: third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js
|
| diff --git a/third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js b/third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5a94b8a3cd98f465465f2dc6f489e92fad68d511
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js
|
| @@ -0,0 +1,75 @@
|
| +// Copies the information out of a DataTransfer instance. This is necessary
|
| +// because dataTransfer instances get neutered after their event handlers exit.
|
| +//
|
| +// Returns a Promise that resolves to an object which mirrors the DataTransfer's
|
| +// files, items, and types attributes, as well as the return values of the
|
| +// getData function.
|
| +const copyDataTransfer = (dataTransfer) => {
|
| + const types = dataTransfer.types.slice();
|
| + const data = {};
|
| + for (let type of types) {
|
| + try {
|
| + data[type] = dataTransfer.getData(type);
|
| + } catch(e) { // Catches SecurityError exceptions.
|
| + data[type] = e;
|
| + }
|
| + }
|
| +
|
| + const readerPromises = [];
|
| +
|
| + // DataTransfer.files returns a FileList. According to the spec, FileList only
|
| + // supports .length and .item().
|
| + const files = [];
|
| + const fileList = dataTransfer.files || [];
|
| + for (let i = 0; i < fileList.length; ++i) {
|
| + const file = fileList.item(i);
|
| + const fileData = { file: file };
|
| + files.push(fileData);
|
| +
|
| + readerPromises.push(new Promise((resolve, reject) => {
|
| + const reader = new FileReader();
|
| + reader.onloadend = (event) => {
|
| + if (event.target.error)
|
| + fileData.data = event.target.error;
|
| + else
|
| + fileData.data = event.target.result;
|
| + resolve();
|
| + };
|
| + reader.readAsText(file);
|
| + }).catch(e => fileData.error = e));
|
| + }
|
| +
|
| + // DataTransfer.items returns an DataTransferItemList, which supports .length
|
| + // and indexed access.
|
| + const items = [];
|
| + const itemList = dataTransfer.items || [];
|
| + for (let i = 0; i < dataTransfer.items.length; ++i) {
|
| + const item = dataTransfer.items[i];
|
| + const itemData = { kind: item.kind, type: item.type };
|
| + items.push(itemData);
|
| +
|
| + readerPromises.push(new Promise((resolve, reject) => {
|
| + if (itemData.kind === 'file') {
|
| + itemData.file = item.getAsFile();
|
| + if (itemData.file === null) { // DataTransfer is in protected mode.
|
| + resolve();
|
| + return;
|
| + }
|
| +
|
| + const reader = new FileReader();
|
| + reader.onloadend = (event) => {
|
| + if (event.target.error)
|
| + itemData.data = event.target.error;
|
| + else
|
| + itemData.data = event.target.result;
|
| + resolve();
|
| + };
|
| + reader.readAsText(itemData.file);
|
| + }
|
| + }).catch(e => itemData.error = e));
|
| + }
|
| +
|
| + return Promise.all(readerPromises).then(() => {
|
| + return { data: data, files: files, items: items, types: types };
|
| + });
|
| +};
|
|
|