blob: 2b1163de04e6ff260f27d91dc2aca68cd0791713 [file] [log] [blame]
<!DOCTYPE html>
<html>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
html, body {
font-family: -apple-system;
width: 100%;
height: 100%;
margin: 0;
font-size: 1em;
}
#droparea {
margin-top: 1em;
width: 100%;
height: 200px;
top: 0;
left: 0;
}
#output {
width: 100%;
height: calc(100% - 200px);
font-family: monospace;
}
</style>
<div id="droparea">
<div>To manually test, drop something into this area and observe the output below.</div>
</div>
<textarea id="output"></textarea>
<script>
function getChildEntries(entry) {
if (!entry.isDirectory)
return Promise.resolve([]);
return new Promise((resolve, reject) => {
let result = [];
let reader = entry.createReader();
let doBatch = () => {
reader.readEntries(entries => {
if (entries.length > 0) {
entries.forEach(e => result.push(e));
doBatch();
} else
resolve(result);
}, reject);
};
doBatch();
});
}
droparea.addEventListener("dragenter", event => event.preventDefault());
droparea.addEventListener("dragover", event => event.preventDefault());
droparea.addEventListener("drop", handleDrop);
async function handleDrop(event)
{
await logItemAndFileEntryInformation(event.dataTransfer.items);
event.preventDefault();
webkit.messageHandlers.testHandler.postMessage("dropped");
}
function fileFromFileSystemFileEntry(fileEntry)
{
return new Promise(resolve => fileEntry.file(file => resolve(file)));
}
async function representationForFileSystemEntry(entry)
{
let lines = [];
if (entry.isDirectory) {
lines.push(`DIR: ${entry.fullPath}`);
for (let child of await getChildEntries(entry))
lines = lines.concat(await representationForFileSystemEntry(child));
} else if (entry.isFile) {
let file = await fileFromFileSystemFileEntry(entry);
lines.push(`FILE: ${entry.fullPath} ('${file.type}', ${file.size} bytes)`);
}
return lines;
}
async function logItemAndFileEntryInformation(items)
{
output.value = "";
for (let index = 0; index < items.length; index++) {
let item = items.item(index);
output.value += `Found data transfer item (kind: '${item.kind}', type: '${item.type}')\n`;
let entry = item.webkitGetAsEntry();
if (entry)
output.value += (await representationForFileSystemEntry(entry)).sort().join("\n");
}
}
</script>
</html>