Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js

Issue 2572023002: Remove special DataTransfer permissions for file: origins. (Closed)
Patch Set: Feedback from dcheng. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698