<!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 sending of private click measurement requests after an attribution. Also tests that cookies are not sent in those requests and cookies are not accepted in the responses.</div>
<a id="targetLink" href="http://localhost:8000/privateClickMeasurement/send-attribution-conversion-request.html?stepTwo" attributionsourceid=3 attributiondestination="http://localhost:8000">Link</a><br>
<div id="output"></div>
<script>
    const currentTimeMillis = (new Date()).getTime();
    const highEntropyBits = currentTimeMillis - (Math.floor(currentTimeMillis / 1000000) * 1000000);
    const nonce = highEntropyBits + "" + Math.floor(Math.random() * 100);

    prepareTest();

    if (window.testRunner) {
        testRunner.setPrivateClickMeasurementOverrideTimerForTesting(true);
    }

    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 appendIframe(url, onloadCallback) {
        let iframeElement = document.createElement("iframe");
        iframeElement.src = url;
        if (onloadCallback)
            iframeElement.onload = onloadCallback;
        document.body.appendChild(iframeElement);
    }

    let reportsReceived = 0;
    function appendConversionDataIframeAndFinish() {
        document.body.removeChild(document.getElementById("targetLink"));
        document.body.removeChild(document.getElementById("pixel"));

        appendIframe("http://127.0.0.1:8000/cookies/resources/echo-cookies.py");
        // Click source.
        appendIframe("http://127.0.0.1:8000/privateClickMeasurement/resources/getConversionData.py?timeout_ms=2000&recipient=ClickSource&nonce=" + nonce, function() {
            appendIframe("http://127.0.0.1:8000/cookies/resources/echo-cookies.py", function() {
                reportsReceived++;
                if (reportsReceived >= 2)
                    tearDownAndFinish();
            });
        });

        // Click destination.
        appendIframe("http://127.0.0.1:8000/privateClickMeasurement/resources/getConversionData.py?timeout_ms=2000&recipient=ClickDestination&nonce=" + nonce, function() {
            appendIframe("http://127.0.0.1:8000/cookies/resources/echo-cookies.py", function() {
                reportsReceived++;
                if (reportsReceived >= 2)
                    tearDownAndFinish();
            });
        });
    }

    function runTest() {
        if (window.testRunner) {
            if (window.location.search === "?stepTwo") {
                testRunner.setPrivateClickMeasurementAttributionReportURLsForTesting("http://127.0.0.1:8000/privateClickMeasurement/resources/conversionReport.py?recipient=ClickSource&nonce=" + nonce, "http://localhost:8000/privateClickMeasurement/resources/conversionReport.py?recipient=ClickDestination&nonce=" + nonce);
                let imageElement = document.createElement("img");
                imageElement.src = "https://127.0.0.1:8443/privateClickMeasurement/resources/redirectToConversion.py?conversionData=12&nonce=" + nonce;
                imageElement.id = "pixel";
                imageElement.onerror = function() {
                    appendConversionDataIframeAndFinish();
                };
                document.body.appendChild(imageElement);
            } else {
                document.cookie = "cookieSetAsFirstParty=1; path=/";
                activateElement("targetLink");
            }
        } else {
            document.getElementById("output").innerText = "FAIL No testRunner.";
        }
    }
</script>
</body>
</html>
