File: DataTransferItem-getAsEntry.html

package info (click to toggle)
wpewebkit 2.38.6-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 311,496 kB
  • sloc: cpp: 2,653,313; javascript: 289,013; ansic: 121,268; xml: 64,149; python: 35,534; ruby: 17,287; perl: 15,877; asm: 11,072; yacc: 2,326; sh: 1,863; lex: 1,319; java: 937; makefile: 151; pascal: 60
file content (96 lines) | stat: -rw-r--r-- 2,807 bytes parent folder | download | duplicates (14)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<!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>