<html>
<script>
    // Note that port "1" is tested by the initial load.
    var blockedPorts = [7, 9, 11, 13, 15, 17, 19, 20,
      21, 22, 23, 25, 37, 42, 43, 53, 77, 79, 87, 95, 101, 102,
      103, 104, 109, 110, 111, 113, 115, 117, 119, 123, 135, 139,
      143, 179, 389, 465, 512, 513, 514, 515, 526, 530, 531, 532,
      540, 548, 556, 563, 587, 601, 636, 993, 995, 2049, 3659, 4045,
      4190, 6000, 6665, 6666, 6667, 6668, 6669, 6679, 6697,

      // Port numbers that we consider to be invalid due to being out of range.
      Math.pow(2, 16) - 1, Math.pow(2, 16), Math.pow(2, 32) - 1, Math.pow(2, 32)];

    var allowedPorts = [0, 80, ""];

    var baseURL = "255.255.255.255";
    var currentPort = 0;

    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpResourceLoadCallbacks();
    }

    function nextBlockedPortTest() {
        if (!(currentPort in blockedPorts)) {
            currentPort = 0;
            nextAllowedPortTest();
            return;
        }
        var newURL = "http://" + baseURL + ":" + blockedPorts[currentPort] + "/test.jpg";
        currentPort++;
        testIMG.src = newURL;
    }

    function nextAllowedPortTest() {
        if (!(currentPort in allowedPorts)) {
            ftpTest();
            return;
        }
        var newURL = "http://" + baseURL + ":" + allowedPorts[currentPort] + "/test.jpg";
        currentPort++;
        testIMG.setAttribute("onError", "nextAllowedPortTest();");
        testIMG.src = newURL;
    }

    function ftpTest() {
        testIMG.setAttribute("onError", "ftp21Test();");
        var newURL = "ftp://" + baseURL + "/test.jpg";
        testIMG.src = newURL;
    }

    function ftp21Test() {
        testIMG.setAttribute("onError", "ftp22Test();");
        var newURL = "ftp://" + baseURL + ":21/test.jpg";
        testIMG.src = newURL;
    }

    function ftp22Test() {
        testIMG.setAttribute("onError", "finishTesting();");
        var newURL = "ftp://" + baseURL + ":22/test.jpg";
        testIMG.src = newURL;
    }

    function finishTesting() {
        if (window.testRunner) {
            testRunner.dumpAsText();
            setTimeout("testRunner.notifyDone()", 0); 
        }
    }

    function makeImage() {
        var image = document.createElement("img");
        image.onerror=nextBlockedPortTest;
        image.src="http://255.255.255.255:1/test.jpg";
        image.id="testIMG";
        document.body.appendChild(image);
    }
</script>
<body onload="makeImage()">
<p>This test attempts to change the src of an IMG tag to all blocked ports to confirm that WebKit returns the
correct error for them - blocked instead of cannot find.  It also tries the FTP ports for exemptions.  Due to the 
nature of this test, the results can only be processed automatically via DumpRenderTree
</p>
</body>
</html>
