<!DOCTYPE html>
<html>
<meta name="viewport" content="width=device-width">
<head>
<style>
body {
    margin: 0;
    padding: 0;
}

h1, a, p {
    font-size: 20px;
    font-family: system-ui;
}

h1 {
    user-select: all;
    -webkit-user-select: all;
}

a {
    display: inline-block;
    text-decoration: none;
}

a:active {
    color: blue;
}

textarea {
    margin: 1em;
    width: calc(100% - 2em);
    font-size: 16px;
    font-family: monospace;
}
</style>
</head>
<body>
    <h1 id="regular">Regular text</h1>
    <h1 id="regular-url">Regular text + URL data</h1>
    <h1 id="regular-custom">Regular text + custom data</h1>
    <h1 id="url">URL data only</h1>
    <h1 id="custom">Custom data only</h1>
    <img id="image" src="sunset-in-cupertino-200px.png"></img>
    <img id="image-text" src="sunset-in-cupertino-200px.png"></img>
    <a id="link" href="https://www.apple.com/">Apple Homepage</a>
    <a id="link-custom" href="https://www.apple.com/">Apple Homepage</a>
    <textarea rows="20" readonly id="text-output"></textarea>
</body>
<script>
window.allData = {};
const textOutput = document.getElementById("text-output");

function collectDataForEvent(event, element)
{
    allData = {};
    for (let type of event.dataTransfer.types)
        allData[type] = event.dataTransfer.getData(type);
    textOutput.value = JSON.stringify(allData, null, 4);
}

const regular = document.getElementById("regular");
regular.addEventListener("dragstart", event => collectDataForEvent(event, regular));

const regularURL = document.getElementById("regular-url");
regularURL.addEventListener("dragstart", event => {
    event.dataTransfer.setData("text/uri-list", "https://www.google.com");
    collectDataForEvent(event, regularURL);
});

const regularCustom = document.getElementById("regular-custom");
regularCustom.addEventListener("dragstart", event => {
    event.dataTransfer.setData("text/foo", "Hello world");
    collectDataForEvent(event, regularCustom);
});

const url = document.getElementById("url");
url.addEventListener("dragstart", event => {
    event.dataTransfer.clearData();
    event.dataTransfer.setData("text/uri-list", "https://www.google.com");
    collectDataForEvent(event, url);
});

const custom = document.getElementById("custom");
custom.addEventListener("dragstart", event => {
    event.dataTransfer.clearData();
    event.dataTransfer.setData("text/foo", "Hello world");
    collectDataForEvent(event, custom);
});

const image = document.getElementById("image");
image.addEventListener("dragstart", event => collectDataForEvent(event, image));

const imageText = document.getElementById("image-text");
imageText.addEventListener("dragstart", event => {
    event.dataTransfer.setData("text/plain", "This is an image of Cupertino.");
    collectDataForEvent(event, imageText);
});

const link = document.getElementById("link");
link.addEventListener("dragstart", event => collectDataForEvent(event, link));

const linkCustom = document.getElementById("link-custom");
linkCustom.addEventListener("dragstart", event => {
    event.dataTransfer.setData("text/foo", "bar");
    collectDataForEvent(event, linkCustom);
});
</script>
</html>
