<!DOCTYPE html>
<html>
<body>
<script src="../../resources/js-test-pre.js"></script>
<div id="container">
<button id="copy" onclick="runTest()">1. Copy</button>
<div><br></div>
<div id="source" oncopy="doCopy(event)" contenteditable>
    <b>16th President of the United States:</b>
    <!-- secret-->
    <img src="../resources/abe.png" alt="Abraham Lincoln" onmouseover="dangerousCode()">
    <script>function dangerousCode() { } dangerousCode();</script>
</div>
<div id="destination" onpaste="doPaste(event)" contenteditable>3. Paste here</div></div>
<script>

description('This tests getData strips away secrets and dangerous code when copying inside a null origin document.');
jsTestIsAsync = true;

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

function runTest() {
    document.getElementById('source').focus();
    document.execCommand('selectAll');
    document.execCommand('copy');
}

const container = document.getElementById('container');
function doCopy(event) {
    const iframe = document.createElement('iframe');
    container.insertBefore(iframe, container.lastChild);
    iframe.src = `data:text/html;charset=utf-8,<!DOCTYPE html>
    <div id="destination" onpaste="doPaste(event)" contenteditable>2. Paste here</div>
    <script>

    function doPaste(event) {
        event.preventDefault();
        parent.postMessage({
            html: event.clipboardData.getData('text/html'),
            types: event.clipboardData.types,
            items: Array.from(event.clipboardData.items).map((item) => ({kind: item.kind, type: item.type})),
        }, '*');
    };

    document.getElementById('destination').focus();
    if (window.testRunner)
        document.execCommand('paste');

    </scri` + 'pt>';
}

onmessage = (event) => {
    typesInNullOrigin = event.data.types;
    shouldBeTrue('typesInNullOrigin.includes("text/html")');

    htmlInNullOrigin = event.data.html;
    shouldBeFalse('htmlInNullOrigin.includes("secret")');
    shouldBeFalse('htmlInNullOrigin.includes("dangerousCode")');
    shouldBeTrue('parsedTree = (new DOMParser).parseFromString(htmlInNullOrigin, "text/html"); !!parsedTree.querySelector("b");');
    shouldBeEqualToString('parsedTree.querySelector("b").textContent', '16th President of the United States:');
    shouldBeEqualToString('(new URL(parsedTree.querySelector("img").src)).protocol', 'blob:');
    shouldBeFalse('parsedTree.querySelector("img").src.includes("resources/abe.png")');

    itemsInNullOrigin = event.data.items;
    shouldBeTrue('itemsInNullOrigin.some((item) => item.kind == "string" && item.type == "text/html")');

    document.getElementById('destination').focus();
    if (window.testRunner)
        document.execCommand('paste');
}

function doPaste(event) {
    event.preventDefault();

    typesInSameDocument = event.clipboardData.types;
    shouldBeTrue('typesInNullOrigin.includes("text/html")');

    htmlInSameDocument = event.clipboardData.getData('text/html');
    shouldBeFalse('htmlInSameDocument.includes("secret")');
    shouldBeFalse('htmlInSameDocument.includes("dangerousCode")');
    shouldBeTrue('parsedTree = (new DOMParser).parseFromString(htmlInNullOrigin, "text/html"); !!parsedTree.querySelector("b");');
    shouldBeEqualToString('parsedTree.querySelector("b").textContent', '16th President of the United States:');

    // FIXME: These two test cases fail.
    shouldBeEqualToString('(new URL(parsedTree.querySelector("img").src)).protocol', 'file:');
    shouldBeTrue('parsedTree.querySelector("img").src.includes("resources/abe.png")');

    itemsInSameDocument = Array.from(event.clipboardData.items);
    shouldBeTrue('itemsInSameDocument.some((item) => item.kind == "string" && item.type == "text/html")');

    container.remove();
    finishJSTest();
}

if (window.testRunner)
    window.onload = runTest;

successfullyParsed = true;

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