OLD | NEW |
(Empty) | |
| 1 // Copies the information out of a DataTransfer instance. This is necessary |
| 2 // because dataTransfer instances get neutered after their event handlers exit. |
| 3 // |
| 4 // Returns a Promise that resolves to an object which mirrors the DataTransfer's |
| 5 // files, items, and types attributes, as well as the return values of the |
| 6 // getData function. |
| 7 const copyDataTransfer = (dataTransfer) => { |
| 8 const types = dataTransfer.types.slice(); |
| 9 const data = {}; |
| 10 for (let type of types) { |
| 11 try { |
| 12 data[type] = dataTransfer.getData(type); |
| 13 } catch(e) { // Catches SecurityError exceptions. |
| 14 data[type] = e; |
| 15 } |
| 16 } |
| 17 |
| 18 const readerPromises = []; |
| 19 |
| 20 // DataTransfer.files returns a FileList. According to the spec, FileList only |
| 21 // supports .length and .item(). |
| 22 const files = []; |
| 23 const fileList = dataTransfer.files || []; |
| 24 for (let i = 0; i < fileList.length; ++i) { |
| 25 const file = fileList.item(i); |
| 26 const fileData = { file: file }; |
| 27 files.push(fileData); |
| 28 |
| 29 readerPromises.push(new Promise((resolve, reject) => { |
| 30 const reader = new FileReader(); |
| 31 reader.onloadend = (event) => { |
| 32 if (event.target.error) |
| 33 fileData.data = event.target.error; |
| 34 else |
| 35 fileData.data = event.target.result; |
| 36 resolve(); |
| 37 }; |
| 38 reader.readAsText(file); |
| 39 }).catch(e => fileData.error = e)); |
| 40 } |
| 41 |
| 42 // DataTransfer.items returns an DataTransferItemList, which supports .length |
| 43 // and indexed access. |
| 44 const items = []; |
| 45 const itemList = dataTransfer.items || []; |
| 46 for (let i = 0; i < dataTransfer.items.length; ++i) { |
| 47 const item = dataTransfer.items[i]; |
| 48 const itemData = { kind: item.kind, type: item.type }; |
| 49 items.push(itemData); |
| 50 |
| 51 readerPromises.push(new Promise((resolve, reject) => { |
| 52 if (itemData.kind === 'file') { |
| 53 itemData.file = item.getAsFile(); |
| 54 if (itemData.file === null) { // DataTransfer is in protected mode. |
| 55 resolve(); |
| 56 return; |
| 57 } |
| 58 |
| 59 const reader = new FileReader(); |
| 60 reader.onloadend = (event) => { |
| 61 if (event.target.error) |
| 62 itemData.data = event.target.error; |
| 63 else |
| 64 itemData.data = event.target.result; |
| 65 resolve(); |
| 66 }; |
| 67 reader.readAsText(itemData.file); |
| 68 } |
| 69 }).catch(e => itemData.error = e)); |
| 70 } |
| 71 |
| 72 return Promise.all(readerPromises).then(() => { |
| 73 return { data: data, files: files, items: items, types: types }; |
| 74 }); |
| 75 }; |
OLD | NEW |