<!DOCTYPE>
<html>
<script>
function loadText(blob) {
    return new Promise((resolve, reject) => {
        const reader = new FileReader;
        reader.addEventListener("load", () => resolve(reader.result), { once: true });
        reader.addEventListener("error", reject, { once: true });
        reader.readAsText(blob);
    });
}

function loadImage(blob) {
    return new Promise((resolve, reject) => {
        const image = new Image;
        image.addEventListener("load", () => resolve(image), { once: true });
        image.addEventListener("error", reject, { once: true });
        image.src = URL.createObjectURL(blob);
    });
}

function loadDocument(blob) {
    return new Promise(async resolve => {
        resolve(new DOMParser().parseFromString(await loadText(blob), "text/html"));
    });
}

clipboardData = [];
exception = null;

async function readClipboard() {
    try {
        const items = await navigator.clipboard.read();
        for (const item of items) {
            let itemData = {};
            for (const type of item.types) {
                const blob = await item.getType(type);
                if (type === "text/html")
                    itemData[type] = await loadDocument(blob);
                else if (type === "image/png")
                    itemData[type] = await loadImage(blob);
                else
                    itemData[type] = await loadText(blob);
            }
            clipboardData.push(itemData);
        }
    } catch (e) {
        exception = e;
    } finally {
        webkit.messageHandlers.testHandler.postMessage("readClipboard");
    }
}
</script>
<body>

</body>
</html>
