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

<script language="JavaScript">

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

    var outHTML="<frameset rows=\"33%, 33%, 33%\">"+
                "<frame src=\"\" name=\"topRow\">"+
                "<frame src=\"\" name=\"middleRow\">"+
                "<frame src=\"\" 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=\"lastTest()\"><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>

