<!DOCTYPE html> <!-- webkit-test-runner [ useFlexibleViewport=true ] -->
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <script src="/js-test-resources/ui-helper.js"></script>
    <script src="resources/util.js"></script>
</head>
<body onload="setTimeout(runTest, 0)">
<div id="description">Tests that both unconverted and converted attributions are cleared on website data removal.</div>
<a id="targetLink">Link</a><br>
<div id="output"></div>
<script>
    const path = "/privateClickMeasurement/clear-through-website-data-removal.html";
    const configuration = [
        {
            href: "http://localhost:8000" + path + "?stepTwo",
            attributionsourceid: 3,
            attributiondestination: "http://localhost:8000"
        },
        {
            href: "http://127.0.0.1:8000" + path + "?stepThree",
            attributionsourceid: 4,
            attributiondestination: "http://127.0.0.1:8000"
        }
    ];

    prepareTest();

    function configureLink(index) {
        let linkElement = document.getElementById("targetLink");
        linkElement.setAttribute("href", configuration[index].href);
        linkElement.setAttribute("attributionsourceid", configuration[index].attributionsourceid);
        linkElement.setAttribute("attributiondestination", configuration[index].attributiondestination);
    }

    function activateElement(elementID) {
        var element = document.getElementById(elementID);
        var centerX = element.offsetLeft + element.offsetWidth / 2;
        var centerY = element.offsetTop + element.offsetHeight / 2;
        UIHelper.activateAt(centerX, centerY).then(
            function () {
            },
            function () {
                document.getElementById("output").innerText = "FAIL Promise rejected.";
                tearDownAndFinish();
            }
        );
    }

    function runTest() {
        if (window.testRunner) {
            if (window.location.search === "") {
                // First ad click 127.0.0.1 –> localhost.
                configureLink(0);
                activateElement("targetLink");
            } else if (window.location.search === "?stepTwo") {
                // Convert the first ad click with priority 4, then do a reverse ad click.
                let imageElement = document.createElement("img");
                imageElement.src = "https://127.0.0.1:8443/privateClickMeasurement/resources/redirectToConversion.py?conversionData=12&priority=04";
                imageElement.id = "pixel";
                imageElement.onerror = function(e) {
                    // Second ad click localhost –> 127.0.0.1.
                    configureLink(1);
                    activateElement("targetLink");
                };
                document.body.appendChild(imageElement);
            } else if (window.location.search === "?stepThree") {
                testRunner.clearPrivateClickMeasurementsThroughWebsiteDataRemoval();
                testRunner.dumpPrivateClickMeasurement();
                document.body.removeChild(document.getElementById("targetLink"));
                tearDownAndFinish();
            } else {
                document.getElementById("output").innerText = "FAIL Unknown window.location.search == " + window.location.search + ".";
                tearDownAndFinish();
            }
        } else {
            document.getElementById("output").innerText = "FAIL No testRunner.";
        }
    }
</script>
</body>
</html>
