<!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="../adClickAttribution/resources/util.js"></script>
</head>
<body onload="setTimeout(runTest, 0)">
<div id="description">Tests that ad click attribution redirects to well-known location don't trigger a conversion if they are blocked by content blockers.</div>
<a id="targetLink" href="http://localhost:8000/contentextensions/block-ad-click-attribution.html?stepTwo" adcampaignid="3" addestination="http://localhost:8000">Link</a><br>
<div id="output"></div>
<script>
    prepareTest();

    if (window.testRunner) {
        testRunner.setAdClickAttributionOverrideTimerForTesting(true);
        testRunner.setAdClickAttributionConversionURLForTesting("http://127.0.0.1:8000/adClickAttribution/resources/conversionReport.php");
    }

    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);
    }

    function appendConversionDataIframeAndFinish() {
        testRunner.dumpAdClickAttribution();
        document.body.removeChild(document.getElementById("targetLink"));
        document.body.removeChild(document.getElementById("pixel"));

        appendIframe("http://127.0.0.1:8000/adClickAttribution/resources/getConversionData.php?timeout_ms=1000", function() {
            tearDownAndFinish();
        });
    }

    function runTest() {
        if (window.testRunner) {
            if (window.location.search === "?stepTwo") {
                let imageElement = document.createElement("img");
                imageElement.src = "https://127.0.0.1:8443/adClickAttribution/resources/redirectToConversion.php?conversionData=12";
                imageElement.id = "pixel";
                imageElement.onerror = function() {
                    appendConversionDataIframeAndFinish();
                };
                document.body.appendChild(imageElement);
            } else {
                activateElement("targetLink");
            }
        } else {
            document.getElementById("output").innerText = "FAIL No testRunner.";
        }
    }
</script>
</body>
</html>
