<!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 a second attribution with lower priority does not replace an older with higher priority.</div>
<a id="targetLink">Link</a><br>
<div id="output"></div>
<script>
    const path = "/privateClickMeasurement/second-attribution-converted-with-lower-priority.html";
    const configuration = [
        {
            href: "http://localhost:8000" + path + "?stepTwo",
            attributionsourceid: 3,
            attributiondestination: "http://localhost:8000"
        },
        {
            href: "http://localhost:8000" + path + "?stepFour",
            attributionsourceid: 4,
            attributiondestination: "http://localhost: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 and navigate back to 127.0.0.1.
                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) {
                    document.location.href = "http://127.0.0.1:8000" + path + "?stepThree";
                };
                document.body.appendChild(imageElement);
            } else if (window.location.search === "?stepThree") {
                // Second ad click 127.0.0.1 –> localhost.
                configureLink(1);
                activateElement("targetLink");
            } else if (window.location.search === "?stepFour") {
                // Convert the second ad click with priority 3 and finish.
                let imageElement = document.createElement("img");
                imageElement.src = "https://127.0.0.1:8443/privateClickMeasurement/resources/redirectToConversion.py?conversionData=12&priority=03";
                imageElement.id = "pixel";
                imageElement.onerror = function(e) {
                    testRunner.dumpPrivateClickMeasurement();
                    document.body.removeChild(document.getElementById("targetLink"));
                    document.body.removeChild(document.getElementById("pixel"));
                    tearDownAndFinish();
                };
                document.body.appendChild(imageElement);
            } 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>
