<!-- webkit-test-runner [ dumpJSConsoleLogInStdErr=true ] -->
<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>

