<!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>
