<!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 writeStringToClipboard(type, string) {
    try {
        const itemData = {};
        itemData[type] = string;
        await navigator.clipboard.write([new ClipboardItem(itemData)]);
    } catch (e) {
        exception = e;
    } finally {
        webkit.messageHandlers.testHandler.postMessage("wroteStringToClipboard");
    }
}

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>
