<!DOCTYPE html>
<html>
<body>
<div id="container">
<div id="destination">3. Drop here</div>
</div>
<div id="description"></div>
<div id="console"></div>
<script src="../../resources/js-test-pre.js"></script>
<script>

description('This tests calling setData to set a URL in a null origin document. The URL should be sanitized when reading in another document.<br>'
    + 'To manually test, drag and drop the "1. Drag this" above to "2. Drop here" and "3. Drop here".');
jsTestIsAsync = true;

if (window.internals)
    internals.settings.setCustomPasteboardDataEnabled(true);

const iframe = document.createElement('iframe');
const destination = document.getElementById('destination');
document.getElementById('container').prepend(iframe);

iframe.src = `data:text/html;charset=utf-8,<!DOCTYPE html>
<div id="source" draggable="true" data-value="http://webkit.org/b/&%23x1F914;?x=8 + 6">1. Drag this</div>
<div id="destination" onpaste="paste(event)">2. Drop here</div>
<script>

const source = document.getElementById('source');
const destination = document.getElementById('destination');
const originalURL = source.dataset.value;
parent.postMessage({kind: 'originalURL', originalURL}, '*');

function postContent(kind, dataTransfer) {
    parent.postMessage({
        kind,
        documentLabel: 'the null origin document',
        url: dataTransfer.getData('url'),
        html: dataTransfer.getData('text/html'),
        types: dataTransfer.types,
        items: Array.from(dataTransfer.items).map((item) => ({kind: item.kind, type: item.type})),
    }, '*');
}

let postDragOver;
source.addEventListener("dragstart", (event) => {
    postDragOver = false;
    event.dataTransfer.setData('url', originalURL);
    event.dataTransfer.setData('text/html', 'testing');
    postContent('dragstart', event.dataTransfer);
});
destination.addEventListener("dragover", (event) => {
    event.preventDefault();
    if (postDragOver)
        return;
    postDragOver = true;
    postContent('dragover', event.dataTransfer);
});
destination.addEventListener("drop", (event) => {
    postContent('drop', event.dataTransfer);
    destination.remove();
    top.postMessage({kind: 'secondDrop'}, '*');
});

if (window.eventSender) {
    const iframeOffset = {x: 10, y: 10};
    eventSender.mouseMoveTo(iframeOffset.x + source.offsetLeft + 5, iframeOffset.y + source.offsetTop + 5);
    eventSender.mouseDown();
    eventSender.leapForward(500);
    eventSender.mouseMoveTo(iframeOffset.x + destination.offsetLeft + 5, iframeOffset.y + destination.offsetTop + 5);
    eventSender.mouseUp();
}

</scri` + 'pt>';

onmessage = (event) => {
    const kind = event.data.kind;
    if (kind == 'originalURL') {
        originalURL = event.data.originalURL;
        return;
    }
    if (kind == 'secondDrop')
        return doSecondDrop(event.data.postContent);
    debug(`${kind} in ${event.data.documentLabel}:`);
    switch (kind) {
    case 'dragstart':
        url = event.data.url;
        shouldBeEqualToString('url', originalURL);
        html = event.data.html;
        shouldBeEqualToString('html', "testing");
        types = event.data.types;
        shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]');
        items = event.data.items;
        shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]');
        break;
    case 'dragover':
        url = event.data.url;
        shouldBeEqualToString('url', '');
        html = event.data.html;
        shouldBeEqualToString('html', '');
        types = event.data.types;
        shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]');
        items = event.data.items;
        shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]');
        break;
    case 'drop':
        url = event.data.url;
        isSameOrigin = event.data.documentLabel.includes('null');
        shouldBeEqualToString('url', isSameOrigin ? originalURL : (new URL(originalURL)).href);
        html = event.data.html;
        if (isSameOrigin)
            shouldBeEqualToString('html', 'testing');
        else
            shouldBeTrue('html.includes("testing")');
        types = event.data.types;
        shouldBeEqualToString('JSON.stringify(types)', '["text/uri-list","text/html"]');
        items = event.data.items;
        shouldBeEqualToString('JSON.stringify(items)', '[{"kind":"string","type":"text/uri-list"},{"kind":"string","type":"text/html"}]');
        if (!event.data.documentLabel.includes('null')) {
            document.getElementById('container').remove();
            finishJSTest();
        }
        break;
    }
    debug('');
}

function postContent(kind, dataTransfer) {
    window.postMessage({
        kind,
        documentLabel: 'the file URL document',
        url: dataTransfer.getData('url'),
        html: dataTransfer.getData('text/html'),
        types: dataTransfer.types,
        items: Array.from(dataTransfer.items).map((item) => ({kind: item.kind, type: item.type})),
    }, '*');
}

let postDragOver = false;
destination.addEventListener("dragover", (event) => {
    event.preventDefault();
    if (postDragOver)
        return;
    postDragOver = true;
    postContent('dragover', event.dataTransfer);
});
destination.addEventListener("drop", (event) => {
    postContent('drop', event.dataTransfer);
});

function doSecondDrop(postContent) {
    postDragOver = false;
    if (!window.eventSender)
        return;

    eventSender.leapForward(500);
    eventSender.mouseMoveTo(iframe.offsetLeft + 10, iframe.offsetTop + 10);
    eventSender.mouseDown();
    eventSender.leapForward(500);

    const destinationRect = destination.getBoundingClientRect();
    eventSender.mouseMoveTo(destination.offsetLeft + 5, destination.offsetTop + 5);
    eventSender.mouseUp();
}

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
