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..200ed9298156f2dc05fc41f2ba0da4f24b42d817 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/fast/dnd/resources/copy-data-transfer.js |
@@ -0,0 +1,70 @@ |
+'use strict'; |
+ |
+// 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. The contents of files and file items are read using |
+// FileReader. |
+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 = []; |
+ |
+ const files = []; |
+ for (let file of Array.from(dataTransfer.files || [])) { |
+ 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.error = event.target.error; |
+ else |
+ fileData.data = event.target.result; |
+ resolve(); |
+ }; |
+ reader.readAsText(file); |
+ }).catch(e => fileData.error = e)); |
+ } |
+ |
+ const items = []; |
+ for (let item of Array.from(dataTransfer.items || [])) { |
+ 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, files, items, types }; |
+ }); |
+}; |