<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>

<script language="JavaScript">

function buildFrameset()
{
    if (window.layoutTestController) {
        layoutTestController.waitUntilDone();
        layoutTestController.dumpAsText();
        layoutTestController.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.layoutTestController)
        localImageLocation = layoutTestController.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>

