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 |