Chromium Code Reviews| 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. | |
|
jsbell
2016/12/16 21:16:16
... and the contents of files via FileReaders.
pwnall
2016/12/17 00:44:48
Done.
| |
| 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 | |
|
jsbell
2016/12/16 21:16:16
Consider using Array.from(dataTransfer.files || []
pwnall
2016/12/17 00:44:48
Would this work cross-browser?
Array.from() wants
jsbell
2016/12/19 17:25:17
The spec has:
getter File? item(unsigned long in
pwnall
2016/12/19 21:51:19
Done.
Thank you for explaining! I'll schedule a We
| |
| 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; | |
|
jsbell
2016/12/16 21:16:16
assigning to .data rather than .error here - inten
pwnall
2016/12/17 00:44:48
Done.
Thanks for catching this!
It helped while d
| |
| 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 | |
|
jsbell
2016/12/16 21:16:16
Same as above, re: Array.from()
pwnall
2016/12/17 00:44:48
Done.
| |
| 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 }; | |
|
jsbell
2016/12/16 21:16:16
Style guide issue: can we start using simplified i
pwnall
2016/12/17 00:44:48
Done.
AFAIK , Chromium's style guide still uses t
| |
| 74 }); | |
| 75 }; | |
| OLD | NEW |