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

Unified 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 side-by-side diff with in-line comments
Download patch
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.
jsbell 2016/12/16 21:16:16 ... and the contents of files via FileReaders.
pwnall 2016/12/17 00:44:48 Done.
+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
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
+ // 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;
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
+ else
+ fileData.data = event.target.result;
+ resolve();
+ };
+ reader.readAsText(file);
+ }).catch(e => fileData.error = e));
+ }
+
+ // 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.
+ // 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 };
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
+ });
+};

Powered by Google App Engine
This is Rietveld 408576698