<!DOCTYPE html>
<html>
<style>
body {
    margin: 0;
}
#source {
    width: 300px;
    height: 300px;
}
#target {
    border: 1px blue dashed;
    font-family: monospace;
    overflow: scroll;
    white-space: nowrap;
    width: 100%;
    height: 300px;
}
</style>

<body onload=setup()>
<a id="link" href="https://www.webkit.org/"><img id="source" src="../resources/abe.png"></img></a>
<div id="target"></div>
</body>

<script>
function append(text) {
    let div = document.createElement("div");
    div.textContent = text;
    target.appendChild(div);
}

function simulateDragAndDrop() {
    let x = source.offsetLeft + source.offsetWidth / 2;
    let y = source.offsetTop + source.offsetHeight / 2;
    eventSender.mouseMoveTo(x, y);
    eventSender.mouseDown();
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(x, y + 300);
    eventSender.mouseUp();
}

async function setup() {
    target.addEventListener("dragenter", event => event.preventDefault());
    target.addEventListener("dragover", event => event.preventDefault());
    target.addEventListener("drop", event => {
        for (const type of ["URL", "url", "text/uri-list"])
            append(`${type}: "${event.dataTransfer.getData(type)}"`);
        for (const file of event.dataTransfer.files)
            append(`Found file of type ${file.type}`);
        event.preventDefault();
    });

    if (!window.testRunner || !window.eventSender || !window.internals)
        return;

    internals.settings.setCustomPasteboardDataEnabled(true);
    testRunner.dumpAsText();
    testRunner.waitUntilDone();

    await source.decode();

    append(`1. link.href = "${link.href}"`);
    simulateDragAndDrop();

    link.href = "file:///foo/bar/baz";
    append(`2. link.href = "${link.href}"`);
    simulateDragAndDrop();

    link.href = "data:text/plain;base64,SGVsbG8sIFdvcmxkIQ%3D%3D";
    append(`3. link.href = "${link.href}"`);
    simulateDragAndDrop();

    link.href = "blob:https://www.webkit.org/1ef10222-3882-48c0-875e-1b55e845a931";
    append(`4. link.href = "${link.href}"`);
    simulateDragAndDrop();

    link.href = "ftp://some/server/somewhere";
    append(`5. link.href = "${link.href}"`);
    simulateDragAndDrop();

    testRunner.notifyDone();
}
</script>
</html>