<html>
<head>

<script language="JavaScript">

function buildFrameset()
{
    if (window.layoutTestController)
        layoutTestController.waitUntilDone();

    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();

    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=\"file:////tmp/LayoutTests/fast/dom/resources/abe.png\" 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>

