<html>
    <head>
        <script>
            if (window.testRunner)
                testRunner.dumpAsText();

            function log(frame, success, isWidth, size) {
              if (window.testRunner) {
                alert(frame.name + ' resized correctly = ' + (success ? 'true' : 'false'));
              } else {
                frame.document.close();
                if (success)
                    frame.document.write('<p>Success!</p>');
                else {
                    frame.document.write('<p>Resize until ');
                    frame.document.write(isWidth ? 'width:' : 'height:');
                    frame.document.write(isWidth ? frame.frameElement.width : frame.frameElement.height);
                    frame.document.write(' = ' + size + '</p>');
                }
              }
            }

            function checkProgress() {
                if (!window.testRunner)
                    checkSuccess();
            }

            function init() {
                if (window.testRunner) {
                    //Move the One/* vertical resizer ten pixels west...
                    eventSender.mouseMoveTo(90, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(100, 400);
                    eventSender.mouseUp();

                    //Move the Two/Three horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 70);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 80);
                    eventSender.mouseUp();

                    //Move the Three/Four horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 126);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 136);
                    eventSender.mouseUp();

                    //Move the Four/Five horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 275);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 285);
                    eventSender.mouseUp();

                    //Move the Five/Six horizontal resizer ten pixels south...
                    eventSender.mouseMoveTo(400, 392);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(400, 402);
                    eventSender.mouseUp();

                    //Move the Six/Seven vertical resizer 200 pixels east...
                    eventSender.mouseMoveTo(788, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(588, 400);
                    eventSender.mouseUp();

                    //Move the Seven/Eight vertical resizer 100 pixels east...
                    eventSender.mouseMoveTo(794, 400);
                    eventSender.mouseDown();
                    eventSender.mouseMoveTo(694, 400);
                    eventSender.mouseUp();

                    checkSuccess();
                } else {
                    checkProgress();
                }
            }
            function checkSuccess() {
                    log(One, One.frameElement.width == 100, true, 100)
                    log(Two, Two.frameElement.height == 80, false, 80)
                    log(Three, Three.frameElement.height == 50, false, 50)
                    log(Four, Four.frameElement.height == 143, false, 143)
                    log(Five, Five.frameElement.height == 111, false, 111)
                    log(Six, Six.frameElement.height == 192, false, 192)
                    log(Seven, Seven.frameElement.width == 100, true, 100)
                    log(Eight, Eight.frameElement.width == 100, true, 100)
            }

            window.onload = init;
        </script>
    </head>
        <frameset cols='90,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
            <frame framemargin=0 frameborder=1 name="One" framespacing=1 />
            <frameset rows='70,50,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                <frame framemargin=0 frameborder=1 name="Two" framespacing=1 />
                <frame framemargin=0 frameborder=1 name="Three" framespacing=1 />
                <frameset cols='*,0,0' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                    <frameset rows='30%,25%,*' onmousemove="checkProgress()" onmouseup="checkProgress()" onmousedown="checkProgress()">
                        <frame framemargin=0 frameborder=1 name="Four" framespacing=1 />
                        <frame framemargin=0 frameborder=1 name="Five" framespacing=1 />
                        <frame framemargin=0 frameborder=1 name="Six" framespacing=1 />
                    </frameset>
                    <frame framemargin=0 frameborder=1 name="Seven" framespacing=1 />
                    <frame framemargin=0 frameborder=1 name="Eight" framespacing=1 />
                </frameset>
            </frameset>
        </frameset>
</html>
