<html>
<head>
<title></title>

<script language="JavaScript">

const expectedLoadCount = 7;
let loadCount = 0;
function finishTestIfLastLoad()
{
    if (++loadCount == expectedLoadCount && window.testRunner)
        testRunner.notifyDone();
}

function buildFrameset()
{
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
        testRunner.dumpChildFramesAsText();
        if (testRunner.setShouldDecideNavigationPolicyAfterDelay)
            testRunner.setShouldDecideNavigationPolicyAfterDelay(true);
    }

    var outHTML="<frameset rows=\"33%, 33%, 33%\">"+
                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"topRow\">"+
                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"middleRow\">"+
                "<frame src=\"\" onload=\"finishTestIfLastLoad()\" name=\"bottomRow\">"+
                "</frameset>";

    document.open("text/html","replace");
    document.write(outHTML);
    document.close();

    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
              "</scr" + "ipt></head><body onLoad=\"clickAnchor()\"><table><tr><td>"+
              "<a href=\"resources/success.html\" target=\"topRow\" id=\"anchorLink\">Click me. If nothing loads above we have a problem.</a>"+
              "</td></tr></table></body></html>";

    frames['topRow'].document.open("text/html","replace");
    frames['topRow'].document.charset=document.charset;
    frames['topRow'].document.write(outHTML);
    frames['topRow'].document.close();

    var localImageLocation = "file:///tmp/LayoutTests/fast/dom/resources/abe.png";
    if (window.testRunner)
        localImageLocation = testRunner.pathToLocalResource(localImageLocation);

    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
              "</scr" + "ipt></head><body onLoad=\"didImageLoad()\"><table><tr><td>"+
              "<div id=\"result\"></div>"+
              "<img src=\"" + localImageLocation + "\" id=\"myImg\">"+
              "</td></tr></table></body></html>";

    frames['middleRow'].document.open("text/html","replace");
    frames['middleRow'].document.charset=document.charset;
    frames['middleRow'].document.write(outHTML);
    frames['middleRow'].document.close();

    outHTML = "<html><head><scr" + "ipt language=\"JavaScript\" src=\"resources/frame-loading-via-document-write.js\">"+
              "</scr" + "ipt></head><body onLoad=\"didImageLoad()\"><table><tr><td>"+
              "<div id=\"result\"></div>"+
              "<img src=\"/resources/abe.png\" id=\"myImg\">"+
              "</td></tr></table></body></html>";

    frames['bottomRow'].document.open("text/html","replace");
    frames['bottomRow'].document.charset=document.charset;
    frames['bottomRow'].document.write(outHTML);
    frames['bottomRow'].document.close();
}

buildFrameset();

</script>
</head>

<body>
<p>JavaScript FAILED! you should not see this.</p>
</body>

</html>

